X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=net%2Fbridge%2Fnetfilter%2Febt_among.c;h=ce97c4285f9adc1ddcd9de259e05f99b9b48d292;hb=97bf2856c6014879bd04983a3e9dfcdac1e7fe85;hp=727311dfd8848f262ec488f442d632b73fb6040d;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/net/bridge/netfilter/ebt_among.c b/net/bridge/netfilter/ebt_among.c index 727311dfd..ce97c4285 100644 --- a/net/bridge/netfilter/ebt_among.c +++ b/net/bridge/netfilter/ebt_among.c @@ -15,7 +15,7 @@ #include static int ebt_mac_wormhash_contains(const struct ebt_mac_wormhash *wh, - const char *mac, uint32_t ip) + const char *mac, __be32 ip) { /* You may be puzzled as to how this code works. * Some tricks were used, refer to @@ -70,44 +70,57 @@ static int ebt_mac_wormhash_check_integrity(const struct ebt_mac_wormhash return 0; } -static int get_ip_dst(const struct sk_buff *skb, uint32_t *addr) +static int get_ip_dst(const struct sk_buff *skb, __be32 *addr) { - if (skb->mac.ethernet->h_proto == __constant_htons(ETH_P_IP)) { - struct iphdr iph; + if (eth_hdr(skb)->h_proto == htons(ETH_P_IP)) { + struct iphdr _iph, *ih; - if (skb_copy_bits(skb, 0, &iph, sizeof(iph))) + ih = skb_header_pointer(skb, 0, sizeof(_iph), &_iph); + if (ih == NULL) return -1; - *addr = iph.daddr; - } else if (skb->mac.ethernet->h_proto == __constant_htons(ETH_P_ARP)) { - struct arphdr arph; - - if (skb_copy_bits(skb, 0, &arph, sizeof(arph)) || - arph.ar_pln != sizeof(uint32_t) || arph.ar_hln != ETH_ALEN) + *addr = ih->daddr; + } else if (eth_hdr(skb)->h_proto == htons(ETH_P_ARP)) { + struct arphdr _arph, *ah; + __be32 buf, *bp; + + ah = skb_header_pointer(skb, 0, sizeof(_arph), &_arph); + if (ah == NULL || + ah->ar_pln != sizeof(__be32) || + ah->ar_hln != ETH_ALEN) return -1; - if (skb_copy_bits(skb, sizeof(struct arphdr) + - 2 * ETH_ALEN + sizeof(uint32_t), addr, sizeof(uint32_t))) + bp = skb_header_pointer(skb, sizeof(struct arphdr) + + 2 * ETH_ALEN + sizeof(__be32), + sizeof(__be32), &buf); + if (bp == NULL) return -1; + *addr = *bp; } return 0; } -static int get_ip_src(const struct sk_buff *skb, uint32_t *addr) +static int get_ip_src(const struct sk_buff *skb, __be32 *addr) { - if (skb->mac.ethernet->h_proto == __constant_htons(ETH_P_IP)) { - struct iphdr iph; + if (eth_hdr(skb)->h_proto == htons(ETH_P_IP)) { + struct iphdr _iph, *ih; - if (skb_copy_bits(skb, 0, &iph, sizeof(iph))) + ih = skb_header_pointer(skb, 0, sizeof(_iph), &_iph); + if (ih == NULL) return -1; - *addr = iph.saddr; - } else if (skb->mac.ethernet->h_proto == __constant_htons(ETH_P_ARP)) { - struct arphdr arph; - - if (skb_copy_bits(skb, 0, &arph, sizeof(arph)) || - arph.ar_pln != sizeof(uint32_t) || arph.ar_hln != ETH_ALEN) + *addr = ih->saddr; + } else if (eth_hdr(skb)->h_proto == htons(ETH_P_ARP)) { + struct arphdr _arph, *ah; + __be32 buf, *bp; + + ah = skb_header_pointer(skb, 0, sizeof(_arph), &_arph); + if (ah == NULL || + ah->ar_pln != sizeof(__be32) || + ah->ar_hln != ETH_ALEN) return -1; - if (skb_copy_bits(skb, sizeof(struct arphdr) + - ETH_ALEN, addr, sizeof(uint32_t))) + bp = skb_header_pointer(skb, sizeof(struct arphdr) + + ETH_ALEN, sizeof(__be32), &buf); + if (bp == NULL) return -1; + *addr = *bp; } return 0; } @@ -120,13 +133,13 @@ static int ebt_filter_among(const struct sk_buff *skb, struct ebt_among_info *info = (struct ebt_among_info *) data; const char *dmac, *smac; const struct ebt_mac_wormhash *wh_dst, *wh_src; - uint32_t dip = 0, sip = 0; + __be32 dip = 0, sip = 0; wh_dst = ebt_among_wh_dst(info); wh_src = ebt_among_wh_src(info); if (wh_src) { - smac = skb->mac.ethernet->h_source; + smac = eth_hdr(skb)->h_source; if (get_ip_src(skb, &sip)) return EBT_NOMATCH; if (!(info->bitmask & EBT_AMONG_SRC_NEG)) { @@ -141,7 +154,7 @@ static int ebt_filter_among(const struct sk_buff *skb, } if (wh_dst) { - dmac = skb->mac.ethernet->h_dest; + dmac = eth_hdr(skb)->h_dest; if (get_ip_dst(skb, &dip)) return EBT_NOMATCH; if (!(info->bitmask & EBT_AMONG_DST_NEG)) { @@ -200,16 +213,16 @@ static struct ebt_match filter_among = { .me = THIS_MODULE, }; -static int __init init(void) +static int __init ebt_among_init(void) { return ebt_register_match(&filter_among); } -static void __exit fini(void) +static void __exit ebt_among_fini(void) { ebt_unregister_match(&filter_among); } -module_init(init); -module_exit(fini); +module_init(ebt_among_init); +module_exit(ebt_among_fini); MODULE_LICENSE("GPL");