mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 03:01:39 -04:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (26 commits) decnet: Fix compiler warning in dn_dev.c IPV6: Fix default gateway criteria wrt. HIGH/LOW preference radv option net/802/fc.c: Fix compilation warnings netns: correct mib stats in ip6_route_me_harder() netns: fix net_generic array leak rt2x00: fix regression introduced by "mac80211: free up 2 bytes in skb->cb" rtl8187: Add USB ID for Belkin F5D7050 with RTL8187B chip p54usb: Device ID updates mac80211: fixme for kernel-doc ath9k/mac80211: disallow fragmentation in ath9k, report to userspace libertas : Remove unused variable warning for "old_channel" from cmd.c mac80211: Fix scan RX processing oops orinoco: fix unsafe locking in spectrum_cs_suspend orinoco: fix unsafe locking in orinoco_cs_resume cfg80211: fix debugfs error handling mac80211: fix debugfs netdev rename iwlwifi: fix ct kill configuration for 5350 mac80211: fix HT information element parsing p54: Fix compilation problem on PPC mac80211: fix debugfs lockup ...
This commit is contained in:
commit
cb23832e39
36 changed files with 268 additions and 137 deletions
|
|
@ -41,12 +41,13 @@ static unsigned int ipv4_conntrack_defrag(unsigned int hooknum,
|
|||
int (*okfn)(struct sk_buff *))
|
||||
{
|
||||
#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
|
||||
#if !defined(CONFIG_NF_NAT) && !defined(CONFIG_NF_NAT_MODULE)
|
||||
/* Previously seen (loopback)? Ignore. Do this before
|
||||
fragment check. */
|
||||
if (skb->nfct)
|
||||
return NF_ACCEPT;
|
||||
#endif
|
||||
|
||||
#endif
|
||||
/* Gather fragments. */
|
||||
if (ip_hdr(skb)->frag_off & htons(IP_MF | IP_OFFSET)) {
|
||||
if (nf_ct_ipv4_gather_frags(skb,
|
||||
|
|
|
|||
|
|
@ -584,6 +584,98 @@ static struct nf_ct_ext_type nat_extend __read_mostly = {
|
|||
.flags = NF_CT_EXT_F_PREALLOC,
|
||||
};
|
||||
|
||||
#if defined(CONFIG_NF_CT_NETLINK) || defined(CONFIG_NF_CT_NETLINK_MODULE)
|
||||
|
||||
#include <linux/netfilter/nfnetlink.h>
|
||||
#include <linux/netfilter/nfnetlink_conntrack.h>
|
||||
|
||||
static const struct nla_policy protonat_nla_policy[CTA_PROTONAT_MAX+1] = {
|
||||
[CTA_PROTONAT_PORT_MIN] = { .type = NLA_U16 },
|
||||
[CTA_PROTONAT_PORT_MAX] = { .type = NLA_U16 },
|
||||
};
|
||||
|
||||
static int nfnetlink_parse_nat_proto(struct nlattr *attr,
|
||||
const struct nf_conn *ct,
|
||||
struct nf_nat_range *range)
|
||||
{
|
||||
struct nlattr *tb[CTA_PROTONAT_MAX+1];
|
||||
const struct nf_nat_protocol *npt;
|
||||
int err;
|
||||
|
||||
err = nla_parse_nested(tb, CTA_PROTONAT_MAX, attr, protonat_nla_policy);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
npt = nf_nat_proto_find_get(nf_ct_protonum(ct));
|
||||
if (npt->nlattr_to_range)
|
||||
err = npt->nlattr_to_range(tb, range);
|
||||
nf_nat_proto_put(npt);
|
||||
return err;
|
||||
}
|
||||
|
||||
static const struct nla_policy nat_nla_policy[CTA_NAT_MAX+1] = {
|
||||
[CTA_NAT_MINIP] = { .type = NLA_U32 },
|
||||
[CTA_NAT_MAXIP] = { .type = NLA_U32 },
|
||||
};
|
||||
|
||||
static int
|
||||
nfnetlink_parse_nat(struct nlattr *nat,
|
||||
const struct nf_conn *ct, struct nf_nat_range *range)
|
||||
{
|
||||
struct nlattr *tb[CTA_NAT_MAX+1];
|
||||
int err;
|
||||
|
||||
memset(range, 0, sizeof(*range));
|
||||
|
||||
err = nla_parse_nested(tb, CTA_NAT_MAX, nat, nat_nla_policy);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
if (tb[CTA_NAT_MINIP])
|
||||
range->min_ip = nla_get_be32(tb[CTA_NAT_MINIP]);
|
||||
|
||||
if (!tb[CTA_NAT_MAXIP])
|
||||
range->max_ip = range->min_ip;
|
||||
else
|
||||
range->max_ip = nla_get_be32(tb[CTA_NAT_MAXIP]);
|
||||
|
||||
if (range->min_ip)
|
||||
range->flags |= IP_NAT_RANGE_MAP_IPS;
|
||||
|
||||
if (!tb[CTA_NAT_PROTO])
|
||||
return 0;
|
||||
|
||||
err = nfnetlink_parse_nat_proto(tb[CTA_NAT_PROTO], ct, range);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
nfnetlink_parse_nat_setup(struct nf_conn *ct,
|
||||
enum nf_nat_manip_type manip,
|
||||
struct nlattr *attr)
|
||||
{
|
||||
struct nf_nat_range range;
|
||||
|
||||
if (nfnetlink_parse_nat(attr, ct, &range) < 0)
|
||||
return -EINVAL;
|
||||
if (nf_nat_initialized(ct, manip))
|
||||
return -EEXIST;
|
||||
|
||||
return nf_nat_setup_info(ct, &range, manip);
|
||||
}
|
||||
#else
|
||||
static int
|
||||
nfnetlink_parse_nat_setup(struct nf_conn *ct,
|
||||
enum nf_nat_manip_type manip,
|
||||
struct nlattr *attr)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int __net_init nf_nat_net_init(struct net *net)
|
||||
{
|
||||
net->ipv4.nat_bysource = nf_ct_alloc_hashtable(&nf_nat_htable_size,
|
||||
|
|
@ -654,6 +746,9 @@ static int __init nf_nat_init(void)
|
|||
|
||||
BUG_ON(nf_nat_seq_adjust_hook != NULL);
|
||||
rcu_assign_pointer(nf_nat_seq_adjust_hook, nf_nat_seq_adjust);
|
||||
BUG_ON(nfnetlink_parse_nat_setup_hook != NULL);
|
||||
rcu_assign_pointer(nfnetlink_parse_nat_setup_hook,
|
||||
nfnetlink_parse_nat_setup);
|
||||
return 0;
|
||||
|
||||
cleanup_extend:
|
||||
|
|
@ -667,10 +762,12 @@ static void __exit nf_nat_cleanup(void)
|
|||
nf_ct_l3proto_put(l3proto);
|
||||
nf_ct_extend_unregister(&nat_extend);
|
||||
rcu_assign_pointer(nf_nat_seq_adjust_hook, NULL);
|
||||
rcu_assign_pointer(nfnetlink_parse_nat_setup_hook, NULL);
|
||||
synchronize_net();
|
||||
}
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("nf-nat-ipv4");
|
||||
|
||||
module_init(nf_nat_init);
|
||||
module_exit(nf_nat_cleanup);
|
||||
|
|
|
|||
Loading…
Reference in a new issue