Linux内核实践 - 如何添加网络协议[二]:实现
发布时间:2016-10-08 04:50:34 所属栏目: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来推过的, 那么发送函数的融入一定在设备进行注册时,作为设备的一种发送方法。 (编辑:淮北站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐
热点阅读