Netfilter: Fix Up IRC, AMANDA, TFTP and SNMP Helpers
Subsystems (2)
PATCH 3/8 Netfilter: Fix Up IRC, AMANDA, TFTP and SNMP Helpers
Name: Fix Up IRC, AMANDA, TFTP and SNMP Helpers
Status: Compiled on 2.6.10-rc2-bk6
Signed-off-by Rusty Russell <[email protected]>
Fixes up the other helpers for direct conntrack->NAT helper calling. SNMP doesn't really need a conntrack helper, but under this new model, the NAT helper will register at that point anyway: NAT helpers themselves are removed.
net/ipv4/netfilter/ip_nat_core.c +0 -14
@@ -415,10 +415,6 @@IP_NF_ASSERT (info->num_manips <=IP_NAT_MAX_MANIPS ); } -/* If there's a helper, assign it; based on new tuple. */ -if (!conntrack->master) - info->helper =__ip_nat_find_helper (&reply); -/* It's done. */ info->initialized |= (1 <<HOOK2MANIP (hooknum));
@@ -523,16 +519,6 @@ } } } - -if (info->helper) { -DEBUGP ("do_bindings: helper existing for (%p)\n" , ct); - -/* Always defragged for helpers */ -IP_NF_ASSERT (!((*pskb)->nh.iph->frag_off - &htons (IP_MF |IP_OFFSET ))); - - ret = info->helper->help (ct,NULL , info, ctinfo, hooknum,pskb); - }READ_UNLOCK (&ip_nat_lock);/* FIXME: NAT/conntrack helpers should set ctinfo &
include/linux/netfilter_ipv4/ip_nat_helper.h +0 -34
@@ -7,40 +7,6 @@struct sk_buff ; -/* Flags */ -/* NAT helper must be called on every packet (for TCP) */ -#define IP_NAT_HELPER_F_ALWAYS 0x01 - -struct ip_nat_helper -{ -struct list_head list;/* Internal use */ - -const char *name;/* name of the module */ -unsigned char flags;/* Flags (see above) */ -struct module *me;/* pointer to self */ - -/* Mask of things we will help: vs. tuple from server */ -struct ip_conntrack_tuple tuple; -struct ip_conntrack_tuple mask; - -/* Helper function: returns verdict */ -unsigned int (*help)(struct ip_conntrack *ct, -struct ip_conntrack_expect *exp, -struct ip_nat_info *info, -enum ip_conntrack_info ctinfo, -unsigned int hooknum, -struct sk_buff **pskb); -}; - -extern int ip_nat_helper_register (struct ip_nat_helper *me); -extern void ip_nat_helper_unregister (struct ip_nat_helper *me); - -extern struct ip_nat_helper * -ip_nat_find_helper (const struct ip_conntrack_tuple *tuple); - -extern struct ip_nat_helper * -__ip_nat_find_helper (const struct ip_conntrack_tuple *tuple); -/* These return true or false. */ extern int ip_nat_mangle_tcp_packet(struct sk_buff **skb, struct ip_conntrack *ct,
net/ipv4/netfilter/ip_nat_helper.c +0 -74
83 lines not on this page · raw message
net/ipv4/netfilter/ip_conntrack_amanda.c +31 -19
104 lines not on this page · raw message
net/ipv4/netfilter/ip_nat_snmp_basic.c +58 -50
160 lines not on this page · raw message
include/linux/netfilter_ipv4/ip_conntrack.h +0 -16
@@ -79,11 +79,6 @@#ifdef CONFIG_IP_NF_NAT_NEEDED #include <linux/netfilter_ipv4/ip_nat.h> - -/* per conntrack: nat application helper private data */ -union ip_conntrack_nat_help { -/* insert nat helper private data here */ -};#endif #include <linux/types.h>
@@ -191,7 +186,6 @@ #ifdef CONFIG_IP_NF_NAT_NEEDED struct { struct ip_nat_info info; - union ip_conntrack_nat_help help; #if defined(CONFIG_IP_NF_TARGET_MASQUERADE) || \ defined(CONFIG_IP_NF_TARGET_MASQUERADE_MODULE) int masq_index;
@@ -303,15 +297,5 @@#define CONNTRACK_STAT_INC (count) (__get_cpu_var(ip_conntrack_stat).count++) -/* eg. PROVIDES_CONNTRACK(ftp); */ -#define PROVIDES_CONNTRACK (name) \ - int needs_ip_conntrack_##name; \ - EXPORT_SYMBOL(needs_ip_conntrack_##name) - -/*. eg. NEEDS_CONNTRACK(ftp); */ -#define NEEDS_CONNTRACK (name) \ - extern int needs_ip_conntrack_##name; \ - static int *need_ip_conntrack_##name __attribute_used__ = &needs_ip_conntrack_##name -#endif /* __KERNEL__ */ #endif /* _IP_CONNTRACK_H */
net/ipv4/netfilter/ip_nat_amanda.c +39 -94
157 lines not on this page · raw message
net/ipv4/netfilter/ip_conntrack_tftp.c +15 -8
@@ -38,15 +38,22 @@ #define DEBUGP(format, args...)#endif -static int tftp_help (struct sk_buff *skb, +unsigned int (*ip_nat_tftp_hook)(struct sk_buff **pskb, +struct ip_conntrack *ct, +enum ip_conntrack_info ctinfo, +struct ip_conntrack_expect *exp); +EXPORT_SYMBOL_GPL (ip_nat_tftp_hook); + +static int tftp_help (struct sk_buff **pskb,struct ip_conntrack *ct,enum ip_conntrack_info ctinfo) {struct tftphdr _tftph, *tfh;struct ip_conntrack_expect *exp; +unsigned int ret =NF_ACCEPT ; - tfh =skb_header_pointer (skb, - skb->nh.iph->ihl *4 +sizeof (struct udphdr ), + tfh =skb_header_pointer (*pskb, + (*pskb)->nh.iph->ihl*4 +sizeof (struct udphdr ),sizeof (_tftph), &_tftph);if (tfh ==NULL )return NF_ACCEPT ;
@@ -61,7 +68,7 @@ exp =ip_conntrack_expect_alloc ();if (exp ==NULL ) -return NF_ACCEPT ; +return NF_DROP ; exp->tuple = ct->tuplehash[IP_CT_DIR_REPLY ].tuple; exp->mask.src.ip =0xffffffff ;
@@ -73,7 +80,10 @@DEBUGP ("expect: " );DUMP_TUPLE (&exp->tuple);DUMP_TUPLE (&exp->mask); -ip_conntrack_expect_related (exp, ct); +if (ip_nat_tftp_hook) + ret =ip_nat_tftp_hook (pskb, ct, ctinfo, exp); +else if (ip_conntrack_expect_related (exp, ct) !=0 ) + ret =NF_DROP ;break ;case TFTP_OPCODE_DATA :case TFTP_OPCODE_ACK :
@@ -120,7 +130,6 @@ tftp[i].mask.src.u.udp.port =0xFFFF ; tftp[i].max_expected =1 ; tftp[i].timeout =0 ; - tftp[i].flags =IP_CT_HELPER_F_REUSE_EXPECT ; tftp[i].me =THIS_MODULE ; tftp[i].help = tftp_help;
@@ -144,7 +153,5 @@return (0 ); } -PROVIDES_CONNTRACK (tftp); -module_init (init);module_exit (fini);
net/ipv4/netfilter/ip_nat_tftp.c +17 -152
185 lines not on this page · raw message
net/ipv4/netfilter/ip_nat_irc.c +44 -185
279 lines not on this page · raw message
include/linux/netfilter_ipv4/ip_conntrack_tftp.h +5 -0
@@ -13,4 +13,9 @@#define TFTP_OPCODE_ACK 4#define TFTP_OPCODE_ERROR 5 +unsigned int (*ip_nat_tftp_hook)(struct sk_buff **pskb, +struct ip_conntrack *ct, +enum ip_conntrack_info ctinfo, +struct ip_conntrack_expect *exp); +#endif /* _IP_CT_TFTP */
net/ipv4/netfilter/ip_conntrack_irc.c +29 -32
133 lines not on this page · raw message
include/linux/netfilter_ipv4/ip_conntrack_irc.h +6 -13
@@ -14,24 +14,17 @@#ifndef _IP_CONNTRACK_IRC_H#define _IP_CONNTRACK_IRC_H -/* We record seq number and length of irc ip/port text here: all in -host order. */ - -/* This structure is per expected connection */ -struct ip_ct_irc_expect -{ -/* length of IP address */ -u_int32_t len; -/* Port that was to be used */ -u_int16_t port; -}; -/* This structure exists only once per master */ struct ip_ct_irc_master { }; -#ifdef __KERNEL__ +extern unsigned int (*ip_nat_irc_hook)(struct sk_buff **pskb, +struct ip_conntrack *ct, +enum ip_conntrack_info ctinfo, +unsigned int matchoff, +unsigned int matchlen, +struct ip_conntrack_expect *exp);#define IRC_PORT 6667
include/linux/netfilter_ipv4/ip_conntrack_amanda.h +7 -7
@@ -2,11 +2,11 @@#define _IP_CONNTRACK_AMANDA_H/* AMANDA tracking. */ -struct ip_ct_amanda_expect -{ -u_int16_t port;/* port number of this expectation */ -u_int16_t offset;/* offset of port in ctrl packet */ -u_int16_t len;/* length of the port number string */ -}; - +struct ip_conntrack_expect ; +extern unsigned int (*ip_nat_amanda_hook)(struct sk_buff **pskb, +struct ip_conntrack *ct, +enum ip_conntrack_info ctinfo, +unsigned int matchoff, +unsigned int matchlen, +struct ip_conntrack_expect *exp);#endif /* _IP_CONNTRACK_AMANDA_H */