mac80211: use fixed broadcast address
authorJohannes Berg <johannes@sipsolutions.net>
Tue, 17 Nov 2009 12:34:04 +0000 (13:34 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 18 Nov 2009 22:09:18 +0000 (17:09 -0500)
The netdev broadcast address cannot change from
all-ones so there's no need to use it; we can
instead hard-code it. Since we already have an
instance in tkip.c, which will be shared if it
is marked static const, doing this reduces text
size at no data/bss cost.

The real motivation for this is, of course, the
desire to get rid of almost all uses of netdevs
in mac80211 so that auditing their use becomes
easier.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
net/mac80211/mesh.c
net/mac80211/mesh.h
net/mac80211/mesh_hwmp.c
net/mac80211/mesh_pathtbl.c
net/mac80211/tkip.c
net/mac80211/tx.c

index bbd56b0..3a0683b 100644 (file)
@@ -394,8 +394,9 @@ void ieee80211_mesh_root_setup(struct ieee80211_if_mesh *ifmsh)
  *
  * Return the length of the 802.11 (does not include a mesh control header)
  */
-int ieee80211_fill_mesh_addresses(struct ieee80211_hdr *hdr, __le16 *fc, char
-               *meshda, char *meshsa) {
+int ieee80211_fill_mesh_addresses(struct ieee80211_hdr *hdr, __le16 *fc,
+                                 const u8 *meshda, const u8 *meshsa)
+{
        if (is_multicast_ether_addr(meshda)) {
                *fc |= cpu_to_le16(IEEE80211_FCTL_FROMDS);
                /* DA TA SA */
index bd0e1cb..31e1025 100644 (file)
@@ -220,7 +220,7 @@ struct mesh_rmc {
 /* Public interfaces */
 /* Various */
 int ieee80211_fill_mesh_addresses(struct ieee80211_hdr *hdr, __le16 *fc,
-               char *da, char *sa);
+                                 const u8 *da, const u8 *sa);
 int ieee80211_new_mesh_header(struct ieee80211s_hdr *meshhdr,
                struct ieee80211_sub_if_data *sdata, char *addr4,
                char *addr5, char *addr6);
@@ -284,7 +284,7 @@ u32 mesh_table_hash(u8 *addr, struct ieee80211_sub_if_data *sdata,
                struct mesh_table *tbl);
 /* Mesh paths */
 int mesh_path_error_tx(u8 ttl, u8 *target, __le32 target_sn, __le16 target_rcode,
-               u8 *ra, struct ieee80211_sub_if_data *sdata);
+                      const u8 *ra, struct ieee80211_sub_if_data *sdata);
 void mesh_path_assign_nexthop(struct mesh_path *mpath, struct sta_info *sta);
 void mesh_path_flush_pending(struct mesh_path *mpath);
 void mesh_path_tx_pending(struct mesh_path *mpath);
index 5c67e7b..d930198 100644 (file)
@@ -101,10 +101,12 @@ enum mpath_frame_type {
        MPATH_RANN
 };
 
+static const u8 broadcast_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
+
 static int mesh_path_sel_frame_tx(enum mpath_frame_type action, u8 flags,
                u8 *orig_addr, __le32 orig_sn, u8 target_flags, u8 *target,
-               __le32 target_sn, u8 *da, u8 hop_count, u8 ttl,__le32 lifetime,
-               __le32 metric, __le32 preq_id,
+               __le32 target_sn, const u8 *da, u8 hop_count, u8 ttl,
+               __le32 lifetime, __le32 metric, __le32 preq_id,
                struct ieee80211_sub_if_data *sdata)
 {
        struct ieee80211_local *local = sdata->local;
@@ -198,8 +200,8 @@ static int mesh_path_sel_frame_tx(enum mpath_frame_type action, u8 flags,
  * @ra: node this frame is addressed to
  */
 int mesh_path_error_tx(u8 ttl, u8 *target, __le32 target_sn,
-               __le16 target_rcode, u8 *ra,
-               struct ieee80211_sub_if_data *sdata)
+                      __le16 target_rcode, const u8 *ra,
+                      struct ieee80211_sub_if_data *sdata)
 {
        struct ieee80211_local *local = sdata->local;
        struct sk_buff *skb = dev_alloc_skb(local->hw.extra_tx_headroom + 400);
@@ -548,7 +550,7 @@ static void hwmp_preq_frame_process(struct ieee80211_sub_if_data *sdata,
                hopcount = PREQ_IE_HOPCOUNT(preq_elem) + 1;
                mesh_path_sel_frame_tx(MPATH_PREQ, flags, orig_addr,
                                cpu_to_le32(orig_sn), target_flags, target_addr,
-                               cpu_to_le32(target_sn), sdata->dev->broadcast,
+                               cpu_to_le32(target_sn), broadcast_addr,
                                hopcount, ttl, cpu_to_le32(lifetime),
                                cpu_to_le32(metric), cpu_to_le32(preq_id),
                                sdata);
@@ -660,7 +662,7 @@ static void hwmp_perr_frame_process(struct ieee80211_sub_if_data *sdata,
                        spin_unlock_bh(&mpath->state_lock);
                        mesh_path_error_tx(ttl, target_addr, cpu_to_le32(target_sn),
                                           cpu_to_le16(target_rcode),
-                                          sdata->dev->broadcast, sdata);
+                                          broadcast_addr, sdata);
                } else
                        spin_unlock_bh(&mpath->state_lock);
        }
@@ -709,7 +711,7 @@ static void hwmp_rann_frame_process(struct ieee80211_sub_if_data *sdata,
        if (mpath->sn < orig_sn) {
                mesh_path_sel_frame_tx(MPATH_RANN, flags, orig_addr,
                                       cpu_to_le32(orig_sn),
-                                      0, NULL, 0, sdata->dev->broadcast,
+                                      0, NULL, 0, broadcast_addr,
                                       hopcount, ttl, 0,
                                       cpu_to_le32(metric + mpath->metric),
                                       0, sdata);
@@ -890,7 +892,7 @@ void mesh_path_start_discovery(struct ieee80211_sub_if_data *sdata)
        spin_unlock_bh(&mpath->state_lock);
        mesh_path_sel_frame_tx(MPATH_PREQ, 0, sdata->dev->dev_addr,
                        cpu_to_le32(ifmsh->sn), target_flags, mpath->dst,
-                       cpu_to_le32(mpath->sn), sdata->dev->broadcast, 0,
+                       cpu_to_le32(mpath->sn), broadcast_addr, 0,
                        ttl, cpu_to_le32(lifetime), 0,
                        cpu_to_le32(ifmsh->preq_id++), sdata);
        mod_timer(&mpath->timer, jiffies + mpath->discovery_timeout);
@@ -1011,6 +1013,6 @@ mesh_path_tx_root_frame(struct ieee80211_sub_if_data *sdata)
 
        mesh_path_sel_frame_tx(MPATH_RANN, 0, sdata->dev->dev_addr,
                               cpu_to_le32(++ifmsh->sn),
-                              0, NULL, 0, sdata->dev->broadcast,
+                              0, NULL, 0, broadcast_addr,
                               0, MESH_TTL, 0, 0, 0, sdata);
 }
index 5399e7a..3fbabbf 100644 (file)
@@ -449,6 +449,7 @@ err_path_alloc:
  */
 void mesh_plink_broken(struct sta_info *sta)
 {
+       static const u8 bcast[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
        struct mesh_path *mpath;
        struct mpath_node *node;
        struct hlist_node *p;
@@ -468,7 +469,7 @@ void mesh_plink_broken(struct sta_info *sta)
                        mesh_path_error_tx(MESH_TTL, mpath->dst,
                                        cpu_to_le32(mpath->sn),
                                        PERR_RCODE_DEST_UNREACH,
-                                       sdata->dev->broadcast, sdata);
+                                       bcast, sdata);
                } else
                spin_unlock_bh(&mpath->state_lock);
        }
index 964b7fa..4921d72 100644 (file)
@@ -301,9 +301,9 @@ int ieee80211_tkip_decrypt_data(struct crypto_blkcipher *tfm,
 #endif
                if (key->local->ops->update_tkip_key &&
                        key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE) {
-                       u8 bcast[ETH_ALEN] =
+                       static const u8 bcast[ETH_ALEN] =
                                {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
-                       u8 *sta_addr = key->sta->sta.addr;
+                       const u8 *sta_addr = key->sta->sta.addr;
 
                        if (is_multicast_ether_addr(ra))
                                sta_addr = bcast;
index 375cecc..3466e1f 100644 (file)
@@ -1683,21 +1683,25 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb,
                        /* packet from other interface */
                        struct mesh_path *mppath;
                        int is_mesh_mcast = 1;
-                       char *mesh_da;
+                       const u8 *mesh_da;
 
                        rcu_read_lock();
                        if (is_multicast_ether_addr(skb->data))
                                /* DA TA mSA AE:SA */
                                mesh_da = skb->data;
                        else {
+                               static const u8 bcast[ETH_ALEN] =
+                                       { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
+
                                mppath = mpp_path_lookup(skb->data, sdata);
                                if (mppath) {
                                        /* RA TA mDA mSA AE:DA SA */
                                        mesh_da = mppath->mpp;
                                        is_mesh_mcast = 0;
-                               } else
+                               } else {
                                        /* DA TA mSA AE:SA */
-                                       mesh_da = dev->broadcast;
+                                       mesh_da = bcast;
+                               }
                        }
                        hdrlen = ieee80211_fill_mesh_addresses(&hdr, &fc,
                                        mesh_da, dev->dev_addr);