diff options
| author | David S. Miller <davem@davemloft.net> | 2010-07-03 01:42:06 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2010-07-03 01:42:06 -0400 |
| commit | e490c1defec4236a6a131fe2d13bf7ba787c02f8 (patch) | |
| tree | 132325ca88cc86a74345a93b2774c5ca284b038a /net/ipv4 | |
| parent | 0a17d8c744e44617a3c22e7af68b4c5c9c1c5dba (diff) | |
| parent | 4df53d8bab65cf2c18daebd51a5a4847e03f1943 (diff) | |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/kaber/nf-next-2.6
Diffstat (limited to 'net/ipv4')
| -rw-r--r-- | net/ipv4/netfilter/ipt_LOG.c | 54 | ||||
| -rw-r--r-- | net/ipv4/netfilter/ipt_NETMAP.c | 6 | ||||
| -rw-r--r-- | net/ipv4/netfilter/nf_nat_rule.c | 10 | ||||
| -rw-r--r-- | net/ipv4/netfilter/nf_nat_standalone.c | 8 |
4 files changed, 51 insertions, 27 deletions
diff --git a/net/ipv4/netfilter/ipt_LOG.c b/net/ipv4/netfilter/ipt_LOG.c index 5234f4f3499a..915fc17d7ce2 100644 --- a/net/ipv4/netfilter/ipt_LOG.c +++ b/net/ipv4/netfilter/ipt_LOG.c | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | #include <linux/module.h> | 13 | #include <linux/module.h> |
| 14 | #include <linux/spinlock.h> | 14 | #include <linux/spinlock.h> |
| 15 | #include <linux/skbuff.h> | 15 | #include <linux/skbuff.h> |
| 16 | #include <linux/if_arp.h> | ||
| 16 | #include <linux/ip.h> | 17 | #include <linux/ip.h> |
| 17 | #include <net/icmp.h> | 18 | #include <net/icmp.h> |
| 18 | #include <net/udp.h> | 19 | #include <net/udp.h> |
| @@ -363,6 +364,42 @@ static void dump_packet(const struct nf_loginfo *info, | |||
| 363 | /* maxlen = 230+ 91 + 230 + 252 = 803 */ | 364 | /* maxlen = 230+ 91 + 230 + 252 = 803 */ |
| 364 | } | 365 | } |
| 365 | 366 | ||
| 367 | static void dump_mac_header(const struct nf_loginfo *info, | ||
| 368 | const struct sk_buff *skb) | ||
| 369 | { | ||
| 370 | struct net_device *dev = skb->dev; | ||
| 371 | unsigned int logflags = 0; | ||
| 372 | |||
| 373 | if (info->type == NF_LOG_TYPE_LOG) | ||
| 374 | logflags = info->u.log.logflags; | ||
| 375 | |||
| 376 | if (!(logflags & IPT_LOG_MACDECODE)) | ||
| 377 | goto fallback; | ||
| 378 | |||
| 379 | switch (dev->type) { | ||
| 380 | case ARPHRD_ETHER: | ||
| 381 | printk("MACSRC=%pM MACDST=%pM MACPROTO=%04x ", | ||
| 382 | eth_hdr(skb)->h_source, eth_hdr(skb)->h_dest, | ||
| 383 | ntohs(eth_hdr(skb)->h_proto)); | ||
| 384 | return; | ||
| 385 | default: | ||
| 386 | break; | ||
| 387 | } | ||
| 388 | |||
| 389 | fallback: | ||
| 390 | printk("MAC="); | ||
| 391 | if (dev->hard_header_len && | ||
| 392 | skb->mac_header != skb->network_header) { | ||
| 393 | const unsigned char *p = skb_mac_header(skb); | ||
| 394 | unsigned int i; | ||
| 395 | |||
| 396 | printk("%02x", *p++); | ||
| 397 | for (i = 1; i < dev->hard_header_len; i++, p++) | ||
| 398 | printk(":%02x", *p); | ||
| 399 | } | ||
| 400 | printk(" "); | ||
| 401 | } | ||
| 402 | |||
| 366 | static struct nf_loginfo default_loginfo = { | 403 | static struct nf_loginfo default_loginfo = { |
| 367 | .type = NF_LOG_TYPE_LOG, | 404 | .type = NF_LOG_TYPE_LOG, |
| 368 | .u = { | 405 | .u = { |
| @@ -404,20 +441,9 @@ ipt_log_packet(u_int8_t pf, | |||
| 404 | } | 441 | } |
| 405 | #endif | 442 | #endif |
| 406 | 443 | ||
| 407 | if (in && !out) { | 444 | /* MAC logging for input path only. */ |
| 408 | /* MAC logging for input chain only. */ | 445 | if (in && !out) |
| 409 | printk("MAC="); | 446 | dump_mac_header(loginfo, skb); |
| 410 | if (skb->dev && skb->dev->hard_header_len && | ||
| 411 | skb->mac_header != skb->network_header) { | ||
| 412 | int i; | ||
| 413 | const unsigned char *p = skb_mac_header(skb); | ||
| 414 | for (i = 0; i < skb->dev->hard_header_len; i++,p++) | ||
| 415 | printk("%02x%c", *p, | ||
| 416 | i==skb->dev->hard_header_len - 1 | ||
| 417 | ? ' ':':'); | ||
| 418 | } else | ||
| 419 | printk(" "); | ||
| 420 | } | ||
| 421 | 447 | ||
| 422 | dump_packet(loginfo, skb, 0); | 448 | dump_packet(loginfo, skb, 0); |
| 423 | printk("\n"); | 449 | printk("\n"); |
diff --git a/net/ipv4/netfilter/ipt_NETMAP.c b/net/ipv4/netfilter/ipt_NETMAP.c index f43867d1697f..6cdb298f1035 100644 --- a/net/ipv4/netfilter/ipt_NETMAP.c +++ b/net/ipv4/netfilter/ipt_NETMAP.c | |||
| @@ -48,7 +48,8 @@ netmap_tg(struct sk_buff *skb, const struct xt_action_param *par) | |||
| 48 | 48 | ||
| 49 | NF_CT_ASSERT(par->hooknum == NF_INET_PRE_ROUTING || | 49 | NF_CT_ASSERT(par->hooknum == NF_INET_PRE_ROUTING || |
| 50 | par->hooknum == NF_INET_POST_ROUTING || | 50 | par->hooknum == NF_INET_POST_ROUTING || |
| 51 | par->hooknum == NF_INET_LOCAL_OUT); | 51 | par->hooknum == NF_INET_LOCAL_OUT || |
| 52 | par->hooknum == NF_INET_LOCAL_IN); | ||
| 52 | ct = nf_ct_get(skb, &ctinfo); | 53 | ct = nf_ct_get(skb, &ctinfo); |
| 53 | 54 | ||
| 54 | netmask = ~(mr->range[0].min_ip ^ mr->range[0].max_ip); | 55 | netmask = ~(mr->range[0].min_ip ^ mr->range[0].max_ip); |
| @@ -77,7 +78,8 @@ static struct xt_target netmap_tg_reg __read_mostly = { | |||
| 77 | .table = "nat", | 78 | .table = "nat", |
| 78 | .hooks = (1 << NF_INET_PRE_ROUTING) | | 79 | .hooks = (1 << NF_INET_PRE_ROUTING) | |
| 79 | (1 << NF_INET_POST_ROUTING) | | 80 | (1 << NF_INET_POST_ROUTING) | |
| 80 | (1 << NF_INET_LOCAL_OUT), | 81 | (1 << NF_INET_LOCAL_OUT) | |
| 82 | (1 << NF_INET_LOCAL_IN), | ||
| 81 | .checkentry = netmap_tg_check, | 83 | .checkentry = netmap_tg_check, |
| 82 | .me = THIS_MODULE | 84 | .me = THIS_MODULE |
| 83 | }; | 85 | }; |
diff --git a/net/ipv4/netfilter/nf_nat_rule.c b/net/ipv4/netfilter/nf_nat_rule.c index 98ed78281aee..ebbd319f62f5 100644 --- a/net/ipv4/netfilter/nf_nat_rule.c +++ b/net/ipv4/netfilter/nf_nat_rule.c | |||
| @@ -28,7 +28,8 @@ | |||
| 28 | 28 | ||
| 29 | #define NAT_VALID_HOOKS ((1 << NF_INET_PRE_ROUTING) | \ | 29 | #define NAT_VALID_HOOKS ((1 << NF_INET_PRE_ROUTING) | \ |
| 30 | (1 << NF_INET_POST_ROUTING) | \ | 30 | (1 << NF_INET_POST_ROUTING) | \ |
| 31 | (1 << NF_INET_LOCAL_OUT)) | 31 | (1 << NF_INET_LOCAL_OUT) | \ |
| 32 | (1 << NF_INET_LOCAL_IN)) | ||
| 32 | 33 | ||
| 33 | static const struct xt_table nat_table = { | 34 | static const struct xt_table nat_table = { |
| 34 | .name = "nat", | 35 | .name = "nat", |
| @@ -45,7 +46,8 @@ ipt_snat_target(struct sk_buff *skb, const struct xt_action_param *par) | |||
| 45 | enum ip_conntrack_info ctinfo; | 46 | enum ip_conntrack_info ctinfo; |
| 46 | const struct nf_nat_multi_range_compat *mr = par->targinfo; | 47 | const struct nf_nat_multi_range_compat *mr = par->targinfo; |
| 47 | 48 | ||
| 48 | NF_CT_ASSERT(par->hooknum == NF_INET_POST_ROUTING); | 49 | NF_CT_ASSERT(par->hooknum == NF_INET_POST_ROUTING || |
| 50 | par->hooknum == NF_INET_LOCAL_IN); | ||
| 49 | 51 | ||
| 50 | ct = nf_ct_get(skb, &ctinfo); | 52 | ct = nf_ct_get(skb, &ctinfo); |
| 51 | 53 | ||
| @@ -99,7 +101,7 @@ static int ipt_dnat_checkentry(const struct xt_tgchk_param *par) | |||
| 99 | return 0; | 101 | return 0; |
| 100 | } | 102 | } |
| 101 | 103 | ||
| 102 | unsigned int | 104 | static unsigned int |
| 103 | alloc_null_binding(struct nf_conn *ct, unsigned int hooknum) | 105 | alloc_null_binding(struct nf_conn *ct, unsigned int hooknum) |
| 104 | { | 106 | { |
| 105 | /* Force range to this IP; let proto decide mapping for | 107 | /* Force range to this IP; let proto decide mapping for |
| @@ -141,7 +143,7 @@ static struct xt_target ipt_snat_reg __read_mostly = { | |||
| 141 | .target = ipt_snat_target, | 143 | .target = ipt_snat_target, |
| 142 | .targetsize = sizeof(struct nf_nat_multi_range_compat), | 144 | .targetsize = sizeof(struct nf_nat_multi_range_compat), |
| 143 | .table = "nat", | 145 | .table = "nat", |
| 144 | .hooks = 1 << NF_INET_POST_ROUTING, | 146 | .hooks = (1 << NF_INET_POST_ROUTING) | (1 << NF_INET_LOCAL_IN), |
| 145 | .checkentry = ipt_snat_checkentry, | 147 | .checkentry = ipt_snat_checkentry, |
| 146 | .family = AF_INET, | 148 | .family = AF_INET, |
| 147 | }; | 149 | }; |
diff --git a/net/ipv4/netfilter/nf_nat_standalone.c b/net/ipv4/netfilter/nf_nat_standalone.c index 6723c682250d..95481fee8bdb 100644 --- a/net/ipv4/netfilter/nf_nat_standalone.c +++ b/net/ipv4/netfilter/nf_nat_standalone.c | |||
| @@ -131,13 +131,7 @@ nf_nat_fn(unsigned int hooknum, | |||
| 131 | if (!nf_nat_initialized(ct, maniptype)) { | 131 | if (!nf_nat_initialized(ct, maniptype)) { |
| 132 | unsigned int ret; | 132 | unsigned int ret; |
| 133 | 133 | ||
| 134 | if (hooknum == NF_INET_LOCAL_IN) | 134 | ret = nf_nat_rule_find(skb, hooknum, in, out, ct); |
| 135 | /* LOCAL_IN hook doesn't have a chain! */ | ||
| 136 | ret = alloc_null_binding(ct, hooknum); | ||
| 137 | else | ||
| 138 | ret = nf_nat_rule_find(skb, hooknum, in, out, | ||
| 139 | ct); | ||
| 140 | |||
| 141 | if (ret != NF_ACCEPT) | 135 | if (ret != NF_ACCEPT) |
| 142 | return ret; | 136 | return ret; |
| 143 | } else | 137 | } else |
