From be9e926c6ab106dc2475f61cf2a96f85ca25e6dd Mon Sep 17 00:00:00 2001 From: James Prestwood Date: Wed, 26 Jun 2019 15:15:53 -0700 Subject: [PATCH] nl80211util: move CMD_FRAME builder into nl80211util This will be needed outside of netdev --- src/netdev.c | 41 ++++++----------------------------------- src/nl80211util.c | 32 ++++++++++++++++++++++++++++++++ src/nl80211util.h | 7 +++++++ 3 files changed, 45 insertions(+), 35 deletions(-) diff --git a/src/netdev.c b/src/netdev.c index 79032cf3..3291592f 100644 --- a/src/netdev.c +++ b/src/netdev.c @@ -2655,37 +2655,6 @@ int netdev_leave_adhoc(struct netdev *netdev, netdev_command_cb_t cb, return 0; } -static struct l_genl_msg *netdev_build_cmd_frame(struct netdev *netdev, - const uint8_t *to, - uint32_t freq, - struct iovec *iov, - size_t iov_len) -{ - struct l_genl_msg *msg; - struct iovec iovs[iov_len + 1]; - const uint16_t frame_type = 0x00d0; - uint8_t action_frame[24]; - - memset(action_frame, 0, 24); - - l_put_le16(frame_type, action_frame + 0); - memcpy(action_frame + 4, to, 6); - memcpy(action_frame + 10, netdev->addr, 6); - memcpy(action_frame + 16, to, 6); - - iovs[0].iov_base = action_frame; - iovs[0].iov_len = sizeof(action_frame); - memcpy(iovs + 1, iov, sizeof(*iov) * iov_len); - - msg = l_genl_msg_new_sized(NL80211_CMD_FRAME, 128 + 512); - - l_genl_msg_append_attr(msg, NL80211_ATTR_IFINDEX, 4, &netdev->index); - l_genl_msg_append_attr(msg, NL80211_ATTR_WIPHY_FREQ, 4, &freq); - l_genl_msg_append_attrv(msg, NL80211_ATTR_FRAME, iovs, iov_len + 1); - - return msg; -} - static uint32_t netdev_send_action_framev(struct netdev *netdev, const uint8_t *to, struct iovec *iov, size_t iov_len, @@ -2693,8 +2662,10 @@ static uint32_t netdev_send_action_framev(struct netdev *netdev, l_genl_msg_func_t callback) { uint32_t id; - struct l_genl_msg *msg = netdev_build_cmd_frame(netdev, to, freq, - iov, iov_len); + struct l_genl_msg *msg = nl80211_build_cmd_frame(netdev->index, + netdev->addr, + to, freq, + iov, iov_len); id = l_genl_family_send(nl80211, msg, callback, netdev, NULL); @@ -2947,8 +2918,8 @@ uint32_t netdev_anqp_request(struct netdev *netdev, struct scan_bss *bss, iov[1].iov_base = (void *)anqp; iov[1].iov_len = len; - msg = netdev_build_cmd_frame(netdev, bss->addr, bss->frequency, - iov, 2); + msg = nl80211_build_cmd_frame(netdev->index, netdev->addr, bss->addr, + bss->frequency, iov, 2); l_genl_msg_append_attr(msg, NL80211_ATTR_OFFCHANNEL_TX_OK, 0, ""); l_genl_msg_append_attr(msg, NL80211_ATTR_DURATION, 4, &duration); diff --git a/src/nl80211util.c b/src/nl80211util.c index a9c3914a..fa7a591c 100644 --- a/src/nl80211util.c +++ b/src/nl80211util.c @@ -194,3 +194,35 @@ const void *nl80211_parse_get_key_seq(struct l_genl_msg *msg) return data; } + +struct l_genl_msg *nl80211_build_cmd_frame(uint32_t ifindex, + const uint8_t *addr, + const uint8_t *to, + uint32_t freq, + struct iovec *iov, + size_t iov_len) +{ + struct l_genl_msg *msg; + struct iovec iovs[iov_len + 1]; + const uint16_t frame_type = 0x00d0; + uint8_t action_frame[24]; + + memset(action_frame, 0, 24); + + l_put_le16(frame_type, action_frame + 0); + memcpy(action_frame + 4, to, 6); + memcpy(action_frame + 10, addr, 6); + memcpy(action_frame + 16, to, 6); + + iovs[0].iov_base = action_frame; + iovs[0].iov_len = sizeof(action_frame); + memcpy(iovs + 1, iov, sizeof(*iov) * iov_len); + + msg = l_genl_msg_new_sized(NL80211_CMD_FRAME, 128 + 512); + + l_genl_msg_append_attr(msg, NL80211_ATTR_IFINDEX, 4, &ifindex); + l_genl_msg_append_attr(msg, NL80211_ATTR_WIPHY_FREQ, 4, &freq); + l_genl_msg_append_attrv(msg, NL80211_ATTR_FRAME, iovs, iov_len + 1); + + return msg; +} diff --git a/src/nl80211util.h b/src/nl80211util.h index 41188c1a..c3e534cb 100644 --- a/src/nl80211util.h +++ b/src/nl80211util.h @@ -42,3 +42,10 @@ struct l_genl_msg *nl80211_build_set_key(uint32_t ifindex, uint8_t key_index); struct l_genl_msg *nl80211_build_get_key(uint32_t ifindex, uint8_t key_index); const void *nl80211_parse_get_key_seq(struct l_genl_msg *msg); + +struct l_genl_msg *nl80211_build_cmd_frame(uint32_t ifindex, + const uint8_t *addr, + const uint8_t *to, + uint32_t freq, + struct iovec *iov, + size_t iov_len);