]> git.neil.brown.name Git - history.git/commitdiff
[NET]: Size hh_cache->hh_data more appropriately.
authorDavid S. Miller <davem@nuts.ninka.net>
Thu, 19 Jun 2003 07:25:36 +0000 (00:25 -0700)
committerDavid S. Miller <davem@nuts.ninka.net>
Thu, 19 Jun 2003 07:25:36 +0000 (00:25 -0700)
drivers/net/myri_sbus.c
drivers/net/plip.c
include/linux/netdevice.h
net/ethernet/eth.c
net/ipv4/ip_output.c
net/ipv4/netfilter/ipt_MIRROR.c
net/ipv6/ip6_output.c

index 7f4e64360f15b4518ba2448874aef1ca507176ce..fdcad85b7cc64e5ed46be04d2f27bf92b441c1c5 100644 (file)
@@ -766,10 +766,14 @@ static int myri_rebuild_header(struct sk_buff *skb)
 int myri_header_cache(struct neighbour *neigh, struct hh_cache *hh)
 {
        unsigned short type = hh->hh_type;
-       unsigned char *pad = (unsigned char *) hh->hh_data;
-       struct ethhdr *eth = (struct ethhdr *) (pad + MYRI_PAD_LEN);
+       unsigned char *pad;
+       struct ethhdr *eth;
        struct net_device *dev = neigh->dev;
 
+       pad = ((unsigned char *) hh->hh_data) +
+               HH_DATA_OFF(sizeof(*eth) + MYRI_PAD_LEN);
+       eth = (struct ethhdr *) (pad + MYRI_PAD_LEN);
+
        if (type == __constant_htons(ETH_P_802_3))
                return -1;
 
@@ -788,7 +792,8 @@ int myri_header_cache(struct neighbour *neigh, struct hh_cache *hh)
 /* Called by Address Resolution module to notify changes in address. */
 void myri_header_cache_update(struct hh_cache *hh, struct net_device *dev, unsigned char * haddr)
 {
-       memcpy(((u8*)hh->hh_data) + 2, haddr, dev->addr_len);
+       memcpy(((u8*)hh->hh_data) + HH_DATA_OFF(sizeof(struct ethhdr)),
+              haddr, dev->addr_len);
 }
 
 static int myri_change_mtu(struct net_device *dev, int new_mtu)
index ae3c088214fddfa9ad399355c15a4d9cdd31f1b2..620b5c4223e548169d16028acd6310c4436cc458 100644 (file)
@@ -1078,7 +1078,10 @@ int plip_hard_header_cache(struct neighbour *neigh,
        
        if ((ret = nl->orig_hard_header_cache(neigh, hh)) == 0)
        {
-               struct ethhdr *eth = (struct ethhdr*)(((u8*)hh->hh_data) + 2);
+               struct ethhdr *eth;
+
+               eth = (struct ethhdr*)(((u8*)hh->hh_data) +
+                                      HH_DATA_OFF(sizeof(*eth)));
                plip_rewrite_address (neigh->dev, eth);
        }
        
index 7bed3d24a2ea618bfe5143638593dc372477e8e2..fba9b5ddec1e5cd0a3ba06429d9b6d1ff013a5af 100644 (file)
@@ -195,8 +195,14 @@ struct hh_cache
        int             hh_len;         /* length of header */
        int             (*hh_output)(struct sk_buff *skb);
        rwlock_t        hh_lock;
+
        /* cached hardware header; allow for machine alignment needs.        */
-       unsigned long   hh_data[16/sizeof(unsigned long)];
+#define HH_DATA_MOD    16
+#define HH_DATA_OFF(__len) \
+       (HH_DATA_MOD - ((__len) & (HH_DATA_MOD - 1)))
+#define HH_DATA_ALIGN(__len) \
+       (((__len)+(HH_DATA_MOD-1))&~(HH_DATA_MOD - 1))
+       unsigned long   hh_data[HH_DATA_ALIGN(LL_MAX_HEADER)];
 };
 
 /* These flag bits are private to the generic network queueing
index 80e2b0379858739a6c187bc49b6d99a4887bd105..bf49e394665fe17620c0d4ae19e5473562dfede6 100644 (file)
@@ -216,9 +216,12 @@ int eth_header_parse(struct sk_buff *skb, unsigned char *haddr)
 int eth_header_cache(struct neighbour *neigh, struct hh_cache *hh)
 {
        unsigned short type = hh->hh_type;
-       struct ethhdr *eth = (struct ethhdr*)(((u8*)hh->hh_data) + 2);
+       struct ethhdr *eth;
        struct net_device *dev = neigh->dev;
 
+       eth = (struct ethhdr*)
+               (((u8*)hh->hh_data) + (HH_DATA_OFF(sizeof(*eth))));
+
        if (type == __constant_htons(ETH_P_802_3))
                return -1;
 
@@ -235,5 +238,6 @@ int eth_header_cache(struct neighbour *neigh, struct hh_cache *hh)
 
 void eth_header_cache_update(struct hh_cache *hh, struct net_device *dev, unsigned char * haddr)
 {
-       memcpy(((u8*)hh->hh_data) + 2, haddr, dev->addr_len);
+       memcpy(((u8*)hh->hh_data) + HH_DATA_OFF(sizeof(struct ethhdr)),
+              haddr, dev->addr_len);
 }
index 765c13b96d64e85f65a48f211bf7c0a21f51aab2..7a736073666eb558948f7c6ed6506a11fd10dbe2 100644 (file)
@@ -193,8 +193,11 @@ static inline int ip_finish_output2(struct sk_buff *skb)
 #endif /*CONFIG_NETFILTER_DEBUG*/
 
        if (hh) {
+               int hh_alen;
+
                read_lock_bh(&hh->hh_lock);
-               memcpy(skb->data - 16, hh->hh_data, 16);
+               hh_alen = HH_DATA_ALIGN(hh->hh_len);
+               memcpy(skb->data - hh_alen, hh->hh_data, hh_alen);
                read_unlock_bh(&hh->hh_lock);
                skb_push(skb, hh->hh_len);
                return hh->hh_output(skb);
index fcd424bd73b8fd50e426d97d13127c98bd36d0d1..3f8faff13dc496d1af5c7d55d481c9aa28b2b5c3 100644 (file)
@@ -90,8 +90,11 @@ static void ip_direct_send(struct sk_buff *skb)
        struct hh_cache *hh = dst->hh;
 
        if (hh) {
+               int hh_alen;
+
                read_lock_bh(&hh->hh_lock);
-               memcpy(skb->data - 16, hh->hh_data, 16);
+               hh_alen = HH_DATA_ALIGN(hh->hh_len);
+               memcpy(skb->data - hh_alen, hh->hh_data, hh_alen);
                read_unlock_bh(&hh->hh_lock);
                skb_push(skb, hh->hh_len);
                hh->hh_output(skb);
index 9b17cafeab36fcb34fd92e337d7ec4ce06c87d88..0eb4d60f9dac018b5d2447d9a3ba1ce355a66bd1 100644 (file)
@@ -76,8 +76,11 @@ static inline int ip6_output_finish(struct sk_buff *skb)
        struct hh_cache *hh = dst->hh;
 
        if (hh) {
+               int hh_alen;
+
                read_lock_bh(&hh->hh_lock);
-               memcpy(skb->data - 16, hh->hh_data, 16);
+               hh_alen = HH_DATA_ALIGN(hh->hh_len);
+               memcpy(skb->data - hh_alen, hh->hh_data, hh_alen);
                read_unlock_bh(&hh->hh_lock);
                skb_push(skb, hh->hh_len);
                return hh->hh_output(skb);