static netdev_tx_t virtnet_xmit(struct sk_buff *skb, struct net_device *dev) { printk("send %d packet.\n",cnt++); //对于真实的网卡,把skb里的数据通过网卡发送出去 netif_stop_queue(dev);//停止该网卡发送队列 //....................//把skb的数据写入网卡 emulator_rx_packet(skb,dev);//构造一个假包发出去 dev_kfree_skb(skb);//释放skb netif_wake_queue(dev);//数据全部发送出去后,唤醒网卡队列 dev->stats.tx_packets++; dev->stats.tx_bytes += skb->len; return NETDEV_TX_OK; }
static int virt_net_send_packet(struct sk_buff *skb, struct net_device *dev) { static int cnt = 0; printk("virt_net_send_packet cnt = %d\n", ++cnt); /* 对于真实的网卡, 把skb里的数据通过网卡发送出去 */ netif_stop_queue(dev); /* 停止该网卡的队列 */ /* ...... */ /* 把skb的数据写入网卡 */ /* 构造一个假的sk_buff,上报 */ emulator_rx_packet(skb, dev); dev_kfree_skb (skb); /* 释放skb */ netif_wake_queue(dev); /* 数据全部发送出去后,唤醒网卡的队列 */ /* 更新统计信息 */ dev->stats.tx_packets++; dev->stats.tx_bytes += skb->len; return 0; }