网络设备驱动程序结构分析数据发送流程

网络设备驱动程序结构分析数据发送流程,第1张

从网络设备驱动的结构分析可知,Linux 网络子系统在发送数据时,会调用驱动程序提供的 hard_start_transmit( ) 函数,该函数用于启动数据包的发送。在设备初始化的时候,这个函数指针需被初始化以指向设备的 xxx_tx( )函数。

网络设备驱动完成数据包发送的流程如下。

网络设备驱动程序从上层协议传递过来的 sk_buff 参数获得数据包的有效数据和长度,将有效数据放入临时缓冲区。

对于以太网,如果有效数据的长度小于以太网冲突检测所要求数据帧的最小长度ETH_ZLEN,则给临时缓冲区的末尾填充 0。

设置硬件的寄存器,驱使网络设备进行数据发送 *** 作。

完成上述3个步骤的网络设备驱动程序的数据包发送函数模板如下所示:

int xxx_tx(struct sk_buff *skb, struct net_device *dev)

{

  int len

  char *data, shortpkt[ETH_ZLEN]

  if (xxx_send_available(···)) {     /* 发送队列未满,可以发送 */

      /* 获得有效数据指针和长度*/

      data = skb->data

      len = skb->len

      if (len <ETH_ZLEN) {

          /* 如果帧长小于以太网帧最小长度, 补0 */

          memset(shortpkt, 0, ETH_ZELN)

          memcpy(shortpkt, skb->data, skb->len)

          len = ETH_ZLEN

          data = shortpkt

      }

      dev->trans_start = jiffies  /* 记录发送时间戳 */

   

      if (avail) {   /* 设置硬件寄存器,让硬件把数据包发送出去 */

          xxx_hw_tx(data, len, dev)

      } else {

          netif_stop_queue(dev)

          ··· 

      }

  }

}

利用抓包程序,首先断掉网络,关掉所有其他连接网络的程序,例如浏览器,QQ啊什麽的。开启抓包程序,然後连接网络。打开你想要看的程序,然後等待程序发送数据。稍後就看到有数据包发送出来。然後找对应服务器,找对应的数据包。然後解析数据包。就可以看到了。但是解析数据包比较麻烦,一般数据包都会经过加密。需要解密,才可以看到数据包的明文。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8083355.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-13
下一篇2023-04-13

发表评论

登录后才能评论

评论列表(0条)

    保存