Commit 56f8a75c authored by Paul Gortmaker's avatar Paul Gortmaker Committed by David S. Miller

ip: introduce ip_is_fragment helper inline function

There are enough instances of this:

    iph->frag_off & htons(IP_MF | IP_OFFSET)

that a helper function is probably warranted.
Signed-off-by: default avatarPaul Gortmaker <paul.gortmaker@windriver.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent f470e5ae
...@@ -3438,7 +3438,7 @@ static int bond_xmit_hash_policy_l34(struct sk_buff *skb, int count) ...@@ -3438,7 +3438,7 @@ static int bond_xmit_hash_policy_l34(struct sk_buff *skb, int count)
int layer4_xor = 0; int layer4_xor = 0;
if (skb->protocol == htons(ETH_P_IP)) { if (skb->protocol == htons(ETH_P_IP)) {
if (!(iph->frag_off & htons(IP_MF|IP_OFFSET)) && if (!ip_is_fragment(iph) &&
(iph->protocol == IPPROTO_TCP || (iph->protocol == IPPROTO_TCP ||
iph->protocol == IPPROTO_UDP)) { iph->protocol == IPPROTO_UDP)) {
layer4_xor = ntohs((*layer4hdr ^ *(layer4hdr + 1))); layer4_xor = ntohs((*layer4hdr ^ *(layer4hdr + 1)));
......
...@@ -532,7 +532,7 @@ static void ioc3_tcpudp_checksum(struct sk_buff *skb, uint32_t hwsum, int len) ...@@ -532,7 +532,7 @@ static void ioc3_tcpudp_checksum(struct sk_buff *skb, uint32_t hwsum, int len)
return; return;
ih = (struct iphdr *) ((char *)eh + ETH_HLEN); ih = (struct iphdr *) ((char *)eh + ETH_HLEN);
if (ih->frag_off & htons(IP_MF | IP_OFFSET)) if (ip_is_fragment(ih))
return; return;
proto = ih->protocol; proto = ih->protocol;
......
...@@ -2257,7 +2257,7 @@ myri10ge_get_frag_header(struct skb_frag_struct *frag, void **mac_hdr, ...@@ -2257,7 +2257,7 @@ myri10ge_get_frag_header(struct skb_frag_struct *frag, void **mac_hdr,
*ip_hdr = iph; *ip_hdr = iph;
if (iph->protocol != IPPROTO_TCP) if (iph->protocol != IPPROTO_TCP)
return -1; return -1;
if (iph->frag_off & htons(IP_MF | IP_OFFSET)) if (ip_is_fragment(iph))
return -1; return -1;
*hdr_flags |= LRO_TCP; *hdr_flags |= LRO_TCP;
*tcpudp_hdr = (u8 *) (*ip_hdr) + (iph->ihl << 2); *tcpudp_hdr = (u8 *) (*ip_hdr) + (iph->ihl << 2);
......
...@@ -4109,7 +4109,7 @@ static netdev_tx_t s2io_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -4109,7 +4109,7 @@ static netdev_tx_t s2io_xmit(struct sk_buff *skb, struct net_device *dev)
struct tcphdr *th; struct tcphdr *th;
ip = ip_hdr(skb); ip = ip_hdr(skb);
if ((ip->frag_off & htons(IP_OFFSET|IP_MF)) == 0) { if (!ip_is_fragment(ip)) {
th = (struct tcphdr *)(((unsigned char *)ip) + th = (struct tcphdr *)(((unsigned char *)ip) +
ip->ihl*4); ip->ihl*4);
......
...@@ -652,7 +652,7 @@ int efx_filter_rfs(struct net_device *net_dev, const struct sk_buff *skb, ...@@ -652,7 +652,7 @@ int efx_filter_rfs(struct net_device *net_dev, const struct sk_buff *skb,
/* RFS must validate the IP header length before calling us */ /* RFS must validate the IP header length before calling us */
EFX_BUG_ON_PARANOID(!pskb_may_pull(skb, nhoff + sizeof(*ip))); EFX_BUG_ON_PARANOID(!pskb_may_pull(skb, nhoff + sizeof(*ip)));
ip = (const struct iphdr *)(skb->data + nhoff); ip = (const struct iphdr *)(skb->data + nhoff);
if (ip->frag_off & htons(IP_MF | IP_OFFSET)) if (ip_is_fragment(ip))
return -EPROTONOSUPPORT; return -EPROTONOSUPPORT;
EFX_BUG_ON_PARANOID(!pskb_may_pull(skb, nhoff + 4 * ip->ihl + 4)); EFX_BUG_ON_PARANOID(!pskb_may_pull(skb, nhoff + 4 * ip->ihl + 4));
ports = (const __be16 *)(skb->data + nhoff + 4 * ip->ihl); ports = (const __be16 *)(skb->data + nhoff + 4 * ip->ihl);
......
...@@ -633,7 +633,7 @@ static u32 vxge_get_vpath_no(struct vxgedev *vdev, struct sk_buff *skb) ...@@ -633,7 +633,7 @@ static u32 vxge_get_vpath_no(struct vxgedev *vdev, struct sk_buff *skb)
ip = ip_hdr(skb); ip = ip_hdr(skb);
if ((ip->frag_off & htons(IP_OFFSET|IP_MF)) == 0) { if (!ip_is_fragment(ip)) {
th = (struct tcphdr *)(((unsigned char *)ip) + th = (struct tcphdr *)(((unsigned char *)ip) +
ip->ihl*4); ip->ihl*4);
......
...@@ -250,6 +250,11 @@ int ip_decrease_ttl(struct iphdr *iph) ...@@ -250,6 +250,11 @@ int ip_decrease_ttl(struct iphdr *iph)
return --iph->ttl; return --iph->ttl;
} }
static inline bool ip_is_fragment(const struct iphdr *iph)
{
return (iph->frag_off & htons(IP_MF | IP_OFFSET)) != 0;
}
static inline static inline
int ip_dont_fragment(struct sock *sk, struct dst_entry *dst) int ip_dont_fragment(struct sock *sk, struct dst_entry *dst)
{ {
......
...@@ -2532,7 +2532,7 @@ __u32 __skb_get_rxhash(struct sk_buff *skb) ...@@ -2532,7 +2532,7 @@ __u32 __skb_get_rxhash(struct sk_buff *skb)
goto done; goto done;
ip = (const struct iphdr *) (skb->data + nhoff); ip = (const struct iphdr *) (skb->data + nhoff);
if (ip->frag_off & htons(IP_MF | IP_OFFSET)) if (ip_is_fragment(ip))
ip_proto = 0; ip_proto = 0;
else else
ip_proto = ip->protocol; ip_proto = ip->protocol;
......
...@@ -165,7 +165,7 @@ int ip_call_ra_chain(struct sk_buff *skb) ...@@ -165,7 +165,7 @@ int ip_call_ra_chain(struct sk_buff *skb)
(!sk->sk_bound_dev_if || (!sk->sk_bound_dev_if ||
sk->sk_bound_dev_if == dev->ifindex) && sk->sk_bound_dev_if == dev->ifindex) &&
net_eq(sock_net(sk), dev_net(dev))) { net_eq(sock_net(sk), dev_net(dev))) {
if (ip_hdr(skb)->frag_off & htons(IP_MF | IP_OFFSET)) { if (ip_is_fragment(ip_hdr(skb))) {
if (ip_defrag(skb, IP_DEFRAG_CALL_RA_CHAIN)) if (ip_defrag(skb, IP_DEFRAG_CALL_RA_CHAIN))
return 1; return 1;
} }
...@@ -256,7 +256,7 @@ int ip_local_deliver(struct sk_buff *skb) ...@@ -256,7 +256,7 @@ int ip_local_deliver(struct sk_buff *skb)
* Reassemble IP fragments. * Reassemble IP fragments.
*/ */
if (ip_hdr(skb)->frag_off & htons(IP_MF | IP_OFFSET)) { if (ip_is_fragment(ip_hdr(skb))) {
if (ip_defrag(skb, IP_DEFRAG_LOCAL_DELIVER)) if (ip_defrag(skb, IP_DEFRAG_LOCAL_DELIVER))
return 0; return 0;
} }
......
...@@ -489,7 +489,7 @@ int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) ...@@ -489,7 +489,7 @@ int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *))
if (first_len - hlen > mtu || if (first_len - hlen > mtu ||
((first_len - hlen) & 7) || ((first_len - hlen) & 7) ||
(iph->frag_off & htons(IP_MF|IP_OFFSET)) || ip_is_fragment(iph) ||
skb_cloned(skb)) skb_cloned(skb))
goto slow_path; goto slow_path;
......
...@@ -932,7 +932,7 @@ static int __init ic_bootp_recv(struct sk_buff *skb, struct net_device *dev, str ...@@ -932,7 +932,7 @@ static int __init ic_bootp_recv(struct sk_buff *skb, struct net_device *dev, str
goto drop; goto drop;
/* Fragments are not supported */ /* Fragments are not supported */
if (h->frag_off & htons(IP_OFFSET | IP_MF)) { if (ip_is_fragment(h)) {
if (net_ratelimit()) if (net_ratelimit())
printk(KERN_ERR "DHCP/BOOTP: Ignoring fragmented " printk(KERN_ERR "DHCP/BOOTP: Ignoring fragmented "
"reply.\n"); "reply.\n");
......
...@@ -82,7 +82,7 @@ static unsigned int ipv4_conntrack_defrag(unsigned int hooknum, ...@@ -82,7 +82,7 @@ static unsigned int ipv4_conntrack_defrag(unsigned int hooknum,
#endif #endif
#endif #endif
/* Gather fragments. */ /* Gather fragments. */
if (ip_hdr(skb)->frag_off & htons(IP_MF | IP_OFFSET)) { if (ip_is_fragment(ip_hdr(skb))) {
enum ip_defrag_users user = nf_ct_defrag_user(hooknum, skb); enum ip_defrag_users user = nf_ct_defrag_user(hooknum, skb);
if (nf_ct_ipv4_gather_frags(skb, user)) if (nf_ct_ipv4_gather_frags(skb, user))
return NF_STOLEN; return NF_STOLEN;
......
...@@ -88,7 +88,7 @@ nf_nat_fn(unsigned int hooknum, ...@@ -88,7 +88,7 @@ nf_nat_fn(unsigned int hooknum,
/* We never see fragments: conntrack defrags on pre-routing /* We never see fragments: conntrack defrags on pre-routing
and local-out, and nf_nat_out protects post-routing. */ and local-out, and nf_nat_out protects post-routing. */
NF_CT_ASSERT(!(ip_hdr(skb)->frag_off & htons(IP_MF | IP_OFFSET))); NF_CT_ASSERT(!ip_is_fragment(ip_hdr(skb)));
ct = nf_ct_get(skb, &ctinfo); ct = nf_ct_get(skb, &ctinfo);
/* Can't track? It's not due to stress, or conntrack would /* Can't track? It's not due to stress, or conntrack would
......
...@@ -117,7 +117,7 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse) ...@@ -117,7 +117,7 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse)
memset(fl4, 0, sizeof(struct flowi4)); memset(fl4, 0, sizeof(struct flowi4));
fl4->flowi4_mark = skb->mark; fl4->flowi4_mark = skb->mark;
if (!(iph->frag_off & htons(IP_MF | IP_OFFSET))) { if (!ip_is_fragment(iph)) {
switch (iph->protocol) { switch (iph->protocol) {
case IPPROTO_UDP: case IPPROTO_UDP:
case IPPROTO_UDPLITE: case IPPROTO_UDPLITE:
......
...@@ -852,7 +852,7 @@ static int ip_vs_out_icmp(struct sk_buff *skb, int *related, ...@@ -852,7 +852,7 @@ static int ip_vs_out_icmp(struct sk_buff *skb, int *related,
*related = 1; *related = 1;
/* reassemble IP fragments */ /* reassemble IP fragments */
if (ip_hdr(skb)->frag_off & htons(IP_MF | IP_OFFSET)) { if (ip_is_fragment(ip_hdr(skb))) {
if (ip_vs_gather_frags(skb, ip_vs_defrag_user(hooknum))) if (ip_vs_gather_frags(skb, ip_vs_defrag_user(hooknum)))
return NF_STOLEN; return NF_STOLEN;
} }
...@@ -1156,8 +1156,7 @@ ip_vs_out(unsigned int hooknum, struct sk_buff *skb, int af) ...@@ -1156,8 +1156,7 @@ ip_vs_out(unsigned int hooknum, struct sk_buff *skb, int af)
ip_vs_fill_iphdr(af, skb_network_header(skb), &iph); ip_vs_fill_iphdr(af, skb_network_header(skb), &iph);
} else } else
#endif #endif
if (unlikely(ip_hdr(skb)->frag_off & htons(IP_MF|IP_OFFSET) && if (unlikely(ip_is_fragment(ip_hdr(skb)) && !pp->dont_defrag)) {
!pp->dont_defrag)) {
if (ip_vs_gather_frags(skb, if (ip_vs_gather_frags(skb,
ip_vs_defrag_user(hooknum))) ip_vs_defrag_user(hooknum)))
return NF_STOLEN; return NF_STOLEN;
...@@ -1310,7 +1309,7 @@ ip_vs_in_icmp(struct sk_buff *skb, int *related, unsigned int hooknum) ...@@ -1310,7 +1309,7 @@ ip_vs_in_icmp(struct sk_buff *skb, int *related, unsigned int hooknum)
*related = 1; *related = 1;
/* reassemble IP fragments */ /* reassemble IP fragments */
if (ip_hdr(skb)->frag_off & htons(IP_MF | IP_OFFSET)) { if (ip_is_fragment(ip_hdr(skb))) {
if (ip_vs_gather_frags(skb, ip_vs_defrag_user(hooknum))) if (ip_vs_gather_frags(skb, ip_vs_defrag_user(hooknum)))
return NF_STOLEN; return NF_STOLEN;
} }
......
...@@ -121,7 +121,7 @@ static u32 flow_get_proto_src(struct sk_buff *skb) ...@@ -121,7 +121,7 @@ static u32 flow_get_proto_src(struct sk_buff *skb)
if (!pskb_network_may_pull(skb, sizeof(*iph))) if (!pskb_network_may_pull(skb, sizeof(*iph)))
break; break;
iph = ip_hdr(skb); iph = ip_hdr(skb);
if (iph->frag_off & htons(IP_MF | IP_OFFSET)) if (ip_is_fragment(iph))
break; break;
poff = proto_ports_offset(iph->protocol); poff = proto_ports_offset(iph->protocol);
if (poff >= 0 && if (poff >= 0 &&
...@@ -163,7 +163,7 @@ static u32 flow_get_proto_dst(struct sk_buff *skb) ...@@ -163,7 +163,7 @@ static u32 flow_get_proto_dst(struct sk_buff *skb)
if (!pskb_network_may_pull(skb, sizeof(*iph))) if (!pskb_network_may_pull(skb, sizeof(*iph)))
break; break;
iph = ip_hdr(skb); iph = ip_hdr(skb);
if (iph->frag_off & htons(IP_MF | IP_OFFSET)) if (ip_is_fragment(iph))
break; break;
poff = proto_ports_offset(iph->protocol); poff = proto_ports_offset(iph->protocol);
if (poff >= 0 && if (poff >= 0 &&
......
...@@ -167,7 +167,7 @@ static int rsvp_classify(struct sk_buff *skb, struct tcf_proto *tp, ...@@ -167,7 +167,7 @@ static int rsvp_classify(struct sk_buff *skb, struct tcf_proto *tp,
dst = &nhptr->daddr; dst = &nhptr->daddr;
protocol = nhptr->protocol; protocol = nhptr->protocol;
xprt = ((u8 *)nhptr) + (nhptr->ihl<<2); xprt = ((u8 *)nhptr) + (nhptr->ihl<<2);
if (nhptr->frag_off & htons(IP_MF | IP_OFFSET)) if (ip_is_fragment(nhptr))
return -1; return -1;
#endif #endif
......
...@@ -181,7 +181,7 @@ static bool choke_match_flow(struct sk_buff *skb1, ...@@ -181,7 +181,7 @@ static bool choke_match_flow(struct sk_buff *skb1,
ip1->saddr != ip2->saddr || ip1->daddr != ip2->daddr) ip1->saddr != ip2->saddr || ip1->daddr != ip2->daddr)
return false; return false;
if ((ip1->frag_off | ip2->frag_off) & htons(IP_MF | IP_OFFSET)) if (ip_is_fragment(ip1) | ip_is_fragment(ip2))
ip_proto = 0; ip_proto = 0;
off1 += ip1->ihl * 4; off1 += ip1->ihl * 4;
off2 += ip2->ihl * 4; off2 += ip2->ihl * 4;
......
...@@ -157,7 +157,7 @@ static unsigned int sfq_hash(struct sfq_sched_data *q, struct sk_buff *skb) ...@@ -157,7 +157,7 @@ static unsigned int sfq_hash(struct sfq_sched_data *q, struct sk_buff *skb)
iph = ip_hdr(skb); iph = ip_hdr(skb);
h = (__force u32)iph->daddr; h = (__force u32)iph->daddr;
h2 = (__force u32)iph->saddr ^ iph->protocol; h2 = (__force u32)iph->saddr ^ iph->protocol;
if (iph->frag_off & htons(IP_MF | IP_OFFSET)) if (ip_is_fragment(iph))
break; break;
poff = proto_ports_offset(iph->protocol); poff = proto_ports_offset(iph->protocol);
if (poff >= 0 && if (poff >= 0 &&
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment