]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
nl80211: Add support to probe specific mesh link by injecting frames
authorPradeep Kumar Chitrapu <pradeepc@codeaurora.org>
Mon, 29 Apr 2019 18:42:57 +0000 (11:42 -0700)
committerJouni Malinen <j@w1.fi>
Tue, 28 May 2019 11:32:23 +0000 (14:32 +0300)
Add support for injecting frames to a given mesh peer, bypassing the
mpath table lookup using PROBE_MESH_LINK command. This helps to send
data frames over unexercised direct mesh path, which is not selected as
next_hop node. This can be helpful in measuring link metrics.

Signed-off-by: Pradeep Kumar Chitrapu <pradeepc@codeaurora.org>
src/drivers/driver.h
src/drivers/driver_nl80211.c

index 84b80ac2918d7284e86b0a89cc0554dcf48ebafd..6210fc2d989b5628f2f0c257a5362368f807a753 100644 (file)
@@ -3991,6 +3991,18 @@ struct wpa_driver_ops {
         */
        int (*leave_mesh)(void *priv);
 
+       /**
+        * probe_mesh_link - Inject a frame over direct mesh link to a given
+        *      peer skipping the next_hop lookup from mpath table.
+        * @priv: Private driver interface data
+        * @addr: Peer MAC address
+        * @eth: Ethernet frame to be sent
+        * @len: Ethernet frame lengtn in bytes
+        * Returns 0 on success, -1 on failure
+        */
+       int (*probe_mesh_link)(void *priv, const u8 *addr, const u8 *eth,
+                              size_t len);
+
        /**
         * do_acs - Automatically select channel
         * @priv: Private driver interface data
index e806ebc3d5854f48eb648e6df0085fa7473a7a02..ca8e0d26b7929e7eb1274ec374c346a47eafd652 100644 (file)
@@ -9698,6 +9698,36 @@ static int wpa_driver_nl80211_leave_mesh(void *priv)
        return ret;
 }
 
+
+static int nl80211_probe_mesh_link(void *priv, const u8 *addr, const u8 *eth,
+                                  size_t len)
+{
+       struct i802_bss *bss = priv;
+       struct wpa_driver_nl80211_data *drv = bss->drv;
+       struct nl_msg *msg;
+       int ret;
+
+       msg = nl80211_drv_msg(drv, 0, NL80211_CMD_PROBE_MESH_LINK);
+       if (!msg ||
+           nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) ||
+           nla_put(msg, NL80211_ATTR_FRAME, len, eth)) {
+               nlmsg_free(msg);
+               return -ENOBUFS;
+       }
+
+       ret = send_and_recv_msgs(drv, msg, NULL, NULL);
+       if (ret) {
+               wpa_printf(MSG_DEBUG, "nl80211: mesh link probe to " MACSTR
+                          " failed: ret=%d (%s)",
+                          MAC2STR(addr), ret, strerror(-ret));
+       } else {
+               wpa_printf(MSG_DEBUG, "nl80211: Mesh link to " MACSTR
+                          " probed successfully", MAC2STR(addr));
+       }
+
+       return ret;
+}
+
 #endif /* CONFIG_MESH */
 
 
@@ -11044,6 +11074,7 @@ const struct wpa_driver_ops wpa_driver_nl80211_ops = {
        .init_mesh = wpa_driver_nl80211_init_mesh,
        .join_mesh = wpa_driver_nl80211_join_mesh,
        .leave_mesh = wpa_driver_nl80211_leave_mesh,
+       .probe_mesh_link = nl80211_probe_mesh_link,
 #endif /* CONFIG_MESH */
        .br_add_ip_neigh = wpa_driver_br_add_ip_neigh,
        .br_delete_ip_neigh = wpa_driver_br_delete_ip_neigh,