diff options
author | Dedy Lansky <dlansky@codeaurora.org> | 2018-07-29 07:59:16 -0400 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2018-08-28 05:15:27 -0400 |
commit | 30ca1aa536211f5ac3de0173513a7a99a98a97f3 (patch) | |
tree | 5d8ae70d2e8543e6c9d639408a334cac618d041d /net/wireless/util.c | |
parent | f404c3ecc401b3617c454c06a3d36a43a01f1aaf (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.c | 45 |
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); | |||
1893 | const unsigned char bridge_tunnel_header[] __aligned(2) = | 1893 | const unsigned char bridge_tunnel_header[] __aligned(2) = |
1894 | { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8 }; | 1894 | { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8 }; |
1895 | EXPORT_SYMBOL(bridge_tunnel_header); | 1895 | EXPORT_SYMBOL(bridge_tunnel_header); |
1896 | |||
1897 | /* Layer 2 Update frame (802.2 Type 1 LLC XID Update response) */ | ||
1898 | struct 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 | |||
1908 | void 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 | } | ||
1940 | EXPORT_SYMBOL(cfg80211_send_layer2_update); | ||