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 bbd56b0878995141b3f54701e234fd7378037cda..3a0683ba357bbdc706e287a32d0727734c4e172a 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 bd0e1cbb9a1ed27c7f1c4bee3883d6d8fda1a52c..31e102541869080729120683f69eef29d381f59e 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 5c67e7b8790f0d96bc4d540d0295993929b247ab..d93019874e411b9b0412f81cd5fbf986abb54035 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 5399e7a9ec6eca530983ebc6665a0496e9972834..3fbabbf34ea574360dc7838530667f19820fdd2c 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 964b7faa7f17134f6b1e1371557487ba26cdd4cb..4921d724b6c7bad2ed75897d3f75e03c3ef5e659 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 375cecc837a18bf418d873f4945dff161b51945c..3466e1f7fd12d62e7e9fd601330575b0680ed3d5 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);