加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

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

发布时间:2016-09-27 06:59:09 所属栏目:Linux 来源:站长网
导读:副标题#e# 内核版本:2.6.34 接上篇《添加网络协议》。 为了用户方便查看brcm设备的工作状态,使用proc文件系统是很好的方 式。一个网络协议模块可以注册到网络空间中register_pernet_subsys(),这个函数会为子空间分配一个id号,通过id可以在网 络空间中找

如何是brcm的下层设备,如根据brcm_group_hash中的映射关系,对下层设备相关的所有brcm设备进行操作:

switch (event) {     
case NETDEV_CHANGE:     
    /* Propagate real device state to vlan devices */ 
    for (i = 0; i < BRCM_GROUP_ARRAY_LEN; i++) {     
        brcmdev = brcm_group_get_device(grp, i);
        if (!brcmdev)
            continue;
         
        netif_stacked_transfer_operstate(dev, brcmdev);
    }
    break;
         
case NETDEV_CHANGEADDR:     
    /* Adjust unicast filters on underlying device */ 
    for (i = 0; i < BRCM_GROUP_ARRAY_LEN; i++) {     
        brcmdev = brcm_group_get_device(grp, i);     
        if (!brcmdev)     
            continue;     
         
        flgs = brcmdev->flags;     
        if (!(flgs & IFF_UP))     
            continue;     
         
        brcm_sync_address(dev, brcmdev);     
    }     
    break;     
         
case NETDEV_CHANGEMTU:     
    for (i = 0; i < BRCM_GROUP_ARRAY_LEN; i++) {     
        brcmdev = brcm_group_get_device(grp, i);     
        if (!brcmdev)     
            continue;     
         
        if (brcmdev->mtu <= dev->mtu)     
            continue;     
         
        dev_set_mtu(brcmdev, dev->mtu);     
    }     
    break;     
         
case NETDEV_DOWN:     
    /* Put all VLANs for this dev in the down state too.  */ 
    for (i = 0; i < BRCM_GROUP_ARRAY_LEN; i++) {     
        brcmdev = brcm_group_get_device(grp, i);     
        if (!brcmdev)     
            continue;     
         
        flgs = brcmdev->flags;     
        if (!(flgs & IFF_UP))     
            continue;     
         
        brcm = brcm_dev_info(brcmdev);     
        dev_change_flags(brcmdev, flgs & ~IFF_UP);     
        netif_stacked_transfer_operstate(dev, brcmdev);     
    }     
    break;     
         
case NETDEV_UP:     
    /* Put all VLANs for this dev in the up state too.  */ 
    for (i = 0; i < BRCM_GROUP_ARRAY_LEN; i++) {     
        brcmdev = brcm_group_get_device(grp, i);     
        if (!brcmdev)     
            continue;     
         
        flgs = brcmdev->flags;     
        if (flgs & IFF_UP)     
            continue;     
         
        brcm = brcm_dev_info(brcmdev);     
        dev_change_flags(brcmdev, flgs | IFF_UP);     
        netif_stacked_transfer_operstate(dev, brcmdev);     
    }     
    break;     
         
case NETDEV_UNREGISTER:     
    /* Delete all BRCMs for this dev. */ 
    grp->killall = 1;     
         
    for (i = 0; i < BRCM_GROUP_ARRAY_LEN; i++) {     
        brcmdev = brcm_group_get_device(grp, i);     
        if (!brcmdev)     
            continue;     
         
        /* unregistration of last brcm destroys group, abort    
         * afterwards */ 
        if (grp->nr_ports == 1)
            i = BRCM_GROUP_ARRAY_LEN;
         
        unregister_brcm_dev(brcmdev, &list);
    }     
    unregister_netdevice_many(&list);
    break;     
}

(编辑:应用网_丽江站长网)

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

热点阅读