Linux内核实践 - 如何添加网络协议[二]:实现
发布时间:2016-10-08 05:05:56 所属栏目: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来推过的, 那么发送函数的融入一定在设备进行注册时,作为设备的一种发送方法。 (编辑:天津站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 老手柄真废了?Switch/PC无线手柄转接器将发售
- ruby – 什么是一个很好的开源软件包,用于在大型Rails站点上
- 怎样优雅的将Docker Registry中容器镜像迁移至Harbor
- Linux学习笔记之Python3的安装以及创建虚拟环境(CentOS)
- 一键轻松恢复iPhone或iPad丢失数据的方法
- 如何使用SELinux策略限制对私有ssh密钥的访问?
- 美图秀秀移动端用户超3亿 安卓版喜获年度十佳软件奖!
- The path "/usr/bin/gcc" is not valid path to the gcc
- 湖南卫视呼啦怎么用?呼啦怎么注册?
- linux – 在RPI上使用cec-client关闭电视