aboutsummaryrefslogtreecommitdiffstats
path: root/net/wireless/util.c
diff options
context:
space:
mode:
authorDedy Lansky <dlansky@codeaurora.org>2018-07-29 07:59:16 -0400
committerJohannes Berg <johannes.berg@intel.com>2018-08-28 05:15:27 -0400
commit30ca1aa536211f5ac3de0173513a7a99a98a97f3 (patch)
tree5d8ae70d2e8543e6c9d639408a334cac618d041d /net/wireless/util.c
parentf404c3ecc401b3617c454c06a3d36a43a01f1aaf (diff)
cfg80211/mac80211: make ieee80211_send_layer2_update a public function
Make ieee80211_send_layer2_update() a common function so other drivers can re-use it. Signed-off-by: Dedy Lansky <dlansky@codeaurora.org> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/wireless/util.c')
-rw-r--r--net/wireless/util.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/net/wireless/util.c b/net/wireless/util.c
index e0825a019e9f..7bdcfe19b3ef 100644
--- a/net/wireless/util.c
+++ b/net/wireless/util.c
@@ -1893,3 +1893,48 @@ EXPORT_SYMBOL(rfc1042_header);
1893const unsigned char bridge_tunnel_header[] __aligned(2) = 1893const unsigned char bridge_tunnel_header[] __aligned(2) =
1894 { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8 }; 1894 { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8 };
1895EXPORT_SYMBOL(bridge_tunnel_header); 1895EXPORT_SYMBOL(bridge_tunnel_header);
1896
1897/* Layer 2 Update frame (802.2 Type 1 LLC XID Update response) */
1898struct iapp_layer2_update {
1899 u8 da[ETH_ALEN]; /* broadcast */
1900 u8 sa[ETH_ALEN]; /* STA addr */
1901 __be16 len; /* 6 */
1902 u8 dsap; /* 0 */
1903 u8 ssap; /* 0 */
1904 u8 control;
1905 u8 xid_info[3];
1906} __packed;
1907
1908void cfg80211_send_layer2_update(struct net_device *dev, const u8 *addr)
1909{
1910 struct iapp_layer2_update *msg;
1911 struct sk_buff *skb;
1912
1913 /* Send Level 2 Update Frame to update forwarding tables in layer 2
1914 * bridge devices */
1915
1916 skb = dev_alloc_skb(sizeof(*msg));
1917 if (!skb)
1918 return;
1919 msg = skb_put(skb, sizeof(*msg));
1920
1921 /* 802.2 Type 1 Logical Link Control (LLC) Exchange Identifier (XID)
1922 * Update response frame; IEEE Std 802.2-1998, 5.4.1.2.1 */
1923
1924 eth_broadcast_addr(msg->da);
1925 ether_addr_copy(msg->sa, addr);
1926 msg->len = htons(6);
1927 msg->dsap = 0;
1928 msg->ssap = 0x01; /* NULL LSAP, CR Bit: Response */
1929 msg->control = 0xaf; /* XID response lsb.1111F101.
1930 * F=0 (no poll command; unsolicited frame) */
1931 msg->xid_info[0] = 0x81; /* XID format identifier */
1932 msg->xid_info[1] = 1; /* LLC types/classes: Type 1 LLC */
1933 msg->xid_info[2] = 0; /* XID sender's receive window size (RW) */
1934
1935 skb->dev = dev;
1936 skb->protocol = eth_type_trans(skb, dev);
1937 memset(skb->cb, 0, sizeof(skb->cb));
1938 netif_rx_ni(skb);
1939}
1940EXPORT_SYMBOL(cfg80211_send_layer2_update);