Commit 61ad5394 authored by Javier Cardona's avatar Javier Cardona Committed by John W. Linville

mac80211: Remove unused third address from mesh address extension header.

The Mesh Control header only includes 0, 1 or 2 addresses. If there is
one address, it should be interpreted as Address 4.  If there are 2,
they are interpreted as Addresses 5 and 6 (Address 4 being the 4th
address in the 802.11 header).

The address extension used to hold up to 3 addresses instead of the current 2.
I'm not sure which draft version changed this, but it is very unlikely that it
will change again given the state of the approval process of this draft.  See
section 7.1.3.6.3 in current draft (8.0).

Also, note that the extra address that I'm removing was not being used, so this
change has no effect on over-the-air frame formats.  But I thought I better
remove it before someone does start using it.
Signed-off-by: default avatarJavier Cardona <javier@cozybit.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 3de135db
...@@ -536,7 +536,6 @@ struct ieee80211s_hdr { ...@@ -536,7 +536,6 @@ struct ieee80211s_hdr {
__le32 seqnum; __le32 seqnum;
u8 eaddr1[6]; u8 eaddr1[6];
u8 eaddr2[6]; u8 eaddr2[6];
u8 eaddr3[6];
} __attribute__ ((packed)); } __attribute__ ((packed));
/* Mesh flags */ /* Mesh flags */
......
...@@ -410,39 +410,33 @@ int ieee80211_fill_mesh_addresses(struct ieee80211_hdr *hdr, __le16 *fc, ...@@ -410,39 +410,33 @@ int ieee80211_fill_mesh_addresses(struct ieee80211_hdr *hdr, __le16 *fc,
* ieee80211_new_mesh_header - create a new mesh header * ieee80211_new_mesh_header - create a new mesh header
* @meshhdr: uninitialized mesh header * @meshhdr: uninitialized mesh header
* @sdata: mesh interface to be used * @sdata: mesh interface to be used
* @addr4: addr4 of the mesh frame (1st in ae header) * @addr4or5: 1st address in the ae header, which may correspond to address 4
* may be NULL * (if addr6 is NULL) or address 5 (if addr6 is present). It may
* @addr5: addr5 of the mesh frame (1st or 2nd in ae header) * be NULL.
* may be NULL unless addr6 is present * @addr6: 2nd address in the ae header, which corresponds to addr6 of the
* @addr6: addr6 of the mesh frame (2nd or 3rd in ae header) * mesh frame
* may be NULL unless addr5 is present
* *
* Return the header length. * Return the header length.
*/ */
int ieee80211_new_mesh_header(struct ieee80211s_hdr *meshhdr, int ieee80211_new_mesh_header(struct ieee80211s_hdr *meshhdr,
struct ieee80211_sub_if_data *sdata, char *addr4, struct ieee80211_sub_if_data *sdata, char *addr4or5,
char *addr5, char *addr6) char *addr6)
{ {
int aelen = 0; int aelen = 0;
BUG_ON(!addr4or5 && addr6);
memset(meshhdr, 0, sizeof(*meshhdr)); memset(meshhdr, 0, sizeof(*meshhdr));
meshhdr->ttl = sdata->u.mesh.mshcfg.dot11MeshTTL; meshhdr->ttl = sdata->u.mesh.mshcfg.dot11MeshTTL;
put_unaligned(cpu_to_le32(sdata->u.mesh.mesh_seqnum), &meshhdr->seqnum); put_unaligned(cpu_to_le32(sdata->u.mesh.mesh_seqnum), &meshhdr->seqnum);
sdata->u.mesh.mesh_seqnum++; sdata->u.mesh.mesh_seqnum++;
if (addr4) { if (addr4or5 && !addr6) {
meshhdr->flags |= MESH_FLAGS_AE_A4; meshhdr->flags |= MESH_FLAGS_AE_A4;
aelen += ETH_ALEN; aelen += ETH_ALEN;
memcpy(meshhdr->eaddr1, addr4, ETH_ALEN); memcpy(meshhdr->eaddr1, addr4or5, ETH_ALEN);
} } else if (addr4or5 && addr6) {
if (addr5 && addr6) {
meshhdr->flags |= MESH_FLAGS_AE_A5_A6; meshhdr->flags |= MESH_FLAGS_AE_A5_A6;
aelen += 2 * ETH_ALEN; aelen += 2 * ETH_ALEN;
if (!addr4) { memcpy(meshhdr->eaddr1, addr4or5, ETH_ALEN);
memcpy(meshhdr->eaddr1, addr5, ETH_ALEN); memcpy(meshhdr->eaddr2, addr6, ETH_ALEN);
memcpy(meshhdr->eaddr2, addr6, ETH_ALEN);
} else {
memcpy(meshhdr->eaddr2, addr5, ETH_ALEN);
memcpy(meshhdr->eaddr3, addr6, ETH_ALEN);
}
} }
return 6 + aelen; return 6 + aelen;
} }
......
...@@ -187,8 +187,8 @@ struct mesh_rmc { ...@@ -187,8 +187,8 @@ struct mesh_rmc {
int ieee80211_fill_mesh_addresses(struct ieee80211_hdr *hdr, __le16 *fc, int ieee80211_fill_mesh_addresses(struct ieee80211_hdr *hdr, __le16 *fc,
const u8 *da, const u8 *sa); const u8 *da, const u8 *sa);
int ieee80211_new_mesh_header(struct ieee80211s_hdr *meshhdr, int ieee80211_new_mesh_header(struct ieee80211s_hdr *meshhdr,
struct ieee80211_sub_if_data *sdata, char *addr4, struct ieee80211_sub_if_data *sdata, char *addr4or5,
char *addr5, char *addr6); char *addr6);
int mesh_rmc_check(u8 *addr, struct ieee80211s_hdr *mesh_hdr, int mesh_rmc_check(u8 *addr, struct ieee80211s_hdr *mesh_hdr,
struct ieee80211_sub_if_data *sdata); struct ieee80211_sub_if_data *sdata);
bool mesh_matches_local(struct ieee802_11_elems *ie, bool mesh_matches_local(struct ieee802_11_elems *ie,
......
...@@ -1811,7 +1811,7 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb, ...@@ -1811,7 +1811,7 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb,
hdrlen = ieee80211_fill_mesh_addresses(&hdr, &fc, hdrlen = ieee80211_fill_mesh_addresses(&hdr, &fc,
skb->data, skb->data + ETH_ALEN); skb->data, skb->data + ETH_ALEN);
meshhdrlen = ieee80211_new_mesh_header(&mesh_hdr, meshhdrlen = ieee80211_new_mesh_header(&mesh_hdr,
sdata, NULL, NULL, NULL); sdata, NULL, NULL);
} else { } else {
/* packet from other interface */ /* packet from other interface */
struct mesh_path *mppath; struct mesh_path *mppath;
...@@ -1844,13 +1844,11 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb, ...@@ -1844,13 +1844,11 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb,
ieee80211_new_mesh_header(&mesh_hdr, ieee80211_new_mesh_header(&mesh_hdr,
sdata, sdata,
skb->data + ETH_ALEN, skb->data + ETH_ALEN,
NULL,
NULL); NULL);
else else
meshhdrlen = meshhdrlen =
ieee80211_new_mesh_header(&mesh_hdr, ieee80211_new_mesh_header(&mesh_hdr,
sdata, sdata,
NULL,
skb->data, skb->data,
skb->data + ETH_ALEN); skb->data + ETH_ALEN);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment