Linux内核实践 - 如何添加网络协议[三]:实现
发布时间:2016-10-09 09:09:10 所属栏目: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; } (编辑:淮北站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |