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

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

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

创建一种设备时,一定 会有设备的XXX_setup()初始化,大部分设备都会用ether_setup()来作初始化,再进行适当更改。下面是brcm_setup():

void brcm_setup(struct net_device *dev)     
{     
 ether_setup(dev);     
         
 dev->priv_flags  |= IFF_BRCM_TAG;     
 dev->priv_flags  &= ~IFF_XMIT_DST_RELEASE;     
 dev->tx_queue_len = 0;     
         
 dev->netdev_ops  = &brcm_netdev_ops;     
 dev->destructor  = free_netdev;     
 dev->ethtool_ops = &brcm_ethtool_ops;     
         
 memset(dev->broadcast, 0, ETH_ALEN);     
}

其中发送函数就在brcm_netdev_ops中,每层设备都会这样调用:dev->netdev_ops->ndo_start_xmit()。

static const struct net_device_ops brcm_netdev_ops = {     
    .ndo_change_mtu     = brcm_dev_change_mtu,     
    .ndo_init       = brcm_dev_init,     
    .ndo_uninit     = brcm_dev_uninit,     
    .ndo_open       = brcm_dev_open,     
    .ndo_stop       = brcm_dev_stop,     
    .ndo_start_xmit =  brcm_dev_hard_start_xmit,     
    .ndo_validate_addr  = eth_validate_addr,     
    .ndo_set_mac_address    = brcm_dev_set_mac_address,     
    .ndo_set_rx_mode    = brcm_dev_set_rx_mode,     
    .ndo_set_multicast_list = brcm_dev_set_rx_mode,     
    .ndo_change_rx_flags    = brcm_dev_change_rx_flags,     
    //.ndo_do_ioctl     = brcm_dev_ioctl,     
    .ndo_neigh_setup    = brcm_dev_neigh_setup,     
    .ndo_get_stats      = brcm_dev_get_stats,     
};

(编辑:常州站长网)

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

热点阅读