|
@@ -410,39 +410,33 @@ int ieee80211_fill_mesh_addresses(struct ieee80211_hdr *hdr, __le16 *fc,
|
|
|
* ieee80211_new_mesh_header - create a new mesh header
|
|
|
* @meshhdr: uninitialized mesh header
|
|
|
* @sdata: mesh interface to be used
|
|
|
- * @addr4: addr4 of the mesh frame (1st in ae header)
|
|
|
- * may be NULL
|
|
|
- * @addr5: addr5 of the mesh frame (1st or 2nd in ae header)
|
|
|
- * may be NULL unless addr6 is present
|
|
|
- * @addr6: addr6 of the mesh frame (2nd or 3rd in ae header)
|
|
|
- * may be NULL unless addr5 is present
|
|
|
+ * @addr4or5: 1st address in the ae header, which may correspond to address 4
|
|
|
+ * (if addr6 is NULL) or address 5 (if addr6 is present). It may
|
|
|
+ * be NULL.
|
|
|
+ * @addr6: 2nd address in the ae header, which corresponds to addr6 of the
|
|
|
+ * mesh frame
|
|
|
*
|
|
|
* Return the header length.
|
|
|
*/
|
|
|
int ieee80211_new_mesh_header(struct ieee80211s_hdr *meshhdr,
|
|
|
- struct ieee80211_sub_if_data *sdata, char *addr4,
|
|
|
- char *addr5, char *addr6)
|
|
|
+ struct ieee80211_sub_if_data *sdata, char *addr4or5,
|
|
|
+ char *addr6)
|
|
|
{
|
|
|
int aelen = 0;
|
|
|
+ BUG_ON(!addr4or5 && addr6);
|
|
|
memset(meshhdr, 0, sizeof(*meshhdr));
|
|
|
meshhdr->ttl = sdata->u.mesh.mshcfg.dot11MeshTTL;
|
|
|
put_unaligned(cpu_to_le32(sdata->u.mesh.mesh_seqnum), &meshhdr->seqnum);
|
|
|
sdata->u.mesh.mesh_seqnum++;
|
|
|
- if (addr4) {
|
|
|
+ if (addr4or5 && !addr6) {
|
|
|
meshhdr->flags |= MESH_FLAGS_AE_A4;
|
|
|
aelen += ETH_ALEN;
|
|
|
- memcpy(meshhdr->eaddr1, addr4, ETH_ALEN);
|
|
|
- }
|
|
|
- if (addr5 && addr6) {
|
|
|
+ memcpy(meshhdr->eaddr1, addr4or5, ETH_ALEN);
|
|
|
+ } else if (addr4or5 && addr6) {
|
|
|
meshhdr->flags |= MESH_FLAGS_AE_A5_A6;
|
|
|
aelen += 2 * ETH_ALEN;
|
|
|
- if (!addr4) {
|
|
|
- memcpy(meshhdr->eaddr1, addr5, ETH_ALEN);
|
|
|
- memcpy(meshhdr->eaddr2, addr6, ETH_ALEN);
|
|
|
- } else {
|
|
|
- memcpy(meshhdr->eaddr2, addr5, ETH_ALEN);
|
|
|
- memcpy(meshhdr->eaddr3, addr6, ETH_ALEN);
|
|
|
- }
|
|
|
+ memcpy(meshhdr->eaddr1, addr4or5, ETH_ALEN);
|
|
|
+ memcpy(meshhdr->eaddr2, addr6, ETH_ALEN);
|
|
|
}
|
|
|
return 6 + aelen;
|
|
|
}
|