加入收藏 | 设为首页 | 会员中心 | 我要投稿 常州站长网 (https://www.0519zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux内核实践 - 如何添加网络协议[二]:实现

发布时间:2016-09-28 18:42:11 所属栏目:Linux 来源:站长网
导读:副标题#e# 内核版本:2.6.34 实现思路: 报文在网络协议栈中的流动,对于接收来讲,是 对报文的脱壳的过程,由于报文是已知的输入,只要逐个解析协议号;对于发送来讲,是各层发送函数的嵌套调用,由于没有已 知的输入,只能按事先设计好的协议进行层层构造

同时,发送函数brcm_dev_hard_start_xmit()可以完整了,同样,其中关于brcm_hdr的处理可以略过:

static netdev_tx_t brcm_dev_hard_start_xmit(struct sk_buff *skb,     
         struct net_device *dev)     
{     
 int i = skb_get_queue_mapping(skb);     
 struct netdev_queue *txq = netdev_get_tx_queue(dev, i);     
 struct brcm_ethhdr *beth = (struct brcm_ethhdr *)(skb->data);     
 unsigned int len;     
 u16 brcm_port;     
 int ret;     
         
 /* Handle non-VLAN frames if they are sent to us, for example by DHCP.    
  *    
  * NOTE: THIS ASSUMES DIX ETHERNET, SPECIFICALLY NOT SUPPORTING    
  * OTHER THINGS LIKE FDDI/TokenRing/802.3 SNAPs...    
  */ 
 if (beth->h_brcm_proto != htons(ETH_P_BRCM)){     
  //unsigned int orig_headroom = skb_headroom(skb);     
  brcm_t brcm_tag;     
  brcm_port = brcm_dev_info(dev)->brcm_port;     
  if (brcm_port == BRCM_ANY_PORT) {     
   brcm_tag.brcm_op_53242 = 0;     
   brcm_tag.brcm_tq_53242 = 0;     
   brcm_tag.brcm_te_53242 = 0;     
   brcm_tag.brcm_dst_53242 = 0;     
  }else {     
   brcm_tag.brcm_op_53242 = BRCM_SND_OP;     
   brcm_tag.brcm_tq_53242 = 0;     
   brcm_tag.brcm_te_53242 = 0;     
   brcm_tag.brcm_dst_53242 = brcm_port + 23;     
  }     
         
  skb = brcm_put_tag(skb, *(u32 *)(&brcm_tag));     
  if (!skb) {     
   txq->tx_dropped++;     
   return NETDEV_TX_OK;     
  }     
 }     
         
 skb_set_dev(skb, brcm_dev_info(dev)->real_dev);     
 len = skb->len;     
 ret = dev_queue_xmit(skb);     
         
 if (likely(ret == NET_XMIT_SUCCESS)) {     
  txq->tx_packets++;     
  txq->tx_bytes += len;     
 } else 
  txq->tx_dropped++;     
         
 return ret;     
}

注册设备

接收通过dev_add_pack(),就可以融入协议栈了,前面几篇的分析已经讲过 通过ptype_base对报文进行脱壳。现在要融入的发送,函数已经完成了,既然发送是一种嵌套的调用,并且是由dev来推过的, 那么发送函数的融入一定在设备进行注册时,作为设备的一种发送方法。

(编辑:常州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读