netfilter: ipt_CLUSTERIP: use proto_ports_offset() to support AH message
Subsystems (3)
PATCH 6/8 netfilter: ipt_CLUSTERIP: use proto_ports_offset() to support AH message
--- net/ipv4/netfilter/ipt_CLUSTERIP.c | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-)
net/ipv4/netfilter/ipt_CLUSTERIP.c +18 -16
@@ -29,6 +29,7 @@#include <net/netfilter/nf_conntrack.h> #include <net/net_namespace.h> #include <net/checksum.h> +#include <net/ip.h> #define CLUSTERIP_VERSION "0.8"
@@ -231,24 +232,25 @@ clusterip_hashfn(const struct sk_buff *skb, {const struct iphdr *iph =ip_hdr (skb);unsigned long hashval; -u_int16_t sport, dport; +u_int16_t sport =0 , dport =0 ;const u_int16_t *ports; -switch (iph->protocol) { -case IPPROTO_TCP : -case IPPROTO_UDP : -case IPPROTO_UDPLITE : -case IPPROTO_SCTP : -case IPPROTO_DCCP : -case IPPROTO_ICMP : - ports = (const void *)iph+iph->ihl*4 ; - sport = ports[0 ]; - dport = ports[1 ]; -break ; -default : -if (net_ratelimit ()) -pr_info ("unknown protocol %u\n" , iph->protocol); - sport = dport =0 ; +if (!(iph->frag_off &htons (IP_MF |IP_OFFSET ))) { +int poff; + + poff =proto_ports_offset (iph->protocol); +if (poff >=0 ) { +u16 _ports[2 ]; + ports =skb_header_pointer (skb, iph->ihl *4 + poff, +4 , _ports); +if (ports) { + sport = ports[0 ]; + dport = ports[1 ]; + } + }else { +if (net_ratelimit ()) +pr_info ("unknown protocol %u\n" , iph->protocol); + } }switch (config->hash_mode) {
Quoted 30 lines · Changli Gao
Signed-off-by Changli Gao <[email protected]>--- net/ipv4/netfilter/ipt_CLUSTERIP.c | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-)net/ipv4/netfilter/ipt_CLUSTERIP.c +2
-7@@ -29,6 +29,7 @@#include <net/netfilter/nf_conntrack.h> #include <net/net_namespace.h> #include <net/checksum.h> +#include <net/ip.h> #define CLUSTERIP_VERSION "0.8"@@ -231,24 +232,25 @@ clusterip_hashfn(const struct sk_buff *skb, {const struct iphdr *iph =ip_hdr (skb);unsigned long hashval; -u_int16_t sport, dport; +u_int16_t sport =0 , dport =0 ;const u_int16_t *ports; -switch (iph->protocol) { -case IPPROTO_TCP : -case IPPROTO_UDP : -case IPPROTO_UDPLITE : -case IPPROTO_SCTP : -case IPPROTO_DCCP :
net/ipv4/netfilter/ipt_CLUSTERIP.c clusterip_hashfn(const struct sk_buff *skb, · line 238
Quoted 10 lines
net/ipv4/netfilter/ipt_CLUSTERIP.c +1
-9-case IPPROTO_ICMP : - ports = (const void *)iph+iph->ihl*4 ; - sport = ports[0 ]; - dport = ports[1 ]; -break ; -default : -if (net_ratelimit ()) -pr_info ("unknown protocol %u\n" , iph->protocol); - sport = dport =0 ; +if (!(iph->frag_off &htons (IP_MF |IP_OFFSET ))) {
This added test is not documented in your Changelog
Please dont add such things not telling why you do it.
I am not sure it is needed here, I dont know ipt_CLUSTERIP, but dont defrag takes place before it ?
Quoted 18 lines
net/ipv4/netfilter/ipt_CLUSTERIP.c +15
-0+int poff; + + poff =proto_ports_offset (iph->protocol); +if (poff >=0 ) { +u16 _ports[2 ]; + ports =skb_header_pointer (skb, iph->ihl *4 + poff, +4 , _ports); +if (ports) { + sport = ports[0 ]; + dport = ports[1 ]; + } + }else { +if (net_ratelimit ()) +pr_info ("unknown protocol %u\n" , iph->protocol); + } }switch (config->hash_mode) {
Quoted 7 lines · Eric Dumazet
This added test is not documented in your Changelog
Please dont add such things not telling why you do it.
I am not sure it is needed here, I dont know
ipt_CLUSTERIP, but dont defrag takes place before it ?
You are right. ipt_CLUSTERIP relies on ip_conntrack, and defrag takes place before it. Thanks. I'll post an update.
Signature · 2 lines
Regards, Changli Gao([email protected])
David Miller
maintainerFrom: Changli Gao <[email protected]>
Date: Wed, 18 Aug 2010 13:05:52 +0800
Quoted 1 line
Signed-off-by Changli Gao <[email protected]>
I applied the updated v2 version of this patch.