一 kernel 4.0 下ieee802154 与6lowpan的 框架
///
1)Kernel 3.0自上而下层次:
Netlink 接口 |
.mac 层的netlink |
mlme层 Ops 接口 |
Kenrel 3.0 并没有实现:ieee802154_mlme_ops的驱动;如下是一个驱动例子 fake_mlme; |
核心层网络设备驱动实例化 |
两种类型的网络设备驱动: @net_device_ops mac802154_wpan_ops; @net_device_ops mac802154_monitor_ops; |
硬件驱动ieee802154_ops |
struct ieee802154_ops { struct module *owner; int (*start)(struct ieee802154_dev *dev); void (*stop)(struct ieee802154_dev *dev); int (*xmit)(struct ieee802154_dev *dev, |
2)Kernel4 .0自上而下层次:
Netlink 接口 |
包括 :mac 层的netlink和nl802154 。 |
mlme层 Ops 接口 |
Kenrel 3.0 并没有实现:ieee802154_mlme_ops的驱动;如下是一个驱动例子 fake_mlme; |
cfg802154接口 |
以上的netlink 接口都是,通过cfg接口来完成对mac和phy的控制。 |
核心层网络设备驱动实例化 |
两种类型的网络设备驱动: iface.c@net_device_ops mac802154_wpan_ops; iface.c@net_device_ops mac802154_monitor_ops; |
硬件驱动ieee802154_ops |
由两层封装:ieee802154_local 和 ieee802154_ops: /* mac802154 device private data */ struct ieee802154_local { struct ieee802154_hw hw; const struct ieee802154_ops *ops;
….. struct ieee802154_ops { struct module *owner; int (*start)(struct ieee802154_dev *dev); void (*stop)(struct ieee802154_dev *dev); int (*xmit)(struct ieee802154_dev *dev, |
二 Netlink 接口
2.0 kernel 4.0 内核的netlink接口
两种netlink接口:
接口1).mac 层的netlink :名称:#define IEEE802154_NL_NAME "802.15.4MAC"
它由有两部分组成:
mac的netlink |
用于让用户层程序控制ieee802154设备(协调器,beacon设备)的,激活/关闭/扫描/等 |
phy的netlink |
Kernel3.0用于让用户层程序可以,增加/添加/一个ieee802.15.4设备;列出当前系统的ieee802.15.4设备, kernel4.0是用于用户层,可以增加/添加/一个虚拟的ieee802.15.4设备。 |
netlink.c@定义netlink接口:
static const struct genl_ops ieee8021154_ops[] = {
/*see nl-phy.c */
IEEE802154_DUMP(IEEE802154_LIST_PHY,ieee802154_list_phy,
ieee802154_dump_phy),
IEEE802154_OP(IEEE802154_ADD_IFACE,ieee802154_add_iface),
IEEE802154_OP(IEEE802154_DEL_IFACE,ieee802154_del_iface),
/*see nl-mac.c */
IEEE802154_OP(IEEE802154_ASSOCIATE_REQ,ieee802154_associate_req),
IEEE802154_OP(IEEE802154_ASSOCIATE_RESP,ieee802154_associate_resp),
IEEE802154_OP(IEEE802154_DISASSOCIATE_REQ,ieee802154_disassociate_req),
IEEE802154_OP(IEEE802154_SCAN_REQ,ieee802154_scan_req),
IEEE802154_OP(IEEE802154_START_REQ,ieee802154_start_req),
IEEE802154_DUMP(IEEE802154_LIST_IFACE,ieee802154_list_iface,
ieee802154_dump_iface),
IEEE802154_OP(IEEE802154_SET_MACPARAMS,ieee802154_set_macparams),
…..
nl-phy.c |
phy的netlink的接口定义; |
nl-mac.c |
mac的netlink的接口定义; |
接口2)nl802154 (基于cfg802154)接口名称是:nl802154
用于对无线设备进行配置管理。
/net/ieee802154/nl802154.c@
static const structgenl_ops nl802154_ops[] = {
{
.cmd= NL802154_CMD_GET_WPAN_PHY,
.doit= nl802154_get_wpan_phy,
.dumpit= nl802154_dump_wpan_phy,
.done= nl802154_dump_wpan_phy_done,
.policy= nl802154_policy,
/*can be retrieved by unprivileged users */
.internal_flags= NL802154_FLAG_NEED_WPAN_PHY |
NL802154_FLAG_NEED_RTNL,
},
{
.cmd= NL802154_CMD_GET_INTERFACE,
.doit= nl802154_get_interface,
.dumpit= nl802154_dump_interface,
.policy= nl802154_policy,
/*can be retrieved by unprivileged users */
.internal_flags= NL802154_FLAG_NEED_WPAN_DEV |
NL802154_FLAG_NEED_RTNL,
},
……
2.1 kernel 3.0 注册的netlink接口
两者有一个共同的family :
注册一个family
int __initieee802154_nl_init(void)
{
int rc;
rc = genl_register_family(&nl802154_family);
if (rc)
2.1.1 phy的netlink的注册:
nl-phy.c@
staticstruct genl_ops ieee802154_phy_ops[] = {
IEEE802154_DUMP(IEEE802154_LIST_PHY, ieee802154_list_phy,
ieee802154_dump_phy),
IEEE802154_OP(IEEE802154_ADD_IFACE, ieee802154_add_iface),