Driver/snull/snull_rx()

Last-modified: 2007-09-11 (火) 13:54:17

250 :/*
251 : * Receive a packet: retrieve, encapsulate and pass over to upper levels
252 : */

パケットの受信処理
p.532参照
パケットの受信処理は2つの方法、割り込みとpolling。
このsnull_rx()は割り込みに対応

253 :void snull_rx(struct net_device *dev, struct snull_packet *pkt)
254 :{
255 : struct sk_buff *skb;
256 : struct snull_priv *priv = netdev_priv(dev);
257 :
258 : /*
259 : * The packet has been retrieved from the transmission
260 : * medium. Build an skb around it, so upper layers can handle it
261 : */
262 : skb = dev_alloc_skb(pkt->datalen + 2);
263 : if (!skb) {
264 : if (printk_ratelimit())
265 : printk(KERN_NOTICE "snull rx: low on mem - packet dropped\n");
266 : priv->stats.rx_dropped++;
267 : goto out;
268 : }
269 : skb_reserve(skb, 2); /* align IP on 16B boundary */
270 : memcpy(skb_put(skb, pkt->datalen), pkt->data, pkt->datalen);
271 :
272 : /* Write metadata, and then pass to the receive level */
273 : skb->dev = dev;
274 : skb->protocol = eth_type_trans(skb, dev);
275 : skb->ip_summed = CHECKSUM_UNNECESSARY; /* don't check it */
276 : priv->stats.rx_packets++;
277 : priv->stats.rx_bytes += pkt->datalen;
278 : netif_rx(skb);
279 : out:
280 : return;
281 :}