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

