Commit 61ad5394590c5c5338ab4ec50553d809a9996d50

Authored by Javier Cardona
Committed by John W. Linville
1 parent 3de135dba9

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: Javier Cardona <javier@cozybit.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>

Showing 4 changed files with 16 additions and 25 deletions Side-by-side Diff

include/linux/ieee80211.h
... ... @@ -536,7 +536,6 @@
536 536 __le32 seqnum;
537 537 u8 eaddr1[6];
538 538 u8 eaddr2[6];
539   - u8 eaddr3[6];
540 539 } __attribute__ ((packed));
541 540  
542 541 /* Mesh flags */
... ... @@ -410,39 +410,33 @@
410 410 * ieee80211_new_mesh_header - create a new mesh header
411 411 * @meshhdr: uninitialized mesh header
412 412 * @sdata: mesh interface to be used
413   - * @addr4: addr4 of the mesh frame (1st in ae header)
414   - * may be NULL
415   - * @addr5: addr5 of the mesh frame (1st or 2nd in ae header)
416   - * may be NULL unless addr6 is present
417   - * @addr6: addr6 of the mesh frame (2nd or 3rd in ae header)
418   - * may be NULL unless addr5 is present
  413 + * @addr4or5: 1st address in the ae header, which may correspond to address 4
  414 + * (if addr6 is NULL) or address 5 (if addr6 is present). It may
  415 + * be NULL.
  416 + * @addr6: 2nd address in the ae header, which corresponds to addr6 of the
  417 + * mesh frame
419 418 *
420 419 * Return the header length.
421 420 */
422 421 int ieee80211_new_mesh_header(struct ieee80211s_hdr *meshhdr,
423   - struct ieee80211_sub_if_data *sdata, char *addr4,
424   - char *addr5, char *addr6)
  422 + struct ieee80211_sub_if_data *sdata, char *addr4or5,
  423 + char *addr6)
425 424 {
426 425 int aelen = 0;
  426 + BUG_ON(!addr4or5 && addr6);
427 427 memset(meshhdr, 0, sizeof(*meshhdr));
428 428 meshhdr->ttl = sdata->u.mesh.mshcfg.dot11MeshTTL;
429 429 put_unaligned(cpu_to_le32(sdata->u.mesh.mesh_seqnum), &meshhdr->seqnum);
430 430 sdata->u.mesh.mesh_seqnum++;
431   - if (addr4) {
  431 + if (addr4or5 && !addr6) {
432 432 meshhdr->flags |= MESH_FLAGS_AE_A4;
433 433 aelen += ETH_ALEN;
434   - memcpy(meshhdr->eaddr1, addr4, ETH_ALEN);
435   - }
436   - if (addr5 && addr6) {
  434 + memcpy(meshhdr->eaddr1, addr4or5, ETH_ALEN);
  435 + } else if (addr4or5 && addr6) {
437 436 meshhdr->flags |= MESH_FLAGS_AE_A5_A6;
438 437 aelen += 2 * ETH_ALEN;
439   - if (!addr4) {
440   - memcpy(meshhdr->eaddr1, addr5, ETH_ALEN);
441   - memcpy(meshhdr->eaddr2, addr6, ETH_ALEN);
442   - } else {
443   - memcpy(meshhdr->eaddr2, addr5, ETH_ALEN);
444   - memcpy(meshhdr->eaddr3, addr6, ETH_ALEN);
445   - }
  438 + memcpy(meshhdr->eaddr1, addr4or5, ETH_ALEN);
  439 + memcpy(meshhdr->eaddr2, addr6, ETH_ALEN);
446 440 }
447 441 return 6 + aelen;
448 442 }
... ... @@ -187,8 +187,8 @@
187 187 int ieee80211_fill_mesh_addresses(struct ieee80211_hdr *hdr, __le16 *fc,
188 188 const u8 *da, const u8 *sa);
189 189 int ieee80211_new_mesh_header(struct ieee80211s_hdr *meshhdr,
190   - struct ieee80211_sub_if_data *sdata, char *addr4,
191   - char *addr5, char *addr6);
  190 + struct ieee80211_sub_if_data *sdata, char *addr4or5,
  191 + char *addr6);
192 192 int mesh_rmc_check(u8 *addr, struct ieee80211s_hdr *mesh_hdr,
193 193 struct ieee80211_sub_if_data *sdata);
194 194 bool mesh_matches_local(struct ieee802_11_elems *ie,
... ... @@ -1811,7 +1811,7 @@
1811 1811 hdrlen = ieee80211_fill_mesh_addresses(&hdr, &fc,
1812 1812 skb->data, skb->data + ETH_ALEN);
1813 1813 meshhdrlen = ieee80211_new_mesh_header(&mesh_hdr,
1814   - sdata, NULL, NULL, NULL);
  1814 + sdata, NULL, NULL);
1815 1815 } else {
1816 1816 /* packet from other interface */
1817 1817 struct mesh_path *mppath;
1818 1818  
... ... @@ -1844,13 +1844,11 @@
1844 1844 ieee80211_new_mesh_header(&mesh_hdr,
1845 1845 sdata,
1846 1846 skb->data + ETH_ALEN,
1847   - NULL,
1848 1847 NULL);
1849 1848 else
1850 1849 meshhdrlen =
1851 1850 ieee80211_new_mesh_header(&mesh_hdr,
1852 1851 sdata,
1853   - NULL,
1854 1852 skb->data,
1855 1853 skb->data + ETH_ALEN);
1856 1854