X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=net%2Fbridge%2Fnetfilter%2Febt_arpreply.c;h=0aa7b9910a86159a66043ba819298a02f6b917f1;hb=refs%2Fheads%2Fvserver;hp=87ba30dd090f7700d5f0919e08c025df9c4f7e70;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/net/bridge/netfilter/ebt_arpreply.c b/net/bridge/netfilter/ebt_arpreply.c index 87ba30dd0..0aa7b9910 100644 --- a/net/bridge/netfilter/ebt_arpreply.c +++ b/net/bridge/netfilter/ebt_arpreply.c @@ -20,30 +20,38 @@ static int ebt_target_reply(struct sk_buff **pskb, unsigned int hooknr, const void *data, unsigned int datalen) { struct ebt_arpreply_info *info = (struct ebt_arpreply_info *)data; - u32 sip, dip; - struct arphdr ah; - unsigned char sha[ETH_ALEN]; + __be32 _sip, *siptr, _dip, *diptr; + struct arphdr _ah, *ap; + unsigned char _sha[ETH_ALEN], *shp; struct sk_buff *skb = *pskb; - if (skb_copy_bits(skb, 0, &ah, sizeof(ah))) + ap = skb_header_pointer(skb, 0, sizeof(_ah), &_ah); + if (ap == NULL) return EBT_DROP; - if (ah.ar_op != __constant_htons(ARPOP_REQUEST) || ah.ar_hln != ETH_ALEN - || ah.ar_pro != __constant_htons(ETH_P_IP) || ah.ar_pln != 4) + if (ap->ar_op != htons(ARPOP_REQUEST) || + ap->ar_hln != ETH_ALEN || + ap->ar_pro != htons(ETH_P_IP) || + ap->ar_pln != 4) return EBT_CONTINUE; - if (skb_copy_bits(skb, sizeof(ah), &sha, ETH_ALEN)) + shp = skb_header_pointer(skb, sizeof(_ah), ETH_ALEN, &_sha); + if (shp == NULL) return EBT_DROP; - if (skb_copy_bits(skb, sizeof(ah) + ETH_ALEN, &sip, sizeof(sip))) + siptr = skb_header_pointer(skb, sizeof(_ah) + ETH_ALEN, + sizeof(_sip), &_sip); + if (siptr == NULL) return EBT_DROP; - if (skb_copy_bits(skb, sizeof(ah) + 2 * ETH_ALEN + sizeof(sip), - &dip, sizeof(dip))) + diptr = skb_header_pointer(skb, + sizeof(_ah) + 2 * ETH_ALEN + sizeof(_sip), + sizeof(_dip), &_dip); + if (diptr == NULL) return EBT_DROP; - arp_send(ARPOP_REPLY, ETH_P_ARP, sip, (struct net_device *)in, - dip, sha, info->mac, sha); + arp_send(ARPOP_REPLY, ETH_P_ARP, *siptr, (struct net_device *)in, + *diptr, shp, info->mac, shp); return info->target; } @@ -57,7 +65,7 @@ static int ebt_target_reply_check(const char *tablename, unsigned int hookmask, return -EINVAL; if (BASE_CHAIN && info->target == EBT_RETURN) return -EINVAL; - if (e->ethproto != __constant_htons(ETH_P_ARP) || + if (e->ethproto != htons(ETH_P_ARP) || e->invflags & EBT_IPROTO) return -EINVAL; CLEAR_BASE_CHAIN_BIT; @@ -74,16 +82,16 @@ static struct ebt_target reply_target = .me = THIS_MODULE, }; -static int __init init(void) +static int __init ebt_arpreply_init(void) { return ebt_register_target(&reply_target); } -static void __exit fini(void) +static void __exit ebt_arpreply_fini(void) { ebt_unregister_target(&reply_target); } -module_init(init); -module_exit(fini); +module_init(ebt_arpreply_init); +module_exit(ebt_arpreply_fini); MODULE_LICENSE("GPL");