diff options
| author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-11-09 18:07:57 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-11-09 18:07:57 -0500 |
| commit | c5b875e354a54e2b5ba24eecae69bf94e025edd5 (patch) | |
| tree | 0446a68d99ad50305ab78835456d9faa62be5948 /net | |
| parent | eae1920a21b4f87e89cea802e7df39442b119617 (diff) | |
| parent | c3d8d1e30cace31fed6186a4b8c6b1401836d89c (diff) | |
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
* 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6: (44 commits)
[NETLINK]: Fix unicast timeouts
[INET]: Remove per bucket rwlock in tcp/dccp ehash table.
[IPVS]: Synchronize closing of Connections
[IPVS]: Bind connections on stanby if the destination exists
[NET]: Remove Documentation/networking/pt.txt
[NET]: Remove Documentation/networking/routing.txt
[NET]: Remove Documentation/networking/ncsa-telnet
[NET]: Remove comx driver docs.
[NET]: Remove Documentation/networking/Configurable
[NET]: Clean proto_(un)register from in-code ifdefs
[IPSEC]: Fix crypto_alloc_comp error checking
[VLAN]: Fix SET_VLAN_INGRESS_PRIORITY_CMD ioctl
[NETNS]: Fix compiler error in net_namespace.c
[TTY]: Use tty_mode_ioctl() in network drivers.
[TTY]: Fix network driver interactions with TCGET/SET calls.
[PKT_SCHED] CLS_U32: Fix endianness problem with u32 classifier hash masks.
[NET]: Removing duplicit #includes
[NET]: Let USB_USBNET always select MII.
[RRUNNER]: Do not muck with sysctl_{r,w}mem_max
[DLM] lowcomms: Do not muck with sysctl_rmem_max.
...
Diffstat (limited to 'net')
58 files changed, 443 insertions, 336 deletions
diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c index 3fe4fc86055f..1037748c14db 100644 --- a/net/8021q/vlan.c +++ b/net/8021q/vlan.c | |||
| @@ -747,6 +747,7 @@ static int vlan_ioctl_handler(struct net *net, void __user *arg) | |||
| 747 | vlan_dev_set_ingress_priority(dev, | 747 | vlan_dev_set_ingress_priority(dev, |
| 748 | args.u.skb_priority, | 748 | args.u.skb_priority, |
| 749 | args.vlan_qos); | 749 | args.vlan_qos); |
| 750 | err = 0; | ||
| 750 | break; | 751 | break; |
| 751 | 752 | ||
| 752 | case SET_VLAN_EGRESS_PRIORITY_CMD: | 753 | case SET_VLAN_EGRESS_PRIORITY_CMD: |
diff --git a/net/bridge/netfilter/ebt_arp.c b/net/bridge/netfilter/ebt_arp.c index 1a46952a56d9..18141392a9b4 100644 --- a/net/bridge/netfilter/ebt_arp.c +++ b/net/bridge/netfilter/ebt_arp.c | |||
| @@ -34,7 +34,7 @@ static int ebt_filter_arp(const struct sk_buff *skb, const struct net_device *in | |||
| 34 | ah->ar_pro, EBT_ARP_PTYPE)) | 34 | ah->ar_pro, EBT_ARP_PTYPE)) |
| 35 | return EBT_NOMATCH; | 35 | return EBT_NOMATCH; |
| 36 | 36 | ||
| 37 | if (info->bitmask & (EBT_ARP_SRC_IP | EBT_ARP_DST_IP)) { | 37 | if (info->bitmask & (EBT_ARP_SRC_IP | EBT_ARP_DST_IP | EBT_ARP_GRAT)) { |
| 38 | __be32 saddr, daddr, *sap, *dap; | 38 | __be32 saddr, daddr, *sap, *dap; |
| 39 | 39 | ||
| 40 | if (ah->ar_pln != sizeof(__be32) || ah->ar_pro != htons(ETH_P_IP)) | 40 | if (ah->ar_pln != sizeof(__be32) || ah->ar_pro != htons(ETH_P_IP)) |
diff --git a/net/core/dst.c b/net/core/dst.c index 16958e64e577..03daead3592a 100644 --- a/net/core/dst.c +++ b/net/core/dst.c | |||
| @@ -18,7 +18,6 @@ | |||
| 18 | #include <linux/types.h> | 18 | #include <linux/types.h> |
| 19 | #include <net/net_namespace.h> | 19 | #include <net/net_namespace.h> |
| 20 | 20 | ||
| 21 | #include <net/net_namespace.h> | ||
| 22 | #include <net/dst.h> | 21 | #include <net/dst.h> |
| 23 | 22 | ||
| 24 | /* | 23 | /* |
diff --git a/net/core/neighbour.c b/net/core/neighbour.c index 05979e356963..29b8ee4e35d6 100644 --- a/net/core/neighbour.c +++ b/net/core/neighbour.c | |||
| @@ -1435,6 +1435,8 @@ int neigh_table_clear(struct neigh_table *tbl) | |||
| 1435 | kfree(tbl->phash_buckets); | 1435 | kfree(tbl->phash_buckets); |
| 1436 | tbl->phash_buckets = NULL; | 1436 | tbl->phash_buckets = NULL; |
| 1437 | 1437 | ||
| 1438 | remove_proc_entry(tbl->id, init_net.proc_net_stat); | ||
| 1439 | |||
| 1438 | free_percpu(tbl->stats); | 1440 | free_percpu(tbl->stats); |
| 1439 | tbl->stats = NULL; | 1441 | tbl->stats = NULL; |
| 1440 | 1442 | ||
diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c index e9f0964ce70b..3f6d37deac45 100644 --- a/net/core/net_namespace.c +++ b/net/core/net_namespace.c | |||
| @@ -64,6 +64,20 @@ static struct net *net_alloc(void) | |||
| 64 | return kmem_cache_zalloc(net_cachep, GFP_KERNEL); | 64 | return kmem_cache_zalloc(net_cachep, GFP_KERNEL); |
| 65 | } | 65 | } |
| 66 | 66 | ||
| 67 | static void net_free(struct net *net) | ||
| 68 | { | ||
| 69 | if (!net) | ||
| 70 | return; | ||
| 71 | |||
| 72 | if (unlikely(atomic_read(&net->use_count) != 0)) { | ||
| 73 | printk(KERN_EMERG "network namespace not free! Usage: %d\n", | ||
| 74 | atomic_read(&net->use_count)); | ||
| 75 | return; | ||
| 76 | } | ||
| 77 | |||
| 78 | kmem_cache_free(net_cachep, net); | ||
| 79 | } | ||
| 80 | |||
| 67 | struct net *copy_net_ns(unsigned long flags, struct net *old_net) | 81 | struct net *copy_net_ns(unsigned long flags, struct net *old_net) |
| 68 | { | 82 | { |
| 69 | struct net *new_net = NULL; | 83 | struct net *new_net = NULL; |
| @@ -100,20 +114,6 @@ out: | |||
| 100 | return new_net; | 114 | return new_net; |
| 101 | } | 115 | } |
| 102 | 116 | ||
| 103 | static void net_free(struct net *net) | ||
| 104 | { | ||
| 105 | if (!net) | ||
| 106 | return; | ||
| 107 | |||
| 108 | if (unlikely(atomic_read(&net->use_count) != 0)) { | ||
| 109 | printk(KERN_EMERG "network namespace not free! Usage: %d\n", | ||
| 110 | atomic_read(&net->use_count)); | ||
| 111 | return; | ||
| 112 | } | ||
| 113 | |||
| 114 | kmem_cache_free(net_cachep, net); | ||
| 115 | } | ||
| 116 | |||
| 117 | static void cleanup_net(struct work_struct *work) | 117 | static void cleanup_net(struct work_struct *work) |
| 118 | { | 118 | { |
| 119 | struct pernet_operations *ops; | 119 | struct pernet_operations *ops; |
diff --git a/net/core/sock.c b/net/core/sock.c index 12ad2067a988..8fc2f84209e4 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
| @@ -1801,11 +1801,65 @@ EXPORT_SYMBOL(sk_common_release); | |||
| 1801 | static DEFINE_RWLOCK(proto_list_lock); | 1801 | static DEFINE_RWLOCK(proto_list_lock); |
| 1802 | static LIST_HEAD(proto_list); | 1802 | static LIST_HEAD(proto_list); |
| 1803 | 1803 | ||
| 1804 | #ifdef CONFIG_SMP | ||
| 1805 | /* | ||
| 1806 | * Define default functions to keep track of inuse sockets per protocol | ||
| 1807 | * Note that often used protocols use dedicated functions to get a speed increase. | ||
| 1808 | * (see DEFINE_PROTO_INUSE/REF_PROTO_INUSE) | ||
| 1809 | */ | ||
| 1810 | static void inuse_add(struct proto *prot, int inc) | ||
| 1811 | { | ||
| 1812 | per_cpu_ptr(prot->inuse_ptr, smp_processor_id())[0] += inc; | ||
| 1813 | } | ||
| 1814 | |||
| 1815 | static int inuse_get(const struct proto *prot) | ||
| 1816 | { | ||
| 1817 | int res = 0, cpu; | ||
| 1818 | for_each_possible_cpu(cpu) | ||
| 1819 | res += per_cpu_ptr(prot->inuse_ptr, cpu)[0]; | ||
| 1820 | return res; | ||
| 1821 | } | ||
| 1822 | |||
| 1823 | static int inuse_init(struct proto *prot) | ||
| 1824 | { | ||
| 1825 | if (!prot->inuse_getval || !prot->inuse_add) { | ||
| 1826 | prot->inuse_ptr = alloc_percpu(int); | ||
| 1827 | if (prot->inuse_ptr == NULL) | ||
| 1828 | return -ENOBUFS; | ||
| 1829 | |||
| 1830 | prot->inuse_getval = inuse_get; | ||
| 1831 | prot->inuse_add = inuse_add; | ||
| 1832 | } | ||
| 1833 | return 0; | ||
| 1834 | } | ||
| 1835 | |||
| 1836 | static void inuse_fini(struct proto *prot) | ||
| 1837 | { | ||
| 1838 | if (prot->inuse_ptr != NULL) { | ||
| 1839 | free_percpu(prot->inuse_ptr); | ||
| 1840 | prot->inuse_ptr = NULL; | ||
| 1841 | prot->inuse_getval = NULL; | ||
| 1842 | prot->inuse_add = NULL; | ||
| 1843 | } | ||
| 1844 | } | ||
| 1845 | #else | ||
| 1846 | static inline int inuse_init(struct proto *prot) | ||
| 1847 | { | ||
| 1848 | return 0; | ||
| 1849 | } | ||
| 1850 | |||
| 1851 | static inline void inuse_fini(struct proto *prot) | ||
| 1852 | { | ||
| 1853 | } | ||
| 1854 | #endif | ||
| 1855 | |||
| 1804 | int proto_register(struct proto *prot, int alloc_slab) | 1856 | int proto_register(struct proto *prot, int alloc_slab) |
| 1805 | { | 1857 | { |
| 1806 | char *request_sock_slab_name = NULL; | 1858 | char *request_sock_slab_name = NULL; |
| 1807 | char *timewait_sock_slab_name; | 1859 | char *timewait_sock_slab_name; |
| 1808 | int rc = -ENOBUFS; | 1860 | |
| 1861 | if (inuse_init(prot)) | ||
| 1862 | goto out; | ||
| 1809 | 1863 | ||
| 1810 | if (alloc_slab) { | 1864 | if (alloc_slab) { |
| 1811 | prot->slab = kmem_cache_create(prot->name, prot->obj_size, 0, | 1865 | prot->slab = kmem_cache_create(prot->name, prot->obj_size, 0, |
| @@ -1814,7 +1868,7 @@ int proto_register(struct proto *prot, int alloc_slab) | |||
| 1814 | if (prot->slab == NULL) { | 1868 | if (prot->slab == NULL) { |
| 1815 | printk(KERN_CRIT "%s: Can't create sock SLAB cache!\n", | 1869 | printk(KERN_CRIT "%s: Can't create sock SLAB cache!\n", |
| 1816 | prot->name); | 1870 | prot->name); |
| 1817 | goto out; | 1871 | goto out_free_inuse; |
| 1818 | } | 1872 | } |
| 1819 | 1873 | ||
| 1820 | if (prot->rsk_prot != NULL) { | 1874 | if (prot->rsk_prot != NULL) { |
| @@ -1858,9 +1912,8 @@ int proto_register(struct proto *prot, int alloc_slab) | |||
| 1858 | write_lock(&proto_list_lock); | 1912 | write_lock(&proto_list_lock); |
| 1859 | list_add(&prot->node, &proto_list); | 1913 | list_add(&prot->node, &proto_list); |
| 1860 | write_unlock(&proto_list_lock); | 1914 | write_unlock(&proto_list_lock); |
| 1861 | rc = 0; | 1915 | return 0; |
| 1862 | out: | 1916 | |
| 1863 | return rc; | ||
| 1864 | out_free_timewait_sock_slab_name: | 1917 | out_free_timewait_sock_slab_name: |
| 1865 | kfree(timewait_sock_slab_name); | 1918 | kfree(timewait_sock_slab_name); |
| 1866 | out_free_request_sock_slab: | 1919 | out_free_request_sock_slab: |
| @@ -1873,7 +1926,10 @@ out_free_request_sock_slab_name: | |||
| 1873 | out_free_sock_slab: | 1926 | out_free_sock_slab: |
| 1874 | kmem_cache_destroy(prot->slab); | 1927 | kmem_cache_destroy(prot->slab); |
| 1875 | prot->slab = NULL; | 1928 | prot->slab = NULL; |
| 1876 | goto out; | 1929 | out_free_inuse: |
| 1930 | inuse_fini(prot); | ||
| 1931 | out: | ||
| 1932 | return -ENOBUFS; | ||
| 1877 | } | 1933 | } |
| 1878 | 1934 | ||
| 1879 | EXPORT_SYMBOL(proto_register); | 1935 | EXPORT_SYMBOL(proto_register); |
| @@ -1884,6 +1940,7 @@ void proto_unregister(struct proto *prot) | |||
| 1884 | list_del(&prot->node); | 1940 | list_del(&prot->node); |
| 1885 | write_unlock(&proto_list_lock); | 1941 | write_unlock(&proto_list_lock); |
| 1886 | 1942 | ||
| 1943 | inuse_fini(prot); | ||
| 1887 | if (prot->slab != NULL) { | 1944 | if (prot->slab != NULL) { |
| 1888 | kmem_cache_destroy(prot->slab); | 1945 | kmem_cache_destroy(prot->slab); |
| 1889 | prot->slab = NULL; | 1946 | prot->slab = NULL; |
diff --git a/net/dccp/ipv4.c b/net/dccp/ipv4.c index 01a6a808bdb7..db17b83e8d3e 100644 --- a/net/dccp/ipv4.c +++ b/net/dccp/ipv4.c | |||
| @@ -922,6 +922,8 @@ static struct timewait_sock_ops dccp_timewait_sock_ops = { | |||
| 922 | .twsk_obj_size = sizeof(struct inet_timewait_sock), | 922 | .twsk_obj_size = sizeof(struct inet_timewait_sock), |
| 923 | }; | 923 | }; |
| 924 | 924 | ||
| 925 | DEFINE_PROTO_INUSE(dccp_v4) | ||
| 926 | |||
| 925 | static struct proto dccp_v4_prot = { | 927 | static struct proto dccp_v4_prot = { |
| 926 | .name = "DCCP", | 928 | .name = "DCCP", |
| 927 | .owner = THIS_MODULE, | 929 | .owner = THIS_MODULE, |
| @@ -950,6 +952,7 @@ static struct proto dccp_v4_prot = { | |||
| 950 | .compat_setsockopt = compat_dccp_setsockopt, | 952 | .compat_setsockopt = compat_dccp_setsockopt, |
| 951 | .compat_getsockopt = compat_dccp_getsockopt, | 953 | .compat_getsockopt = compat_dccp_getsockopt, |
| 952 | #endif | 954 | #endif |
| 955 | REF_PROTO_INUSE(dccp_v4) | ||
| 953 | }; | 956 | }; |
| 954 | 957 | ||
| 955 | static struct net_protocol dccp_v4_protocol = { | 958 | static struct net_protocol dccp_v4_protocol = { |
diff --git a/net/dccp/ipv6.c b/net/dccp/ipv6.c index 62428ff137dd..87c98fb86fa8 100644 --- a/net/dccp/ipv6.c +++ b/net/dccp/ipv6.c | |||
| @@ -1107,6 +1107,8 @@ static struct timewait_sock_ops dccp6_timewait_sock_ops = { | |||
| 1107 | .twsk_obj_size = sizeof(struct dccp6_timewait_sock), | 1107 | .twsk_obj_size = sizeof(struct dccp6_timewait_sock), |
| 1108 | }; | 1108 | }; |
| 1109 | 1109 | ||
| 1110 | DEFINE_PROTO_INUSE(dccp_v6) | ||
| 1111 | |||
| 1110 | static struct proto dccp_v6_prot = { | 1112 | static struct proto dccp_v6_prot = { |
| 1111 | .name = "DCCPv6", | 1113 | .name = "DCCPv6", |
| 1112 | .owner = THIS_MODULE, | 1114 | .owner = THIS_MODULE, |
| @@ -1135,6 +1137,7 @@ static struct proto dccp_v6_prot = { | |||
| 1135 | .compat_setsockopt = compat_dccp_setsockopt, | 1137 | .compat_setsockopt = compat_dccp_setsockopt, |
| 1136 | .compat_getsockopt = compat_dccp_getsockopt, | 1138 | .compat_getsockopt = compat_dccp_getsockopt, |
| 1137 | #endif | 1139 | #endif |
| 1140 | REF_PROTO_INUSE(dccp_v6) | ||
| 1138 | }; | 1141 | }; |
| 1139 | 1142 | ||
| 1140 | static struct inet6_protocol dccp_v6_protocol = { | 1143 | static struct inet6_protocol dccp_v6_protocol = { |
diff --git a/net/dccp/proto.c b/net/dccp/proto.c index d84973928033..7a3bea9c28c1 100644 --- a/net/dccp/proto.c +++ b/net/dccp/proto.c | |||
| @@ -1072,11 +1072,13 @@ static int __init dccp_init(void) | |||
| 1072 | } | 1072 | } |
| 1073 | 1073 | ||
| 1074 | for (i = 0; i < dccp_hashinfo.ehash_size; i++) { | 1074 | for (i = 0; i < dccp_hashinfo.ehash_size; i++) { |
| 1075 | rwlock_init(&dccp_hashinfo.ehash[i].lock); | ||
| 1076 | INIT_HLIST_HEAD(&dccp_hashinfo.ehash[i].chain); | 1075 | INIT_HLIST_HEAD(&dccp_hashinfo.ehash[i].chain); |
| 1077 | INIT_HLIST_HEAD(&dccp_hashinfo.ehash[i].twchain); | 1076 | INIT_HLIST_HEAD(&dccp_hashinfo.ehash[i].twchain); |
| 1078 | } | 1077 | } |
| 1079 | 1078 | ||
| 1079 | if (inet_ehash_locks_alloc(&dccp_hashinfo)) | ||
| 1080 | goto out_free_dccp_ehash; | ||
| 1081 | |||
| 1080 | bhash_order = ehash_order; | 1082 | bhash_order = ehash_order; |
| 1081 | 1083 | ||
| 1082 | do { | 1084 | do { |
| @@ -1091,7 +1093,7 @@ static int __init dccp_init(void) | |||
| 1091 | 1093 | ||
| 1092 | if (!dccp_hashinfo.bhash) { | 1094 | if (!dccp_hashinfo.bhash) { |
| 1093 | DCCP_CRIT("Failed to allocate DCCP bind hash table"); | 1095 | DCCP_CRIT("Failed to allocate DCCP bind hash table"); |
| 1094 | goto out_free_dccp_ehash; | 1096 | goto out_free_dccp_locks; |
| 1095 | } | 1097 | } |
| 1096 | 1098 | ||
| 1097 | for (i = 0; i < dccp_hashinfo.bhash_size; i++) { | 1099 | for (i = 0; i < dccp_hashinfo.bhash_size; i++) { |
| @@ -1121,6 +1123,8 @@ out_free_dccp_mib: | |||
| 1121 | out_free_dccp_bhash: | 1123 | out_free_dccp_bhash: |
| 1122 | free_pages((unsigned long)dccp_hashinfo.bhash, bhash_order); | 1124 | free_pages((unsigned long)dccp_hashinfo.bhash, bhash_order); |
| 1123 | dccp_hashinfo.bhash = NULL; | 1125 | dccp_hashinfo.bhash = NULL; |
| 1126 | out_free_dccp_locks: | ||
| 1127 | inet_ehash_locks_free(&dccp_hashinfo); | ||
| 1124 | out_free_dccp_ehash: | 1128 | out_free_dccp_ehash: |
| 1125 | free_pages((unsigned long)dccp_hashinfo.ehash, ehash_order); | 1129 | free_pages((unsigned long)dccp_hashinfo.ehash, ehash_order); |
| 1126 | dccp_hashinfo.ehash = NULL; | 1130 | dccp_hashinfo.ehash = NULL; |
| @@ -1139,6 +1143,7 @@ static void __exit dccp_fini(void) | |||
| 1139 | free_pages((unsigned long)dccp_hashinfo.ehash, | 1143 | free_pages((unsigned long)dccp_hashinfo.ehash, |
| 1140 | get_order(dccp_hashinfo.ehash_size * | 1144 | get_order(dccp_hashinfo.ehash_size * |
| 1141 | sizeof(struct inet_ehash_bucket))); | 1145 | sizeof(struct inet_ehash_bucket))); |
| 1146 | inet_ehash_locks_free(&dccp_hashinfo); | ||
| 1142 | kmem_cache_destroy(dccp_hashinfo.bind_bucket_cachep); | 1147 | kmem_cache_destroy(dccp_hashinfo.bind_bucket_cachep); |
| 1143 | dccp_ackvec_exit(); | 1148 | dccp_ackvec_exit(); |
| 1144 | dccp_sysctl_exit(); | 1149 | dccp_sysctl_exit(); |
diff --git a/net/decnet/dn_dev.c b/net/decnet/dn_dev.c index 26130afd8029..66e266fb5908 100644 --- a/net/decnet/dn_dev.c +++ b/net/decnet/dn_dev.c | |||
| @@ -1439,7 +1439,7 @@ static const struct file_operations dn_dev_seq_fops = { | |||
| 1439 | 1439 | ||
| 1440 | #endif /* CONFIG_PROC_FS */ | 1440 | #endif /* CONFIG_PROC_FS */ |
| 1441 | 1441 | ||
| 1442 | static int __initdata addr[2]; | 1442 | static int addr[2]; |
| 1443 | module_param_array(addr, int, NULL, 0444); | 1443 | module_param_array(addr, int, NULL, 0444); |
| 1444 | MODULE_PARM_DESC(addr, "The DECnet address of this machine: area,node"); | 1444 | MODULE_PARM_DESC(addr, "The DECnet address of this machine: area,node"); |
| 1445 | 1445 | ||
diff --git a/net/ieee80211/ieee80211_crypt_tkip.c b/net/ieee80211/ieee80211_crypt_tkip.c index 4cce3534e408..58b22619ab15 100644 --- a/net/ieee80211/ieee80211_crypt_tkip.c +++ b/net/ieee80211/ieee80211_crypt_tkip.c | |||
| @@ -25,7 +25,6 @@ | |||
| 25 | #include <net/ieee80211.h> | 25 | #include <net/ieee80211.h> |
| 26 | 26 | ||
| 27 | #include <linux/crypto.h> | 27 | #include <linux/crypto.h> |
| 28 | #include <linux/scatterlist.h> | ||
| 29 | #include <linux/crc32.h> | 28 | #include <linux/crc32.h> |
| 30 | 29 | ||
| 31 | MODULE_AUTHOR("Jouni Malinen"); | 30 | MODULE_AUTHOR("Jouni Malinen"); |
diff --git a/net/ieee80211/ieee80211_crypt_wep.c b/net/ieee80211/ieee80211_crypt_wep.c index 866fc04c44f9..3fa30c40779f 100644 --- a/net/ieee80211/ieee80211_crypt_wep.c +++ b/net/ieee80211/ieee80211_crypt_wep.c | |||
| @@ -22,7 +22,6 @@ | |||
| 22 | #include <net/ieee80211.h> | 22 | #include <net/ieee80211.h> |
| 23 | 23 | ||
| 24 | #include <linux/crypto.h> | 24 | #include <linux/crypto.h> |
| 25 | #include <linux/scatterlist.h> | ||
| 26 | #include <linux/crc32.h> | 25 | #include <linux/crc32.h> |
| 27 | 26 | ||
| 28 | MODULE_AUTHOR("Jouni Malinen"); | 27 | MODULE_AUTHOR("Jouni Malinen"); |
diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c index 60123905dbbf..732d8f088b13 100644 --- a/net/ipv4/fib_frontend.c +++ b/net/ipv4/fib_frontend.c | |||
| @@ -59,6 +59,13 @@ struct fib_table *ip_fib_main_table; | |||
| 59 | #define FIB_TABLE_HASHSZ 1 | 59 | #define FIB_TABLE_HASHSZ 1 |
| 60 | static struct hlist_head fib_table_hash[FIB_TABLE_HASHSZ]; | 60 | static struct hlist_head fib_table_hash[FIB_TABLE_HASHSZ]; |
| 61 | 61 | ||
| 62 | static void __init fib4_rules_init(void) | ||
| 63 | { | ||
| 64 | ip_fib_local_table = fib_hash_init(RT_TABLE_LOCAL); | ||
| 65 | hlist_add_head_rcu(&ip_fib_local_table->tb_hlist, &fib_table_hash[0]); | ||
| 66 | ip_fib_main_table = fib_hash_init(RT_TABLE_MAIN); | ||
| 67 | hlist_add_head_rcu(&ip_fib_main_table->tb_hlist, &fib_table_hash[0]); | ||
| 68 | } | ||
| 62 | #else | 69 | #else |
| 63 | 70 | ||
| 64 | #define FIB_TABLE_HASHSZ 256 | 71 | #define FIB_TABLE_HASHSZ 256 |
| @@ -905,14 +912,8 @@ void __init ip_fib_init(void) | |||
| 905 | 912 | ||
| 906 | for (i = 0; i < FIB_TABLE_HASHSZ; i++) | 913 | for (i = 0; i < FIB_TABLE_HASHSZ; i++) |
| 907 | INIT_HLIST_HEAD(&fib_table_hash[i]); | 914 | INIT_HLIST_HEAD(&fib_table_hash[i]); |
| 908 | #ifndef CONFIG_IP_MULTIPLE_TABLES | 915 | |
| 909 | ip_fib_local_table = fib_hash_init(RT_TABLE_LOCAL); | ||
| 910 | hlist_add_head_rcu(&ip_fib_local_table->tb_hlist, &fib_table_hash[0]); | ||
| 911 | ip_fib_main_table = fib_hash_init(RT_TABLE_MAIN); | ||
| 912 | hlist_add_head_rcu(&ip_fib_main_table->tb_hlist, &fib_table_hash[0]); | ||
| 913 | #else | ||
| 914 | fib4_rules_init(); | 916 | fib4_rules_init(); |
| 915 | #endif | ||
| 916 | 917 | ||
| 917 | register_netdevice_notifier(&fib_netdev_notifier); | 918 | register_netdevice_notifier(&fib_netdev_notifier); |
| 918 | register_inetaddr_notifier(&fib_inetaddr_notifier); | 919 | register_inetaddr_notifier(&fib_inetaddr_notifier); |
diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c index dc429b6b0ba6..b0170732b5e9 100644 --- a/net/ipv4/inet_diag.c +++ b/net/ipv4/inet_diag.c | |||
| @@ -747,13 +747,14 @@ skip_listen_ht: | |||
| 747 | 747 | ||
| 748 | for (i = s_i; i < hashinfo->ehash_size; i++) { | 748 | for (i = s_i; i < hashinfo->ehash_size; i++) { |
| 749 | struct inet_ehash_bucket *head = &hashinfo->ehash[i]; | 749 | struct inet_ehash_bucket *head = &hashinfo->ehash[i]; |
| 750 | rwlock_t *lock = inet_ehash_lockp(hashinfo, i); | ||
| 750 | struct sock *sk; | 751 | struct sock *sk; |
| 751 | struct hlist_node *node; | 752 | struct hlist_node *node; |
| 752 | 753 | ||
| 753 | if (i > s_i) | 754 | if (i > s_i) |
| 754 | s_num = 0; | 755 | s_num = 0; |
| 755 | 756 | ||
| 756 | read_lock_bh(&head->lock); | 757 | read_lock_bh(lock); |
| 757 | num = 0; | 758 | num = 0; |
| 758 | sk_for_each(sk, node, &head->chain) { | 759 | sk_for_each(sk, node, &head->chain) { |
| 759 | struct inet_sock *inet = inet_sk(sk); | 760 | struct inet_sock *inet = inet_sk(sk); |
| @@ -769,7 +770,7 @@ skip_listen_ht: | |||
| 769 | r->id.idiag_dport) | 770 | r->id.idiag_dport) |
| 770 | goto next_normal; | 771 | goto next_normal; |
| 771 | if (inet_csk_diag_dump(sk, skb, cb) < 0) { | 772 | if (inet_csk_diag_dump(sk, skb, cb) < 0) { |
| 772 | read_unlock_bh(&head->lock); | 773 | read_unlock_bh(lock); |
| 773 | goto done; | 774 | goto done; |
| 774 | } | 775 | } |
| 775 | next_normal: | 776 | next_normal: |
| @@ -791,14 +792,14 @@ next_normal: | |||
| 791 | r->id.idiag_dport) | 792 | r->id.idiag_dport) |
| 792 | goto next_dying; | 793 | goto next_dying; |
| 793 | if (inet_twsk_diag_dump(tw, skb, cb) < 0) { | 794 | if (inet_twsk_diag_dump(tw, skb, cb) < 0) { |
| 794 | read_unlock_bh(&head->lock); | 795 | read_unlock_bh(lock); |
| 795 | goto done; | 796 | goto done; |
| 796 | } | 797 | } |
| 797 | next_dying: | 798 | next_dying: |
| 798 | ++num; | 799 | ++num; |
| 799 | } | 800 | } |
| 800 | } | 801 | } |
| 801 | read_unlock_bh(&head->lock); | 802 | read_unlock_bh(lock); |
| 802 | } | 803 | } |
| 803 | 804 | ||
| 804 | done: | 805 | done: |
diff --git a/net/ipv4/inet_hashtables.c b/net/ipv4/inet_hashtables.c index 16eecc7046a3..67704da04fc4 100644 --- a/net/ipv4/inet_hashtables.c +++ b/net/ipv4/inet_hashtables.c | |||
| @@ -204,12 +204,13 @@ static int __inet_check_established(struct inet_timewait_death_row *death_row, | |||
| 204 | const __portpair ports = INET_COMBINED_PORTS(inet->dport, lport); | 204 | const __portpair ports = INET_COMBINED_PORTS(inet->dport, lport); |
| 205 | unsigned int hash = inet_ehashfn(daddr, lport, saddr, inet->dport); | 205 | unsigned int hash = inet_ehashfn(daddr, lport, saddr, inet->dport); |
| 206 | struct inet_ehash_bucket *head = inet_ehash_bucket(hinfo, hash); | 206 | struct inet_ehash_bucket *head = inet_ehash_bucket(hinfo, hash); |
| 207 | rwlock_t *lock = inet_ehash_lockp(hinfo, hash); | ||
| 207 | struct sock *sk2; | 208 | struct sock *sk2; |
| 208 | const struct hlist_node *node; | 209 | const struct hlist_node *node; |
| 209 | struct inet_timewait_sock *tw; | 210 | struct inet_timewait_sock *tw; |
| 210 | 211 | ||
| 211 | prefetch(head->chain.first); | 212 | prefetch(head->chain.first); |
| 212 | write_lock(&head->lock); | 213 | write_lock(lock); |
| 213 | 214 | ||
| 214 | /* Check TIME-WAIT sockets first. */ | 215 | /* Check TIME-WAIT sockets first. */ |
| 215 | sk_for_each(sk2, node, &head->twchain) { | 216 | sk_for_each(sk2, node, &head->twchain) { |
| @@ -239,7 +240,7 @@ unique: | |||
| 239 | BUG_TRAP(sk_unhashed(sk)); | 240 | BUG_TRAP(sk_unhashed(sk)); |
| 240 | __sk_add_node(sk, &head->chain); | 241 | __sk_add_node(sk, &head->chain); |
| 241 | sock_prot_inc_use(sk->sk_prot); | 242 | sock_prot_inc_use(sk->sk_prot); |
| 242 | write_unlock(&head->lock); | 243 | write_unlock(lock); |
| 243 | 244 | ||
| 244 | if (twp) { | 245 | if (twp) { |
| 245 | *twp = tw; | 246 | *twp = tw; |
| @@ -255,7 +256,7 @@ unique: | |||
| 255 | return 0; | 256 | return 0; |
| 256 | 257 | ||
| 257 | not_unique: | 258 | not_unique: |
| 258 | write_unlock(&head->lock); | 259 | write_unlock(lock); |
| 259 | return -EADDRNOTAVAIL; | 260 | return -EADDRNOTAVAIL; |
| 260 | } | 261 | } |
| 261 | 262 | ||
diff --git a/net/ipv4/inet_timewait_sock.c b/net/ipv4/inet_timewait_sock.c index 4e189e28f306..a60b99e0ebdc 100644 --- a/net/ipv4/inet_timewait_sock.c +++ b/net/ipv4/inet_timewait_sock.c | |||
| @@ -20,16 +20,16 @@ static void __inet_twsk_kill(struct inet_timewait_sock *tw, | |||
| 20 | struct inet_bind_hashbucket *bhead; | 20 | struct inet_bind_hashbucket *bhead; |
| 21 | struct inet_bind_bucket *tb; | 21 | struct inet_bind_bucket *tb; |
| 22 | /* Unlink from established hashes. */ | 22 | /* Unlink from established hashes. */ |
| 23 | struct inet_ehash_bucket *ehead = inet_ehash_bucket(hashinfo, tw->tw_hash); | 23 | rwlock_t *lock = inet_ehash_lockp(hashinfo, tw->tw_hash); |
| 24 | 24 | ||
| 25 | write_lock(&ehead->lock); | 25 | write_lock(lock); |
| 26 | if (hlist_unhashed(&tw->tw_node)) { | 26 | if (hlist_unhashed(&tw->tw_node)) { |
| 27 | write_unlock(&ehead->lock); | 27 | write_unlock(lock); |
| 28 | return; | 28 | return; |
| 29 | } | 29 | } |
| 30 | __hlist_del(&tw->tw_node); | 30 | __hlist_del(&tw->tw_node); |
| 31 | sk_node_init(&tw->tw_node); | 31 | sk_node_init(&tw->tw_node); |
| 32 | write_unlock(&ehead->lock); | 32 | write_unlock(lock); |
| 33 | 33 | ||
| 34 | /* Disassociate with bind bucket. */ | 34 | /* Disassociate with bind bucket. */ |
| 35 | bhead = &hashinfo->bhash[inet_bhashfn(tw->tw_num, hashinfo->bhash_size)]; | 35 | bhead = &hashinfo->bhash[inet_bhashfn(tw->tw_num, hashinfo->bhash_size)]; |
| @@ -59,6 +59,7 @@ void __inet_twsk_hashdance(struct inet_timewait_sock *tw, struct sock *sk, | |||
| 59 | const struct inet_sock *inet = inet_sk(sk); | 59 | const struct inet_sock *inet = inet_sk(sk); |
| 60 | const struct inet_connection_sock *icsk = inet_csk(sk); | 60 | const struct inet_connection_sock *icsk = inet_csk(sk); |
| 61 | struct inet_ehash_bucket *ehead = inet_ehash_bucket(hashinfo, sk->sk_hash); | 61 | struct inet_ehash_bucket *ehead = inet_ehash_bucket(hashinfo, sk->sk_hash); |
| 62 | rwlock_t *lock = inet_ehash_lockp(hashinfo, sk->sk_hash); | ||
| 62 | struct inet_bind_hashbucket *bhead; | 63 | struct inet_bind_hashbucket *bhead; |
| 63 | /* Step 1: Put TW into bind hash. Original socket stays there too. | 64 | /* Step 1: Put TW into bind hash. Original socket stays there too. |
| 64 | Note, that any socket with inet->num != 0 MUST be bound in | 65 | Note, that any socket with inet->num != 0 MUST be bound in |
| @@ -71,7 +72,7 @@ void __inet_twsk_hashdance(struct inet_timewait_sock *tw, struct sock *sk, | |||
| 71 | inet_twsk_add_bind_node(tw, &tw->tw_tb->owners); | 72 | inet_twsk_add_bind_node(tw, &tw->tw_tb->owners); |
| 72 | spin_unlock(&bhead->lock); | 73 | spin_unlock(&bhead->lock); |
| 73 | 74 | ||
| 74 | write_lock(&ehead->lock); | 75 | write_lock(lock); |
| 75 | 76 | ||
| 76 | /* Step 2: Remove SK from established hash. */ | 77 | /* Step 2: Remove SK from established hash. */ |
| 77 | if (__sk_del_node_init(sk)) | 78 | if (__sk_del_node_init(sk)) |
| @@ -81,7 +82,7 @@ void __inet_twsk_hashdance(struct inet_timewait_sock *tw, struct sock *sk, | |||
| 81 | inet_twsk_add_node(tw, &ehead->twchain); | 82 | inet_twsk_add_node(tw, &ehead->twchain); |
| 82 | atomic_inc(&tw->tw_refcnt); | 83 | atomic_inc(&tw->tw_refcnt); |
| 83 | 84 | ||
| 84 | write_unlock(&ehead->lock); | 85 | write_unlock(lock); |
| 85 | } | 86 | } |
| 86 | 87 | ||
| 87 | EXPORT_SYMBOL_GPL(__inet_twsk_hashdance); | 88 | EXPORT_SYMBOL_GPL(__inet_twsk_hashdance); |
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index e5f7dc2de303..fd99fbd685ea 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
| @@ -1183,6 +1183,17 @@ error: | |||
| 1183 | return err; | 1183 | return err; |
| 1184 | } | 1184 | } |
| 1185 | 1185 | ||
| 1186 | static void ip_cork_release(struct inet_sock *inet) | ||
| 1187 | { | ||
| 1188 | inet->cork.flags &= ~IPCORK_OPT; | ||
| 1189 | kfree(inet->cork.opt); | ||
| 1190 | inet->cork.opt = NULL; | ||
| 1191 | if (inet->cork.rt) { | ||
| 1192 | ip_rt_put(inet->cork.rt); | ||
| 1193 | inet->cork.rt = NULL; | ||
| 1194 | } | ||
| 1195 | } | ||
| 1196 | |||
| 1186 | /* | 1197 | /* |
| 1187 | * Combined all pending IP fragments on the socket as one IP datagram | 1198 | * Combined all pending IP fragments on the socket as one IP datagram |
| 1188 | * and push them out. | 1199 | * and push them out. |
| @@ -1276,13 +1287,7 @@ int ip_push_pending_frames(struct sock *sk) | |||
| 1276 | } | 1287 | } |
| 1277 | 1288 | ||
| 1278 | out: | 1289 | out: |
| 1279 | inet->cork.flags &= ~IPCORK_OPT; | 1290 | ip_cork_release(inet); |
| 1280 | kfree(inet->cork.opt); | ||
| 1281 | inet->cork.opt = NULL; | ||
| 1282 | if (inet->cork.rt) { | ||
| 1283 | ip_rt_put(inet->cork.rt); | ||
| 1284 | inet->cork.rt = NULL; | ||
| 1285 | } | ||
| 1286 | return err; | 1291 | return err; |
| 1287 | 1292 | ||
| 1288 | error: | 1293 | error: |
| @@ -1295,19 +1300,12 @@ error: | |||
| 1295 | */ | 1300 | */ |
| 1296 | void ip_flush_pending_frames(struct sock *sk) | 1301 | void ip_flush_pending_frames(struct sock *sk) |
| 1297 | { | 1302 | { |
| 1298 | struct inet_sock *inet = inet_sk(sk); | ||
| 1299 | struct sk_buff *skb; | 1303 | struct sk_buff *skb; |
| 1300 | 1304 | ||
| 1301 | while ((skb = __skb_dequeue_tail(&sk->sk_write_queue)) != NULL) | 1305 | while ((skb = __skb_dequeue_tail(&sk->sk_write_queue)) != NULL) |
| 1302 | kfree_skb(skb); | 1306 | kfree_skb(skb); |
| 1303 | 1307 | ||
| 1304 | inet->cork.flags &= ~IPCORK_OPT; | 1308 | ip_cork_release(inet_sk(sk)); |
| 1305 | kfree(inet->cork.opt); | ||
| 1306 | inet->cork.opt = NULL; | ||
| 1307 | if (inet->cork.rt) { | ||
| 1308 | ip_rt_put(inet->cork.rt); | ||
| 1309 | inet->cork.rt = NULL; | ||
| 1310 | } | ||
| 1311 | } | 1309 | } |
| 1312 | 1310 | ||
| 1313 | 1311 | ||
diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c index f51f20e487c8..82817e554363 100644 --- a/net/ipv4/ip_sockglue.c +++ b/net/ipv4/ip_sockglue.c | |||
| @@ -437,10 +437,8 @@ static int do_ip_setsockopt(struct sock *sk, int level, | |||
| 437 | 437 | ||
| 438 | /* If optlen==0, it is equivalent to val == 0 */ | 438 | /* If optlen==0, it is equivalent to val == 0 */ |
| 439 | 439 | ||
| 440 | #ifdef CONFIG_IP_MROUTE | 440 | if (ip_mroute_opt(optname)) |
| 441 | if (optname >= MRT_BASE && optname <= (MRT_BASE + 10)) | ||
| 442 | return ip_mroute_setsockopt(sk,optname,optval,optlen); | 441 | return ip_mroute_setsockopt(sk,optname,optval,optlen); |
| 443 | #endif | ||
| 444 | 442 | ||
| 445 | err = 0; | 443 | err = 0; |
| 446 | lock_sock(sk); | 444 | lock_sock(sk); |
| @@ -909,11 +907,9 @@ int ip_setsockopt(struct sock *sk, int level, | |||
| 909 | #ifdef CONFIG_NETFILTER | 907 | #ifdef CONFIG_NETFILTER |
| 910 | /* we need to exclude all possible ENOPROTOOPTs except default case */ | 908 | /* we need to exclude all possible ENOPROTOOPTs except default case */ |
| 911 | if (err == -ENOPROTOOPT && optname != IP_HDRINCL && | 909 | if (err == -ENOPROTOOPT && optname != IP_HDRINCL && |
| 912 | optname != IP_IPSEC_POLICY && optname != IP_XFRM_POLICY | 910 | optname != IP_IPSEC_POLICY && |
| 913 | #ifdef CONFIG_IP_MROUTE | 911 | optname != IP_XFRM_POLICY && |
| 914 | && (optname < MRT_BASE || optname > (MRT_BASE + 10)) | 912 | !ip_mroute_opt(optname)) { |
| 915 | #endif | ||
| 916 | ) { | ||
| 917 | lock_sock(sk); | 913 | lock_sock(sk); |
| 918 | err = nf_setsockopt(sk, PF_INET, optname, optval, optlen); | 914 | err = nf_setsockopt(sk, PF_INET, optname, optval, optlen); |
| 919 | release_sock(sk); | 915 | release_sock(sk); |
| @@ -935,11 +931,9 @@ int compat_ip_setsockopt(struct sock *sk, int level, int optname, | |||
| 935 | #ifdef CONFIG_NETFILTER | 931 | #ifdef CONFIG_NETFILTER |
| 936 | /* we need to exclude all possible ENOPROTOOPTs except default case */ | 932 | /* we need to exclude all possible ENOPROTOOPTs except default case */ |
| 937 | if (err == -ENOPROTOOPT && optname != IP_HDRINCL && | 933 | if (err == -ENOPROTOOPT && optname != IP_HDRINCL && |
| 938 | optname != IP_IPSEC_POLICY && optname != IP_XFRM_POLICY | 934 | optname != IP_IPSEC_POLICY && |
| 939 | #ifdef CONFIG_IP_MROUTE | 935 | optname != IP_XFRM_POLICY && |
| 940 | && (optname < MRT_BASE || optname > (MRT_BASE + 10)) | 936 | !ip_mroute_opt(optname)) { |
| 941 | #endif | ||
| 942 | ) { | ||
| 943 | lock_sock(sk); | 937 | lock_sock(sk); |
| 944 | err = compat_nf_setsockopt(sk, PF_INET, optname, | 938 | err = compat_nf_setsockopt(sk, PF_INET, optname, |
| 945 | optval, optlen); | 939 | optval, optlen); |
| @@ -967,11 +961,8 @@ static int do_ip_getsockopt(struct sock *sk, int level, int optname, | |||
| 967 | if (level != SOL_IP) | 961 | if (level != SOL_IP) |
| 968 | return -EOPNOTSUPP; | 962 | return -EOPNOTSUPP; |
| 969 | 963 | ||
| 970 | #ifdef CONFIG_IP_MROUTE | 964 | if (ip_mroute_opt(optname)) |
| 971 | if (optname >= MRT_BASE && optname <= MRT_BASE+10) { | ||
| 972 | return ip_mroute_getsockopt(sk,optname,optval,optlen); | 965 | return ip_mroute_getsockopt(sk,optname,optval,optlen); |
| 973 | } | ||
| 974 | #endif | ||
| 975 | 966 | ||
| 976 | if (get_user(len,optlen)) | 967 | if (get_user(len,optlen)) |
| 977 | return -EFAULT; | 968 | return -EFAULT; |
| @@ -1171,11 +1162,8 @@ int ip_getsockopt(struct sock *sk, int level, | |||
| 1171 | err = do_ip_getsockopt(sk, level, optname, optval, optlen); | 1162 | err = do_ip_getsockopt(sk, level, optname, optval, optlen); |
| 1172 | #ifdef CONFIG_NETFILTER | 1163 | #ifdef CONFIG_NETFILTER |
| 1173 | /* we need to exclude all possible ENOPROTOOPTs except default case */ | 1164 | /* we need to exclude all possible ENOPROTOOPTs except default case */ |
| 1174 | if (err == -ENOPROTOOPT && optname != IP_PKTOPTIONS | 1165 | if (err == -ENOPROTOOPT && optname != IP_PKTOPTIONS && |
| 1175 | #ifdef CONFIG_IP_MROUTE | 1166 | !ip_mroute_opt(optname)) { |
| 1176 | && (optname < MRT_BASE || optname > MRT_BASE+10) | ||
| 1177 | #endif | ||
| 1178 | ) { | ||
| 1179 | int len; | 1167 | int len; |
| 1180 | 1168 | ||
| 1181 | if (get_user(len,optlen)) | 1169 | if (get_user(len,optlen)) |
| @@ -1200,11 +1188,8 @@ int compat_ip_getsockopt(struct sock *sk, int level, int optname, | |||
| 1200 | int err = do_ip_getsockopt(sk, level, optname, optval, optlen); | 1188 | int err = do_ip_getsockopt(sk, level, optname, optval, optlen); |
| 1201 | #ifdef CONFIG_NETFILTER | 1189 | #ifdef CONFIG_NETFILTER |
| 1202 | /* we need to exclude all possible ENOPROTOOPTs except default case */ | 1190 | /* we need to exclude all possible ENOPROTOOPTs except default case */ |
| 1203 | if (err == -ENOPROTOOPT && optname != IP_PKTOPTIONS | 1191 | if (err == -ENOPROTOOPT && optname != IP_PKTOPTIONS && |
| 1204 | #ifdef CONFIG_IP_MROUTE | 1192 | !ip_mroute_opt(optname)) { |
| 1205 | && (optname < MRT_BASE || optname > MRT_BASE+10) | ||
| 1206 | #endif | ||
| 1207 | ) { | ||
| 1208 | int len; | 1193 | int len; |
| 1209 | 1194 | ||
| 1210 | if (get_user(len, optlen)) | 1195 | if (get_user(len, optlen)) |
diff --git a/net/ipv4/ipcomp.c b/net/ipv4/ipcomp.c index ca1b5fdb8d31..2c44a94c2135 100644 --- a/net/ipv4/ipcomp.c +++ b/net/ipv4/ipcomp.c | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | #include <linux/module.h> | 16 | #include <linux/module.h> |
| 17 | #include <asm/semaphore.h> | 17 | #include <asm/semaphore.h> |
| 18 | #include <linux/crypto.h> | 18 | #include <linux/crypto.h> |
| 19 | #include <linux/err.h> | ||
| 19 | #include <linux/pfkeyv2.h> | 20 | #include <linux/pfkeyv2.h> |
| 20 | #include <linux/percpu.h> | 21 | #include <linux/percpu.h> |
| 21 | #include <linux/smp.h> | 22 | #include <linux/smp.h> |
| @@ -344,7 +345,7 @@ static struct crypto_comp **ipcomp_alloc_tfms(const char *alg_name) | |||
| 344 | for_each_possible_cpu(cpu) { | 345 | for_each_possible_cpu(cpu) { |
| 345 | struct crypto_comp *tfm = crypto_alloc_comp(alg_name, 0, | 346 | struct crypto_comp *tfm = crypto_alloc_comp(alg_name, 0, |
| 346 | CRYPTO_ALG_ASYNC); | 347 | CRYPTO_ALG_ASYNC); |
| 347 | if (!tfm) | 348 | if (IS_ERR(tfm)) |
| 348 | goto error; | 349 | goto error; |
| 349 | *per_cpu_ptr(tfms, cpu) = tfm; | 350 | *per_cpu_ptr(tfms, cpu) = tfm; |
| 350 | } | 351 | } |
diff --git a/net/ipv4/ipvs/ip_vs_conn.c b/net/ipv4/ipvs/ip_vs_conn.c index 4b702f708d30..b7eeae622d9b 100644 --- a/net/ipv4/ipvs/ip_vs_conn.c +++ b/net/ipv4/ipvs/ip_vs_conn.c | |||
| @@ -426,6 +426,25 @@ ip_vs_bind_dest(struct ip_vs_conn *cp, struct ip_vs_dest *dest) | |||
| 426 | 426 | ||
| 427 | 427 | ||
| 428 | /* | 428 | /* |
| 429 | * Check if there is a destination for the connection, if so | ||
| 430 | * bind the connection to the destination. | ||
| 431 | */ | ||
| 432 | struct ip_vs_dest *ip_vs_try_bind_dest(struct ip_vs_conn *cp) | ||
| 433 | { | ||
| 434 | struct ip_vs_dest *dest; | ||
| 435 | |||
| 436 | if ((cp) && (!cp->dest)) { | ||
| 437 | dest = ip_vs_find_dest(cp->daddr, cp->dport, | ||
| 438 | cp->vaddr, cp->vport, cp->protocol); | ||
| 439 | ip_vs_bind_dest(cp, dest); | ||
| 440 | return dest; | ||
| 441 | } else | ||
| 442 | return NULL; | ||
| 443 | } | ||
| 444 | EXPORT_SYMBOL(ip_vs_try_bind_dest); | ||
| 445 | |||
| 446 | |||
| 447 | /* | ||
| 429 | * Unbind a connection entry with its VS destination | 448 | * Unbind a connection entry with its VS destination |
| 430 | * Called by the ip_vs_conn_expire function. | 449 | * Called by the ip_vs_conn_expire function. |
| 431 | */ | 450 | */ |
diff --git a/net/ipv4/ipvs/ip_vs_core.c b/net/ipv4/ipvs/ip_vs_core.c index c6ed7654e839..20c884a57721 100644 --- a/net/ipv4/ipvs/ip_vs_core.c +++ b/net/ipv4/ipvs/ip_vs_core.c | |||
| @@ -979,15 +979,23 @@ ip_vs_in(unsigned int hooknum, struct sk_buff *skb, | |||
| 979 | ret = NF_ACCEPT; | 979 | ret = NF_ACCEPT; |
| 980 | } | 980 | } |
| 981 | 981 | ||
| 982 | /* increase its packet counter and check if it is needed | 982 | /* Increase its packet counter and check if it is needed |
| 983 | to be synchronized */ | 983 | * to be synchronized |
| 984 | * | ||
| 985 | * Sync connection if it is about to close to | ||
| 986 | * encorage the standby servers to update the connections timeout | ||
| 987 | */ | ||
| 984 | atomic_inc(&cp->in_pkts); | 988 | atomic_inc(&cp->in_pkts); |
| 985 | if ((ip_vs_sync_state & IP_VS_STATE_MASTER) && | 989 | if ((ip_vs_sync_state & IP_VS_STATE_MASTER) && |
| 986 | (cp->protocol != IPPROTO_TCP || | 990 | (((cp->protocol != IPPROTO_TCP || |
| 987 | cp->state == IP_VS_TCP_S_ESTABLISHED) && | 991 | cp->state == IP_VS_TCP_S_ESTABLISHED) && |
| 988 | (atomic_read(&cp->in_pkts) % sysctl_ip_vs_sync_threshold[1] | 992 | (atomic_read(&cp->in_pkts) % sysctl_ip_vs_sync_threshold[1] |
| 989 | == sysctl_ip_vs_sync_threshold[0])) | 993 | == sysctl_ip_vs_sync_threshold[0])) || |
| 994 | ((cp->protocol == IPPROTO_TCP) && (cp->old_state != cp->state) && | ||
| 995 | ((cp->state == IP_VS_TCP_S_FIN_WAIT) || | ||
| 996 | (cp->state == IP_VS_TCP_S_CLOSE))))) | ||
| 990 | ip_vs_sync_conn(cp); | 997 | ip_vs_sync_conn(cp); |
| 998 | cp->old_state = cp->state; | ||
| 991 | 999 | ||
| 992 | ip_vs_conn_put(cp); | 1000 | ip_vs_conn_put(cp); |
| 993 | return ret; | 1001 | return ret; |
diff --git a/net/ipv4/ipvs/ip_vs_ctl.c b/net/ipv4/ipvs/ip_vs_ctl.c index 7345fc252a23..3c4d22a468ec 100644 --- a/net/ipv4/ipvs/ip_vs_ctl.c +++ b/net/ipv4/ipvs/ip_vs_ctl.c | |||
| @@ -579,6 +579,32 @@ ip_vs_lookup_dest(struct ip_vs_service *svc, __be32 daddr, __be16 dport) | |||
| 579 | return NULL; | 579 | return NULL; |
| 580 | } | 580 | } |
| 581 | 581 | ||
| 582 | /* | ||
| 583 | * Find destination by {daddr,dport,vaddr,protocol} | ||
| 584 | * Cretaed to be used in ip_vs_process_message() in | ||
| 585 | * the backup synchronization daemon. It finds the | ||
| 586 | * destination to be bound to the received connection | ||
| 587 | * on the backup. | ||
| 588 | * | ||
| 589 | * ip_vs_lookup_real_service() looked promissing, but | ||
| 590 | * seems not working as expected. | ||
| 591 | */ | ||
| 592 | struct ip_vs_dest *ip_vs_find_dest(__be32 daddr, __be16 dport, | ||
| 593 | __be32 vaddr, __be16 vport, __u16 protocol) | ||
| 594 | { | ||
| 595 | struct ip_vs_dest *dest; | ||
| 596 | struct ip_vs_service *svc; | ||
| 597 | |||
| 598 | svc = ip_vs_service_get(0, protocol, vaddr, vport); | ||
| 599 | if (!svc) | ||
| 600 | return NULL; | ||
| 601 | dest = ip_vs_lookup_dest(svc, daddr, dport); | ||
| 602 | if (dest) | ||
| 603 | atomic_inc(&dest->refcnt); | ||
| 604 | ip_vs_service_put(svc); | ||
| 605 | return dest; | ||
| 606 | } | ||
| 607 | EXPORT_SYMBOL(ip_vs_find_dest); | ||
| 582 | 608 | ||
| 583 | /* | 609 | /* |
| 584 | * Lookup dest by {svc,addr,port} in the destination trash. | 610 | * Lookup dest by {svc,addr,port} in the destination trash. |
diff --git a/net/ipv4/ipvs/ip_vs_sync.c b/net/ipv4/ipvs/ip_vs_sync.c index 0d4d9721cbd4..bd930efc18da 100644 --- a/net/ipv4/ipvs/ip_vs_sync.c +++ b/net/ipv4/ipvs/ip_vs_sync.c | |||
| @@ -284,6 +284,7 @@ static void ip_vs_process_message(const char *buffer, const size_t buflen) | |||
| 284 | struct ip_vs_sync_conn_options *opt; | 284 | struct ip_vs_sync_conn_options *opt; |
| 285 | struct ip_vs_conn *cp; | 285 | struct ip_vs_conn *cp; |
| 286 | struct ip_vs_protocol *pp; | 286 | struct ip_vs_protocol *pp; |
| 287 | struct ip_vs_dest *dest; | ||
| 287 | char *p; | 288 | char *p; |
| 288 | int i; | 289 | int i; |
| 289 | 290 | ||
| @@ -317,20 +318,34 @@ static void ip_vs_process_message(const char *buffer, const size_t buflen) | |||
| 317 | s->caddr, s->cport, | 318 | s->caddr, s->cport, |
| 318 | s->vaddr, s->vport); | 319 | s->vaddr, s->vport); |
| 319 | if (!cp) { | 320 | if (!cp) { |
| 321 | /* | ||
| 322 | * Find the appropriate destination for the connection. | ||
| 323 | * If it is not found the connection will remain unbound | ||
| 324 | * but still handled. | ||
| 325 | */ | ||
| 326 | dest = ip_vs_find_dest(s->daddr, s->dport, | ||
| 327 | s->vaddr, s->vport, | ||
| 328 | s->protocol); | ||
| 320 | cp = ip_vs_conn_new(s->protocol, | 329 | cp = ip_vs_conn_new(s->protocol, |
| 321 | s->caddr, s->cport, | 330 | s->caddr, s->cport, |
| 322 | s->vaddr, s->vport, | 331 | s->vaddr, s->vport, |
| 323 | s->daddr, s->dport, | 332 | s->daddr, s->dport, |
| 324 | flags, NULL); | 333 | flags, dest); |
| 334 | if (dest) | ||
| 335 | atomic_dec(&dest->refcnt); | ||
| 325 | if (!cp) { | 336 | if (!cp) { |
| 326 | IP_VS_ERR("ip_vs_conn_new failed\n"); | 337 | IP_VS_ERR("ip_vs_conn_new failed\n"); |
| 327 | return; | 338 | return; |
| 328 | } | 339 | } |
| 329 | cp->state = ntohs(s->state); | 340 | cp->state = ntohs(s->state); |
| 330 | } else if (!cp->dest) { | 341 | } else if (!cp->dest) { |
| 331 | /* it is an entry created by the synchronization */ | 342 | dest = ip_vs_try_bind_dest(cp); |
| 332 | cp->state = ntohs(s->state); | 343 | if (!dest) { |
| 333 | cp->flags = flags | IP_VS_CONN_F_HASHED; | 344 | /* it is an unbound entry created by |
| 345 | * synchronization */ | ||
| 346 | cp->flags = flags | IP_VS_CONN_F_HASHED; | ||
| 347 | } else | ||
| 348 | atomic_dec(&dest->refcnt); | ||
| 334 | } /* Note that we don't touch its state and flags | 349 | } /* Note that we don't touch its state and flags |
| 335 | if it is a normal entry. */ | 350 | if it is a normal entry. */ |
| 336 | 351 | ||
| @@ -342,6 +357,7 @@ static void ip_vs_process_message(const char *buffer, const size_t buflen) | |||
| 342 | p += SIMPLE_CONN_SIZE; | 357 | p += SIMPLE_CONN_SIZE; |
| 343 | 358 | ||
| 344 | atomic_set(&cp->in_pkts, sysctl_ip_vs_sync_threshold[0]); | 359 | atomic_set(&cp->in_pkts, sysctl_ip_vs_sync_threshold[0]); |
| 360 | cp->state = ntohs(s->state); | ||
| 345 | pp = ip_vs_proto_get(s->protocol); | 361 | pp = ip_vs_proto_get(s->protocol); |
| 346 | cp->timeout = pp->timeout_table[cp->state]; | 362 | cp->timeout = pp->timeout_table[cp->state]; |
| 347 | ip_vs_conn_put(cp); | 363 | ip_vs_conn_put(cp); |
diff --git a/net/ipv4/netfilter/Makefile b/net/ipv4/netfilter/Makefile index 409d273f6f82..7456833d6ade 100644 --- a/net/ipv4/netfilter/Makefile +++ b/net/ipv4/netfilter/Makefile | |||
| @@ -41,27 +41,27 @@ obj-$(CONFIG_NF_NAT) += iptable_nat.o | |||
| 41 | obj-$(CONFIG_IP_NF_RAW) += iptable_raw.o | 41 | obj-$(CONFIG_IP_NF_RAW) += iptable_raw.o |
| 42 | 42 | ||
| 43 | # matches | 43 | # matches |
| 44 | obj-$(CONFIG_IP_NF_MATCH_ADDRTYPE) += ipt_addrtype.o | ||
| 45 | obj-$(CONFIG_IP_NF_MATCH_AH) += ipt_ah.o | ||
| 46 | obj-$(CONFIG_IP_NF_MATCH_ECN) += ipt_ecn.o | ||
| 44 | obj-$(CONFIG_IP_NF_MATCH_IPRANGE) += ipt_iprange.o | 47 | obj-$(CONFIG_IP_NF_MATCH_IPRANGE) += ipt_iprange.o |
| 45 | obj-$(CONFIG_IP_NF_MATCH_OWNER) += ipt_owner.o | 48 | obj-$(CONFIG_IP_NF_MATCH_OWNER) += ipt_owner.o |
| 46 | obj-$(CONFIG_IP_NF_MATCH_TOS) += ipt_tos.o | ||
| 47 | obj-$(CONFIG_IP_NF_MATCH_RECENT) += ipt_recent.o | 49 | obj-$(CONFIG_IP_NF_MATCH_RECENT) += ipt_recent.o |
| 48 | obj-$(CONFIG_IP_NF_MATCH_ECN) += ipt_ecn.o | 50 | obj-$(CONFIG_IP_NF_MATCH_TOS) += ipt_tos.o |
| 49 | obj-$(CONFIG_IP_NF_MATCH_AH) += ipt_ah.o | ||
| 50 | obj-$(CONFIG_IP_NF_MATCH_TTL) += ipt_ttl.o | 51 | obj-$(CONFIG_IP_NF_MATCH_TTL) += ipt_ttl.o |
| 51 | obj-$(CONFIG_IP_NF_MATCH_ADDRTYPE) += ipt_addrtype.o | ||
| 52 | 52 | ||
| 53 | # targets | 53 | # targets |
| 54 | obj-$(CONFIG_IP_NF_TARGET_REJECT) += ipt_REJECT.o | 54 | obj-$(CONFIG_IP_NF_TARGET_CLUSTERIP) += ipt_CLUSTERIP.o |
| 55 | obj-$(CONFIG_IP_NF_TARGET_TOS) += ipt_TOS.o | ||
| 56 | obj-$(CONFIG_IP_NF_TARGET_ECN) += ipt_ECN.o | 55 | obj-$(CONFIG_IP_NF_TARGET_ECN) += ipt_ECN.o |
| 56 | obj-$(CONFIG_IP_NF_TARGET_LOG) += ipt_LOG.o | ||
| 57 | obj-$(CONFIG_IP_NF_TARGET_MASQUERADE) += ipt_MASQUERADE.o | 57 | obj-$(CONFIG_IP_NF_TARGET_MASQUERADE) += ipt_MASQUERADE.o |
| 58 | obj-$(CONFIG_IP_NF_TARGET_REDIRECT) += ipt_REDIRECT.o | ||
| 59 | obj-$(CONFIG_IP_NF_TARGET_NETMAP) += ipt_NETMAP.o | 58 | obj-$(CONFIG_IP_NF_TARGET_NETMAP) += ipt_NETMAP.o |
| 59 | obj-$(CONFIG_IP_NF_TARGET_REDIRECT) += ipt_REDIRECT.o | ||
| 60 | obj-$(CONFIG_IP_NF_TARGET_REJECT) += ipt_REJECT.o | ||
| 60 | obj-$(CONFIG_IP_NF_TARGET_SAME) += ipt_SAME.o | 61 | obj-$(CONFIG_IP_NF_TARGET_SAME) += ipt_SAME.o |
| 61 | obj-$(CONFIG_IP_NF_TARGET_LOG) += ipt_LOG.o | 62 | obj-$(CONFIG_IP_NF_TARGET_TOS) += ipt_TOS.o |
| 62 | obj-$(CONFIG_IP_NF_TARGET_ULOG) += ipt_ULOG.o | ||
| 63 | obj-$(CONFIG_IP_NF_TARGET_CLUSTERIP) += ipt_CLUSTERIP.o | ||
| 64 | obj-$(CONFIG_IP_NF_TARGET_TTL) += ipt_TTL.o | 63 | obj-$(CONFIG_IP_NF_TARGET_TTL) += ipt_TTL.o |
| 64 | obj-$(CONFIG_IP_NF_TARGET_ULOG) += ipt_ULOG.o | ||
| 65 | 65 | ||
| 66 | # generic ARP tables | 66 | # generic ARP tables |
| 67 | obj-$(CONFIG_IP_NF_ARPTABLES) += arp_tables.o | 67 | obj-$(CONFIG_IP_NF_ARPTABLES) += arp_tables.o |
diff --git a/net/ipv4/netfilter/ip_queue.c b/net/ipv4/netfilter/ip_queue.c index 10a2ce09fd8e..14d64a383db1 100644 --- a/net/ipv4/netfilter/ip_queue.c +++ b/net/ipv4/netfilter/ip_queue.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <linux/spinlock.h> | 22 | #include <linux/spinlock.h> |
| 23 | #include <linux/sysctl.h> | 23 | #include <linux/sysctl.h> |
| 24 | #include <linux/proc_fs.h> | 24 | #include <linux/proc_fs.h> |
| 25 | #include <linux/seq_file.h> | ||
| 25 | #include <linux/security.h> | 26 | #include <linux/security.h> |
| 26 | #include <linux/mutex.h> | 27 | #include <linux/mutex.h> |
| 27 | #include <net/net_namespace.h> | 28 | #include <net/net_namespace.h> |
| @@ -607,15 +608,11 @@ static ctl_table ipq_root_table[] = { | |||
| 607 | { .ctl_name = 0 } | 608 | { .ctl_name = 0 } |
| 608 | }; | 609 | }; |
| 609 | 610 | ||
| 610 | #ifdef CONFIG_PROC_FS | 611 | static int ip_queue_show(struct seq_file *m, void *v) |
| 611 | static int | ||
| 612 | ipq_get_info(char *buffer, char **start, off_t offset, int length) | ||
| 613 | { | 612 | { |
| 614 | int len; | ||
| 615 | |||
| 616 | read_lock_bh(&queue_lock); | 613 | read_lock_bh(&queue_lock); |
| 617 | 614 | ||
| 618 | len = sprintf(buffer, | 615 | seq_printf(m, |
| 619 | "Peer PID : %d\n" | 616 | "Peer PID : %d\n" |
| 620 | "Copy mode : %hu\n" | 617 | "Copy mode : %hu\n" |
| 621 | "Copy range : %u\n" | 618 | "Copy range : %u\n" |
| @@ -632,16 +629,21 @@ ipq_get_info(char *buffer, char **start, off_t offset, int length) | |||
| 632 | queue_user_dropped); | 629 | queue_user_dropped); |
| 633 | 630 | ||
| 634 | read_unlock_bh(&queue_lock); | 631 | read_unlock_bh(&queue_lock); |
| 632 | return 0; | ||
| 633 | } | ||
| 635 | 634 | ||
| 636 | *start = buffer + offset; | 635 | static int ip_queue_open(struct inode *inode, struct file *file) |
| 637 | len -= offset; | 636 | { |
| 638 | if (len > length) | 637 | return single_open(file, ip_queue_show, NULL); |
| 639 | len = length; | ||
| 640 | else if (len < 0) | ||
| 641 | len = 0; | ||
| 642 | return len; | ||
| 643 | } | 638 | } |
| 644 | #endif /* CONFIG_PROC_FS */ | 639 | |
| 640 | static const struct file_operations ip_queue_proc_fops = { | ||
| 641 | .open = ip_queue_open, | ||
| 642 | .read = seq_read, | ||
| 643 | .llseek = seq_lseek, | ||
| 644 | .release = single_release, | ||
| 645 | .owner = THIS_MODULE, | ||
| 646 | }; | ||
| 645 | 647 | ||
| 646 | static struct nf_queue_handler nfqh = { | 648 | static struct nf_queue_handler nfqh = { |
| 647 | .name = "ip_queue", | 649 | .name = "ip_queue", |
| @@ -661,10 +663,11 @@ static int __init ip_queue_init(void) | |||
| 661 | goto cleanup_netlink_notifier; | 663 | goto cleanup_netlink_notifier; |
| 662 | } | 664 | } |
| 663 | 665 | ||
| 664 | proc = proc_net_create(&init_net, IPQ_PROC_FS_NAME, 0, ipq_get_info); | 666 | proc = create_proc_entry(IPQ_PROC_FS_NAME, 0, init_net.proc_net); |
| 665 | if (proc) | 667 | if (proc) { |
| 666 | proc->owner = THIS_MODULE; | 668 | proc->owner = THIS_MODULE; |
| 667 | else { | 669 | proc->proc_fops = &ip_queue_proc_fops; |
| 670 | } else { | ||
| 668 | printk(KERN_ERR "ip_queue: failed to create proc entry\n"); | 671 | printk(KERN_ERR "ip_queue: failed to create proc entry\n"); |
| 669 | goto cleanup_ipqnl; | 672 | goto cleanup_ipqnl; |
| 670 | } | 673 | } |
diff --git a/net/ipv4/netfilter/nf_nat_amanda.c b/net/ipv4/netfilter/nf_nat_amanda.c index 35a5aa69cd92..c31b87668250 100644 --- a/net/ipv4/netfilter/nf_nat_amanda.c +++ b/net/ipv4/netfilter/nf_nat_amanda.c | |||
| @@ -69,7 +69,7 @@ static void __exit nf_nat_amanda_fini(void) | |||
| 69 | 69 | ||
| 70 | static int __init nf_nat_amanda_init(void) | 70 | static int __init nf_nat_amanda_init(void) |
| 71 | { | 71 | { |
| 72 | BUG_ON(rcu_dereference(nf_nat_amanda_hook)); | 72 | BUG_ON(nf_nat_amanda_hook != NULL); |
| 73 | rcu_assign_pointer(nf_nat_amanda_hook, help); | 73 | rcu_assign_pointer(nf_nat_amanda_hook, help); |
| 74 | return 0; | 74 | return 0; |
| 75 | } | 75 | } |
diff --git a/net/ipv4/netfilter/nf_nat_ftp.c b/net/ipv4/netfilter/nf_nat_ftp.c index e1a16d3ea4cb..a1d5d58a58bf 100644 --- a/net/ipv4/netfilter/nf_nat_ftp.c +++ b/net/ipv4/netfilter/nf_nat_ftp.c | |||
| @@ -147,7 +147,7 @@ static void __exit nf_nat_ftp_fini(void) | |||
| 147 | 147 | ||
| 148 | static int __init nf_nat_ftp_init(void) | 148 | static int __init nf_nat_ftp_init(void) |
| 149 | { | 149 | { |
| 150 | BUG_ON(rcu_dereference(nf_nat_ftp_hook)); | 150 | BUG_ON(nf_nat_ftp_hook != NULL); |
| 151 | rcu_assign_pointer(nf_nat_ftp_hook, nf_nat_ftp); | 151 | rcu_assign_pointer(nf_nat_ftp_hook, nf_nat_ftp); |
| 152 | return 0; | 152 | return 0; |
| 153 | } | 153 | } |
diff --git a/net/ipv4/netfilter/nf_nat_h323.c b/net/ipv4/netfilter/nf_nat_h323.c index a868c8c41328..93e18ef114f2 100644 --- a/net/ipv4/netfilter/nf_nat_h323.c +++ b/net/ipv4/netfilter/nf_nat_h323.c | |||
| @@ -544,15 +544,15 @@ static int nat_callforwarding(struct sk_buff *skb, struct nf_conn *ct, | |||
| 544 | /****************************************************************************/ | 544 | /****************************************************************************/ |
| 545 | static int __init init(void) | 545 | static int __init init(void) |
| 546 | { | 546 | { |
| 547 | BUG_ON(rcu_dereference(set_h245_addr_hook) != NULL); | 547 | BUG_ON(set_h245_addr_hook != NULL); |
| 548 | BUG_ON(rcu_dereference(set_h225_addr_hook) != NULL); | 548 | BUG_ON(set_h225_addr_hook != NULL); |
| 549 | BUG_ON(rcu_dereference(set_sig_addr_hook) != NULL); | 549 | BUG_ON(set_sig_addr_hook != NULL); |
| 550 | BUG_ON(rcu_dereference(set_ras_addr_hook) != NULL); | 550 | BUG_ON(set_ras_addr_hook != NULL); |
| 551 | BUG_ON(rcu_dereference(nat_rtp_rtcp_hook) != NULL); | 551 | BUG_ON(nat_rtp_rtcp_hook != NULL); |
| 552 | BUG_ON(rcu_dereference(nat_t120_hook) != NULL); | 552 | BUG_ON(nat_t120_hook != NULL); |
| 553 | BUG_ON(rcu_dereference(nat_h245_hook) != NULL); | 553 | BUG_ON(nat_h245_hook != NULL); |
| 554 | BUG_ON(rcu_dereference(nat_callforwarding_hook) != NULL); | 554 | BUG_ON(nat_callforwarding_hook != NULL); |
| 555 | BUG_ON(rcu_dereference(nat_q931_hook) != NULL); | 555 | BUG_ON(nat_q931_hook != NULL); |
| 556 | 556 | ||
| 557 | rcu_assign_pointer(set_h245_addr_hook, set_h245_addr); | 557 | rcu_assign_pointer(set_h245_addr_hook, set_h245_addr); |
| 558 | rcu_assign_pointer(set_h225_addr_hook, set_h225_addr); | 558 | rcu_assign_pointer(set_h225_addr_hook, set_h225_addr); |
diff --git a/net/ipv4/netfilter/nf_nat_irc.c b/net/ipv4/netfilter/nf_nat_irc.c index 766e2c16c6b9..fe6f9cef6c85 100644 --- a/net/ipv4/netfilter/nf_nat_irc.c +++ b/net/ipv4/netfilter/nf_nat_irc.c | |||
| @@ -74,7 +74,7 @@ static void __exit nf_nat_irc_fini(void) | |||
| 74 | 74 | ||
| 75 | static int __init nf_nat_irc_init(void) | 75 | static int __init nf_nat_irc_init(void) |
| 76 | { | 76 | { |
| 77 | BUG_ON(rcu_dereference(nf_nat_irc_hook)); | 77 | BUG_ON(nf_nat_irc_hook != NULL); |
| 78 | rcu_assign_pointer(nf_nat_irc_hook, help); | 78 | rcu_assign_pointer(nf_nat_irc_hook, help); |
| 79 | return 0; | 79 | return 0; |
| 80 | } | 80 | } |
diff --git a/net/ipv4/netfilter/nf_nat_pptp.c b/net/ipv4/netfilter/nf_nat_pptp.c index e1385a099079..6817e7995f35 100644 --- a/net/ipv4/netfilter/nf_nat_pptp.c +++ b/net/ipv4/netfilter/nf_nat_pptp.c | |||
| @@ -281,16 +281,16 @@ static int __init nf_nat_helper_pptp_init(void) | |||
| 281 | { | 281 | { |
| 282 | nf_nat_need_gre(); | 282 | nf_nat_need_gre(); |
| 283 | 283 | ||
| 284 | BUG_ON(rcu_dereference(nf_nat_pptp_hook_outbound)); | 284 | BUG_ON(nf_nat_pptp_hook_outbound != NULL); |
| 285 | rcu_assign_pointer(nf_nat_pptp_hook_outbound, pptp_outbound_pkt); | 285 | rcu_assign_pointer(nf_nat_pptp_hook_outbound, pptp_outbound_pkt); |
| 286 | 286 | ||
| 287 | BUG_ON(rcu_dereference(nf_nat_pptp_hook_inbound)); | 287 | BUG_ON(nf_nat_pptp_hook_inbound != NULL); |
| 288 | rcu_assign_pointer(nf_nat_pptp_hook_inbound, pptp_inbound_pkt); | 288 | rcu_assign_pointer(nf_nat_pptp_hook_inbound, pptp_inbound_pkt); |
| 289 | 289 | ||
| 290 | BUG_ON(rcu_dereference(nf_nat_pptp_hook_exp_gre)); | 290 | BUG_ON(nf_nat_pptp_hook_exp_gre != NULL); |
| 291 | rcu_assign_pointer(nf_nat_pptp_hook_exp_gre, pptp_exp_gre); | 291 | rcu_assign_pointer(nf_nat_pptp_hook_exp_gre, pptp_exp_gre); |
| 292 | 292 | ||
| 293 | BUG_ON(rcu_dereference(nf_nat_pptp_hook_expectfn)); | 293 | BUG_ON(nf_nat_pptp_hook_expectfn != NULL); |
| 294 | rcu_assign_pointer(nf_nat_pptp_hook_expectfn, pptp_nat_expected); | 294 | rcu_assign_pointer(nf_nat_pptp_hook_expectfn, pptp_nat_expected); |
| 295 | return 0; | 295 | return 0; |
| 296 | } | 296 | } |
diff --git a/net/ipv4/netfilter/nf_nat_sip.c b/net/ipv4/netfilter/nf_nat_sip.c index ce9edbcc01e3..3ca98971a1e9 100644 --- a/net/ipv4/netfilter/nf_nat_sip.c +++ b/net/ipv4/netfilter/nf_nat_sip.c | |||
| @@ -293,8 +293,8 @@ static void __exit nf_nat_sip_fini(void) | |||
| 293 | 293 | ||
| 294 | static int __init nf_nat_sip_init(void) | 294 | static int __init nf_nat_sip_init(void) |
| 295 | { | 295 | { |
| 296 | BUG_ON(rcu_dereference(nf_nat_sip_hook)); | 296 | BUG_ON(nf_nat_sip_hook != NULL); |
| 297 | BUG_ON(rcu_dereference(nf_nat_sdp_hook)); | 297 | BUG_ON(nf_nat_sdp_hook != NULL); |
| 298 | rcu_assign_pointer(nf_nat_sip_hook, ip_nat_sip); | 298 | rcu_assign_pointer(nf_nat_sip_hook, ip_nat_sip); |
| 299 | rcu_assign_pointer(nf_nat_sdp_hook, ip_nat_sdp); | 299 | rcu_assign_pointer(nf_nat_sdp_hook, ip_nat_sdp); |
| 300 | return 0; | 300 | return 0; |
diff --git a/net/ipv4/netfilter/nf_nat_tftp.c b/net/ipv4/netfilter/nf_nat_tftp.c index 0ecec701cb44..1360a94766dd 100644 --- a/net/ipv4/netfilter/nf_nat_tftp.c +++ b/net/ipv4/netfilter/nf_nat_tftp.c | |||
| @@ -43,7 +43,7 @@ static void __exit nf_nat_tftp_fini(void) | |||
| 43 | 43 | ||
| 44 | static int __init nf_nat_tftp_init(void) | 44 | static int __init nf_nat_tftp_init(void) |
| 45 | { | 45 | { |
| 46 | BUG_ON(rcu_dereference(nf_nat_tftp_hook)); | 46 | BUG_ON(nf_nat_tftp_hook != NULL); |
| 47 | rcu_assign_pointer(nf_nat_tftp_hook, help); | 47 | rcu_assign_pointer(nf_nat_tftp_hook, help); |
| 48 | return 0; | 48 | return 0; |
| 49 | } | 49 | } |
diff --git a/net/ipv4/proc.c b/net/ipv4/proc.c index ffdccc0972e0..ce34b281803f 100644 --- a/net/ipv4/proc.c +++ b/net/ipv4/proc.c | |||
| @@ -46,17 +46,6 @@ | |||
| 46 | #include <net/sock.h> | 46 | #include <net/sock.h> |
| 47 | #include <net/raw.h> | 47 | #include <net/raw.h> |
| 48 | 48 | ||
| 49 | static int fold_prot_inuse(struct proto *proto) | ||
| 50 | { | ||
| 51 | int res = 0; | ||
| 52 | int cpu; | ||
| 53 | |||
| 54 | for_each_possible_cpu(cpu) | ||
| 55 | res += proto->stats[cpu].inuse; | ||
| 56 | |||
| 57 | return res; | ||
| 58 | } | ||
| 59 | |||
| 60 | /* | 49 | /* |
| 61 | * Report socket allocation statistics [mea@utu.fi] | 50 | * Report socket allocation statistics [mea@utu.fi] |
| 62 | */ | 51 | */ |
| @@ -64,12 +53,12 @@ static int sockstat_seq_show(struct seq_file *seq, void *v) | |||
| 64 | { | 53 | { |
| 65 | socket_seq_show(seq); | 54 | socket_seq_show(seq); |
| 66 | seq_printf(seq, "TCP: inuse %d orphan %d tw %d alloc %d mem %d\n", | 55 | seq_printf(seq, "TCP: inuse %d orphan %d tw %d alloc %d mem %d\n", |
| 67 | fold_prot_inuse(&tcp_prot), atomic_read(&tcp_orphan_count), | 56 | sock_prot_inuse(&tcp_prot), atomic_read(&tcp_orphan_count), |
| 68 | tcp_death_row.tw_count, atomic_read(&tcp_sockets_allocated), | 57 | tcp_death_row.tw_count, atomic_read(&tcp_sockets_allocated), |
| 69 | atomic_read(&tcp_memory_allocated)); | 58 | atomic_read(&tcp_memory_allocated)); |
| 70 | seq_printf(seq, "UDP: inuse %d\n", fold_prot_inuse(&udp_prot)); | 59 | seq_printf(seq, "UDP: inuse %d\n", sock_prot_inuse(&udp_prot)); |
| 71 | seq_printf(seq, "UDPLITE: inuse %d\n", fold_prot_inuse(&udplite_prot)); | 60 | seq_printf(seq, "UDPLITE: inuse %d\n", sock_prot_inuse(&udplite_prot)); |
| 72 | seq_printf(seq, "RAW: inuse %d\n", fold_prot_inuse(&raw_prot)); | 61 | seq_printf(seq, "RAW: inuse %d\n", sock_prot_inuse(&raw_prot)); |
| 73 | seq_printf(seq, "FRAG: inuse %d memory %d\n", | 62 | seq_printf(seq, "FRAG: inuse %d memory %d\n", |
| 74 | ip_frag_nqueues(), ip_frag_mem()); | 63 | ip_frag_nqueues(), ip_frag_mem()); |
| 75 | return 0; | 64 | return 0; |
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c index 3916faca3afe..66b42f547bf9 100644 --- a/net/ipv4/raw.c +++ b/net/ipv4/raw.c | |||
| @@ -760,6 +760,8 @@ static int raw_ioctl(struct sock *sk, int cmd, unsigned long arg) | |||
| 760 | } | 760 | } |
| 761 | } | 761 | } |
| 762 | 762 | ||
| 763 | DEFINE_PROTO_INUSE(raw) | ||
| 764 | |||
| 763 | struct proto raw_prot = { | 765 | struct proto raw_prot = { |
| 764 | .name = "RAW", | 766 | .name = "RAW", |
| 765 | .owner = THIS_MODULE, | 767 | .owner = THIS_MODULE, |
| @@ -781,6 +783,7 @@ struct proto raw_prot = { | |||
| 781 | .compat_setsockopt = compat_raw_setsockopt, | 783 | .compat_setsockopt = compat_raw_setsockopt, |
| 782 | .compat_getsockopt = compat_raw_getsockopt, | 784 | .compat_getsockopt = compat_raw_getsockopt, |
| 783 | #endif | 785 | #endif |
| 786 | REF_PROTO_INUSE(raw) | ||
| 784 | }; | 787 | }; |
| 785 | 788 | ||
| 786 | #ifdef CONFIG_PROC_FS | 789 | #ifdef CONFIG_PROC_FS |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index c64072bb504b..8e65182f7af1 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
| @@ -2456,11 +2456,11 @@ void __init tcp_init(void) | |||
| 2456 | thash_entries ? 0 : 512 * 1024); | 2456 | thash_entries ? 0 : 512 * 1024); |
| 2457 | tcp_hashinfo.ehash_size = 1 << tcp_hashinfo.ehash_size; | 2457 | tcp_hashinfo.ehash_size = 1 << tcp_hashinfo.ehash_size; |
| 2458 | for (i = 0; i < tcp_hashinfo.ehash_size; i++) { | 2458 | for (i = 0; i < tcp_hashinfo.ehash_size; i++) { |
| 2459 | rwlock_init(&tcp_hashinfo.ehash[i].lock); | ||
| 2460 | INIT_HLIST_HEAD(&tcp_hashinfo.ehash[i].chain); | 2459 | INIT_HLIST_HEAD(&tcp_hashinfo.ehash[i].chain); |
| 2461 | INIT_HLIST_HEAD(&tcp_hashinfo.ehash[i].twchain); | 2460 | INIT_HLIST_HEAD(&tcp_hashinfo.ehash[i].twchain); |
| 2462 | } | 2461 | } |
| 2463 | 2462 | if (inet_ehash_locks_alloc(&tcp_hashinfo)) | |
| 2463 | panic("TCP: failed to alloc ehash_locks"); | ||
| 2464 | tcp_hashinfo.bhash = | 2464 | tcp_hashinfo.bhash = |
| 2465 | alloc_large_system_hash("TCP bind", | 2465 | alloc_large_system_hash("TCP bind", |
| 2466 | sizeof(struct inet_bind_hashbucket), | 2466 | sizeof(struct inet_bind_hashbucket), |
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index d438dfb0c8f3..e566f3c67677 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
| @@ -2049,8 +2049,9 @@ static void *established_get_first(struct seq_file *seq) | |||
| 2049 | struct sock *sk; | 2049 | struct sock *sk; |
| 2050 | struct hlist_node *node; | 2050 | struct hlist_node *node; |
| 2051 | struct inet_timewait_sock *tw; | 2051 | struct inet_timewait_sock *tw; |
| 2052 | rwlock_t *lock = inet_ehash_lockp(&tcp_hashinfo, st->bucket); | ||
| 2052 | 2053 | ||
| 2053 | read_lock_bh(&tcp_hashinfo.ehash[st->bucket].lock); | 2054 | read_lock_bh(lock); |
| 2054 | sk_for_each(sk, node, &tcp_hashinfo.ehash[st->bucket].chain) { | 2055 | sk_for_each(sk, node, &tcp_hashinfo.ehash[st->bucket].chain) { |
| 2055 | if (sk->sk_family != st->family) { | 2056 | if (sk->sk_family != st->family) { |
| 2056 | continue; | 2057 | continue; |
| @@ -2067,7 +2068,7 @@ static void *established_get_first(struct seq_file *seq) | |||
| 2067 | rc = tw; | 2068 | rc = tw; |
| 2068 | goto out; | 2069 | goto out; |
| 2069 | } | 2070 | } |
| 2070 | read_unlock_bh(&tcp_hashinfo.ehash[st->bucket].lock); | 2071 | read_unlock_bh(lock); |
| 2071 | st->state = TCP_SEQ_STATE_ESTABLISHED; | 2072 | st->state = TCP_SEQ_STATE_ESTABLISHED; |
| 2072 | } | 2073 | } |
| 2073 | out: | 2074 | out: |
| @@ -2094,11 +2095,11 @@ get_tw: | |||
| 2094 | cur = tw; | 2095 | cur = tw; |
| 2095 | goto out; | 2096 | goto out; |
| 2096 | } | 2097 | } |
| 2097 | read_unlock_bh(&tcp_hashinfo.ehash[st->bucket].lock); | 2098 | read_unlock_bh(inet_ehash_lockp(&tcp_hashinfo, st->bucket)); |
| 2098 | st->state = TCP_SEQ_STATE_ESTABLISHED; | 2099 | st->state = TCP_SEQ_STATE_ESTABLISHED; |
| 2099 | 2100 | ||
| 2100 | if (++st->bucket < tcp_hashinfo.ehash_size) { | 2101 | if (++st->bucket < tcp_hashinfo.ehash_size) { |
| 2101 | read_lock_bh(&tcp_hashinfo.ehash[st->bucket].lock); | 2102 | read_lock_bh(inet_ehash_lockp(&tcp_hashinfo, st->bucket)); |
| 2102 | sk = sk_head(&tcp_hashinfo.ehash[st->bucket].chain); | 2103 | sk = sk_head(&tcp_hashinfo.ehash[st->bucket].chain); |
| 2103 | } else { | 2104 | } else { |
| 2104 | cur = NULL; | 2105 | cur = NULL; |
| @@ -2206,7 +2207,7 @@ static void tcp_seq_stop(struct seq_file *seq, void *v) | |||
| 2206 | case TCP_SEQ_STATE_TIME_WAIT: | 2207 | case TCP_SEQ_STATE_TIME_WAIT: |
| 2207 | case TCP_SEQ_STATE_ESTABLISHED: | 2208 | case TCP_SEQ_STATE_ESTABLISHED: |
| 2208 | if (v) | 2209 | if (v) |
| 2209 | read_unlock_bh(&tcp_hashinfo.ehash[st->bucket].lock); | 2210 | read_unlock_bh(inet_ehash_lockp(&tcp_hashinfo, st->bucket)); |
| 2210 | break; | 2211 | break; |
| 2211 | } | 2212 | } |
| 2212 | } | 2213 | } |
| @@ -2417,6 +2418,8 @@ void tcp4_proc_exit(void) | |||
| 2417 | } | 2418 | } |
| 2418 | #endif /* CONFIG_PROC_FS */ | 2419 | #endif /* CONFIG_PROC_FS */ |
| 2419 | 2420 | ||
| 2421 | DEFINE_PROTO_INUSE(tcp) | ||
| 2422 | |||
| 2420 | struct proto tcp_prot = { | 2423 | struct proto tcp_prot = { |
| 2421 | .name = "TCP", | 2424 | .name = "TCP", |
| 2422 | .owner = THIS_MODULE, | 2425 | .owner = THIS_MODULE, |
| @@ -2451,6 +2454,7 @@ struct proto tcp_prot = { | |||
| 2451 | .compat_setsockopt = compat_tcp_setsockopt, | 2454 | .compat_setsockopt = compat_tcp_setsockopt, |
| 2452 | .compat_getsockopt = compat_tcp_getsockopt, | 2455 | .compat_getsockopt = compat_tcp_getsockopt, |
| 2453 | #endif | 2456 | #endif |
| 2457 | REF_PROTO_INUSE(tcp) | ||
| 2454 | }; | 2458 | }; |
| 2455 | 2459 | ||
| 2456 | void __init tcp_v4_init(struct net_proto_family *ops) | 2460 | void __init tcp_v4_init(struct net_proto_family *ops) |
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 4bc25b46f33f..03c400ca14c5 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
| @@ -1430,6 +1430,8 @@ unsigned int udp_poll(struct file *file, struct socket *sock, poll_table *wait) | |||
| 1430 | 1430 | ||
| 1431 | } | 1431 | } |
| 1432 | 1432 | ||
| 1433 | DEFINE_PROTO_INUSE(udp) | ||
| 1434 | |||
| 1433 | struct proto udp_prot = { | 1435 | struct proto udp_prot = { |
| 1434 | .name = "UDP", | 1436 | .name = "UDP", |
| 1435 | .owner = THIS_MODULE, | 1437 | .owner = THIS_MODULE, |
| @@ -1452,6 +1454,7 @@ struct proto udp_prot = { | |||
| 1452 | .compat_setsockopt = compat_udp_setsockopt, | 1454 | .compat_setsockopt = compat_udp_setsockopt, |
| 1453 | .compat_getsockopt = compat_udp_getsockopt, | 1455 | .compat_getsockopt = compat_udp_getsockopt, |
| 1454 | #endif | 1456 | #endif |
| 1457 | REF_PROTO_INUSE(udp) | ||
| 1455 | }; | 1458 | }; |
| 1456 | 1459 | ||
| 1457 | /* ------------------------------------------------------------------------ */ | 1460 | /* ------------------------------------------------------------------------ */ |
diff --git a/net/ipv4/udplite.c b/net/ipv4/udplite.c index 94977205abb4..f5baeb3e8b85 100644 --- a/net/ipv4/udplite.c +++ b/net/ipv4/udplite.c | |||
| @@ -44,6 +44,8 @@ static struct net_protocol udplite_protocol = { | |||
| 44 | .no_policy = 1, | 44 | .no_policy = 1, |
| 45 | }; | 45 | }; |
| 46 | 46 | ||
| 47 | DEFINE_PROTO_INUSE(udplite) | ||
| 48 | |||
| 47 | struct proto udplite_prot = { | 49 | struct proto udplite_prot = { |
| 48 | .name = "UDP-Lite", | 50 | .name = "UDP-Lite", |
| 49 | .owner = THIS_MODULE, | 51 | .owner = THIS_MODULE, |
| @@ -67,6 +69,7 @@ struct proto udplite_prot = { | |||
| 67 | .compat_setsockopt = compat_udp_setsockopt, | 69 | .compat_setsockopt = compat_udp_setsockopt, |
| 68 | .compat_getsockopt = compat_udp_getsockopt, | 70 | .compat_getsockopt = compat_udp_getsockopt, |
| 69 | #endif | 71 | #endif |
| 72 | REF_PROTO_INUSE(udplite) | ||
| 70 | }; | 73 | }; |
| 71 | 74 | ||
| 72 | static struct inet_protosw udplite4_protosw = { | 75 | static struct inet_protosw udplite4_protosw = { |
diff --git a/net/ipv6/inet6_hashtables.c b/net/ipv6/inet6_hashtables.c index d6f1026f1943..adc73adadfae 100644 --- a/net/ipv6/inet6_hashtables.c +++ b/net/ipv6/inet6_hashtables.c | |||
| @@ -37,9 +37,8 @@ void __inet6_hash(struct inet_hashinfo *hashinfo, | |||
| 37 | } else { | 37 | } else { |
| 38 | unsigned int hash; | 38 | unsigned int hash; |
| 39 | sk->sk_hash = hash = inet6_sk_ehashfn(sk); | 39 | sk->sk_hash = hash = inet6_sk_ehashfn(sk); |
| 40 | hash &= (hashinfo->ehash_size - 1); | 40 | list = &inet_ehash_bucket(hashinfo, hash)->chain; |
| 41 | list = &hashinfo->ehash[hash].chain; | 41 | lock = inet_ehash_lockp(hashinfo, hash); |
| 42 | lock = &hashinfo->ehash[hash].lock; | ||
| 43 | write_lock(lock); | 42 | write_lock(lock); |
| 44 | } | 43 | } |
| 45 | 44 | ||
| @@ -70,9 +69,10 @@ struct sock *__inet6_lookup_established(struct inet_hashinfo *hashinfo, | |||
| 70 | */ | 69 | */ |
| 71 | unsigned int hash = inet6_ehashfn(daddr, hnum, saddr, sport); | 70 | unsigned int hash = inet6_ehashfn(daddr, hnum, saddr, sport); |
| 72 | struct inet_ehash_bucket *head = inet_ehash_bucket(hashinfo, hash); | 71 | struct inet_ehash_bucket *head = inet_ehash_bucket(hashinfo, hash); |
| 72 | rwlock_t *lock = inet_ehash_lockp(hashinfo, hash); | ||
| 73 | 73 | ||
| 74 | prefetch(head->chain.first); | 74 | prefetch(head->chain.first); |
| 75 | read_lock(&head->lock); | 75 | read_lock(lock); |
| 76 | sk_for_each(sk, node, &head->chain) { | 76 | sk_for_each(sk, node, &head->chain) { |
| 77 | /* For IPV6 do the cheaper port and family tests first. */ | 77 | /* For IPV6 do the cheaper port and family tests first. */ |
| 78 | if (INET6_MATCH(sk, hash, saddr, daddr, ports, dif)) | 78 | if (INET6_MATCH(sk, hash, saddr, daddr, ports, dif)) |
| @@ -92,12 +92,12 @@ struct sock *__inet6_lookup_established(struct inet_hashinfo *hashinfo, | |||
| 92 | goto hit; | 92 | goto hit; |
| 93 | } | 93 | } |
| 94 | } | 94 | } |
| 95 | read_unlock(&head->lock); | 95 | read_unlock(lock); |
| 96 | return NULL; | 96 | return NULL; |
| 97 | 97 | ||
| 98 | hit: | 98 | hit: |
| 99 | sock_hold(sk); | 99 | sock_hold(sk); |
| 100 | read_unlock(&head->lock); | 100 | read_unlock(lock); |
| 101 | return sk; | 101 | return sk; |
| 102 | } | 102 | } |
| 103 | EXPORT_SYMBOL(__inet6_lookup_established); | 103 | EXPORT_SYMBOL(__inet6_lookup_established); |
| @@ -175,12 +175,13 @@ static int __inet6_check_established(struct inet_timewait_death_row *death_row, | |||
| 175 | const unsigned int hash = inet6_ehashfn(daddr, lport, saddr, | 175 | const unsigned int hash = inet6_ehashfn(daddr, lport, saddr, |
| 176 | inet->dport); | 176 | inet->dport); |
| 177 | struct inet_ehash_bucket *head = inet_ehash_bucket(hinfo, hash); | 177 | struct inet_ehash_bucket *head = inet_ehash_bucket(hinfo, hash); |
| 178 | rwlock_t *lock = inet_ehash_lockp(hinfo, hash); | ||
| 178 | struct sock *sk2; | 179 | struct sock *sk2; |
| 179 | const struct hlist_node *node; | 180 | const struct hlist_node *node; |
| 180 | struct inet_timewait_sock *tw; | 181 | struct inet_timewait_sock *tw; |
| 181 | 182 | ||
| 182 | prefetch(head->chain.first); | 183 | prefetch(head->chain.first); |
| 183 | write_lock(&head->lock); | 184 | write_lock(lock); |
| 184 | 185 | ||
| 185 | /* Check TIME-WAIT sockets first. */ | 186 | /* Check TIME-WAIT sockets first. */ |
| 186 | sk_for_each(sk2, node, &head->twchain) { | 187 | sk_for_each(sk2, node, &head->twchain) { |
| @@ -216,7 +217,7 @@ unique: | |||
| 216 | __sk_add_node(sk, &head->chain); | 217 | __sk_add_node(sk, &head->chain); |
| 217 | sk->sk_hash = hash; | 218 | sk->sk_hash = hash; |
| 218 | sock_prot_inc_use(sk->sk_prot); | 219 | sock_prot_inc_use(sk->sk_prot); |
| 219 | write_unlock(&head->lock); | 220 | write_unlock(lock); |
| 220 | 221 | ||
| 221 | if (twp != NULL) { | 222 | if (twp != NULL) { |
| 222 | *twp = tw; | 223 | *twp = tw; |
| @@ -231,7 +232,7 @@ unique: | |||
| 231 | return 0; | 232 | return 0; |
| 232 | 233 | ||
| 233 | not_unique: | 234 | not_unique: |
| 234 | write_unlock(&head->lock); | 235 | write_unlock(lock); |
| 235 | return -EADDRNOTAVAIL; | 236 | return -EADDRNOTAVAIL; |
| 236 | } | 237 | } |
| 237 | 238 | ||
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 653fc0a8235b..86e1835ce4e4 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
| @@ -1339,6 +1339,19 @@ error: | |||
| 1339 | return err; | 1339 | return err; |
| 1340 | } | 1340 | } |
| 1341 | 1341 | ||
| 1342 | static void ip6_cork_release(struct inet_sock *inet, struct ipv6_pinfo *np) | ||
| 1343 | { | ||
| 1344 | inet->cork.flags &= ~IPCORK_OPT; | ||
| 1345 | kfree(np->cork.opt); | ||
| 1346 | np->cork.opt = NULL; | ||
| 1347 | if (np->cork.rt) { | ||
| 1348 | dst_release(&np->cork.rt->u.dst); | ||
| 1349 | np->cork.rt = NULL; | ||
| 1350 | inet->cork.flags &= ~IPCORK_ALLFRAG; | ||
| 1351 | } | ||
| 1352 | memset(&inet->cork.fl, 0, sizeof(inet->cork.fl)); | ||
| 1353 | } | ||
| 1354 | |||
| 1342 | int ip6_push_pending_frames(struct sock *sk) | 1355 | int ip6_push_pending_frames(struct sock *sk) |
| 1343 | { | 1356 | { |
| 1344 | struct sk_buff *skb, *tmp_skb; | 1357 | struct sk_buff *skb, *tmp_skb; |
| @@ -1415,15 +1428,7 @@ int ip6_push_pending_frames(struct sock *sk) | |||
| 1415 | } | 1428 | } |
| 1416 | 1429 | ||
| 1417 | out: | 1430 | out: |
| 1418 | inet->cork.flags &= ~IPCORK_OPT; | 1431 | ip6_cork_release(inet, np); |
| 1419 | kfree(np->cork.opt); | ||
| 1420 | np->cork.opt = NULL; | ||
| 1421 | if (np->cork.rt) { | ||
| 1422 | dst_release(&np->cork.rt->u.dst); | ||
| 1423 | np->cork.rt = NULL; | ||
| 1424 | inet->cork.flags &= ~IPCORK_ALLFRAG; | ||
| 1425 | } | ||
| 1426 | memset(&inet->cork.fl, 0, sizeof(inet->cork.fl)); | ||
| 1427 | return err; | 1432 | return err; |
| 1428 | error: | 1433 | error: |
| 1429 | goto out; | 1434 | goto out; |
| @@ -1431,8 +1436,6 @@ error: | |||
| 1431 | 1436 | ||
| 1432 | void ip6_flush_pending_frames(struct sock *sk) | 1437 | void ip6_flush_pending_frames(struct sock *sk) |
| 1433 | { | 1438 | { |
| 1434 | struct inet_sock *inet = inet_sk(sk); | ||
| 1435 | struct ipv6_pinfo *np = inet6_sk(sk); | ||
| 1436 | struct sk_buff *skb; | 1439 | struct sk_buff *skb; |
| 1437 | 1440 | ||
| 1438 | while ((skb = __skb_dequeue_tail(&sk->sk_write_queue)) != NULL) { | 1441 | while ((skb = __skb_dequeue_tail(&sk->sk_write_queue)) != NULL) { |
| @@ -1442,14 +1445,5 @@ void ip6_flush_pending_frames(struct sock *sk) | |||
| 1442 | kfree_skb(skb); | 1445 | kfree_skb(skb); |
| 1443 | } | 1446 | } |
| 1444 | 1447 | ||
| 1445 | inet->cork.flags &= ~IPCORK_OPT; | 1448 | ip6_cork_release(inet_sk(sk), inet6_sk(sk)); |
| 1446 | |||
| 1447 | kfree(np->cork.opt); | ||
| 1448 | np->cork.opt = NULL; | ||
| 1449 | if (np->cork.rt) { | ||
| 1450 | dst_release(&np->cork.rt->u.dst); | ||
| 1451 | np->cork.rt = NULL; | ||
| 1452 | inet->cork.flags &= ~IPCORK_ALLFRAG; | ||
| 1453 | } | ||
| 1454 | memset(&inet->cork.fl, 0, sizeof(inet->cork.fl)); | ||
| 1455 | } | 1449 | } |
diff --git a/net/ipv6/ipcomp6.c b/net/ipv6/ipcomp6.c index 85eb4798d8d2..0cd4056f9127 100644 --- a/net/ipv6/ipcomp6.c +++ b/net/ipv6/ipcomp6.c | |||
| @@ -36,6 +36,7 @@ | |||
| 36 | #include <net/ipcomp.h> | 36 | #include <net/ipcomp.h> |
| 37 | #include <asm/semaphore.h> | 37 | #include <asm/semaphore.h> |
| 38 | #include <linux/crypto.h> | 38 | #include <linux/crypto.h> |
| 39 | #include <linux/err.h> | ||
| 39 | #include <linux/pfkeyv2.h> | 40 | #include <linux/pfkeyv2.h> |
| 40 | #include <linux/random.h> | 41 | #include <linux/random.h> |
| 41 | #include <linux/percpu.h> | 42 | #include <linux/percpu.h> |
| @@ -358,7 +359,7 @@ static struct crypto_comp **ipcomp6_alloc_tfms(const char *alg_name) | |||
| 358 | for_each_possible_cpu(cpu) { | 359 | for_each_possible_cpu(cpu) { |
| 359 | struct crypto_comp *tfm = crypto_alloc_comp(alg_name, 0, | 360 | struct crypto_comp *tfm = crypto_alloc_comp(alg_name, 0, |
| 360 | CRYPTO_ALG_ASYNC); | 361 | CRYPTO_ALG_ASYNC); |
| 361 | if (!tfm) | 362 | if (IS_ERR(tfm)) |
| 362 | goto error; | 363 | goto error; |
| 363 | *per_cpu_ptr(tfms, cpu) = tfm; | 364 | *per_cpu_ptr(tfms, cpu) = tfm; |
| 364 | } | 365 | } |
diff --git a/net/ipv6/netfilter/Makefile b/net/ipv6/netfilter/Makefile index 4513eab77397..e789ec44d23b 100644 --- a/net/ipv6/netfilter/Makefile +++ b/net/ipv6/netfilter/Makefile | |||
| @@ -4,25 +4,29 @@ | |||
| 4 | 4 | ||
| 5 | # Link order matters here. | 5 | # Link order matters here. |
| 6 | obj-$(CONFIG_IP6_NF_IPTABLES) += ip6_tables.o | 6 | obj-$(CONFIG_IP6_NF_IPTABLES) += ip6_tables.o |
| 7 | obj-$(CONFIG_IP6_NF_MATCH_RT) += ip6t_rt.o | ||
| 8 | obj-$(CONFIG_IP6_NF_MATCH_OPTS) += ip6t_hbh.o | ||
| 9 | obj-$(CONFIG_IP6_NF_MATCH_IPV6HEADER) += ip6t_ipv6header.o | ||
| 10 | obj-$(CONFIG_IP6_NF_MATCH_FRAG) += ip6t_frag.o | ||
| 11 | obj-$(CONFIG_IP6_NF_MATCH_AH) += ip6t_ah.o | ||
| 12 | obj-$(CONFIG_IP6_NF_MATCH_EUI64) += ip6t_eui64.o | ||
| 13 | obj-$(CONFIG_IP6_NF_MATCH_OWNER) += ip6t_owner.o | ||
| 14 | obj-$(CONFIG_IP6_NF_FILTER) += ip6table_filter.o | 7 | obj-$(CONFIG_IP6_NF_FILTER) += ip6table_filter.o |
| 15 | obj-$(CONFIG_IP6_NF_MANGLE) += ip6table_mangle.o | 8 | obj-$(CONFIG_IP6_NF_MANGLE) += ip6table_mangle.o |
| 16 | obj-$(CONFIG_IP6_NF_TARGET_HL) += ip6t_HL.o | ||
| 17 | obj-$(CONFIG_IP6_NF_QUEUE) += ip6_queue.o | 9 | obj-$(CONFIG_IP6_NF_QUEUE) += ip6_queue.o |
| 18 | obj-$(CONFIG_IP6_NF_TARGET_LOG) += ip6t_LOG.o | ||
| 19 | obj-$(CONFIG_IP6_NF_RAW) += ip6table_raw.o | 10 | obj-$(CONFIG_IP6_NF_RAW) += ip6table_raw.o |
| 20 | obj-$(CONFIG_IP6_NF_MATCH_HL) += ip6t_hl.o | ||
| 21 | obj-$(CONFIG_IP6_NF_TARGET_REJECT) += ip6t_REJECT.o | ||
| 22 | obj-$(CONFIG_IP6_NF_MATCH_MH) += ip6t_mh.o | ||
| 23 | 11 | ||
| 24 | # objects for l3 independent conntrack | 12 | # objects for l3 independent conntrack |
| 25 | nf_conntrack_ipv6-objs := nf_conntrack_l3proto_ipv6.o nf_conntrack_proto_icmpv6.o nf_conntrack_reasm.o | 13 | nf_conntrack_ipv6-objs := nf_conntrack_l3proto_ipv6.o nf_conntrack_proto_icmpv6.o nf_conntrack_reasm.o |
| 26 | 14 | ||
| 27 | # l3 independent conntrack | 15 | # l3 independent conntrack |
| 28 | obj-$(CONFIG_NF_CONNTRACK_IPV6) += nf_conntrack_ipv6.o | 16 | obj-$(CONFIG_NF_CONNTRACK_IPV6) += nf_conntrack_ipv6.o |
| 17 | |||
| 18 | # matches | ||
| 19 | obj-$(CONFIG_IP6_NF_MATCH_AH) += ip6t_ah.o | ||
| 20 | obj-$(CONFIG_IP6_NF_MATCH_EUI64) += ip6t_eui64.o | ||
| 21 | obj-$(CONFIG_IP6_NF_MATCH_FRAG) += ip6t_frag.o | ||
| 22 | obj-$(CONFIG_IP6_NF_MATCH_HL) += ip6t_hl.o | ||
| 23 | obj-$(CONFIG_IP6_NF_MATCH_IPV6HEADER) += ip6t_ipv6header.o | ||
| 24 | obj-$(CONFIG_IP6_NF_MATCH_MH) += ip6t_mh.o | ||
| 25 | obj-$(CONFIG_IP6_NF_MATCH_OPTS) += ip6t_hbh.o | ||
| 26 | obj-$(CONFIG_IP6_NF_MATCH_OWNER) += ip6t_owner.o | ||
| 27 | obj-$(CONFIG_IP6_NF_MATCH_RT) += ip6t_rt.o | ||
| 28 | |||
| 29 | # targets | ||
| 30 | obj-$(CONFIG_IP6_NF_TARGET_HL) += ip6t_HL.o | ||
| 31 | obj-$(CONFIG_IP6_NF_TARGET_LOG) += ip6t_LOG.o | ||
| 32 | obj-$(CONFIG_IP6_NF_TARGET_REJECT) += ip6t_REJECT.o | ||
diff --git a/net/ipv6/netfilter/ip6_queue.c b/net/ipv6/netfilter/ip6_queue.c index 6413a30d9f68..e273605eef85 100644 --- a/net/ipv6/netfilter/ip6_queue.c +++ b/net/ipv6/netfilter/ip6_queue.c | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | #include <linux/spinlock.h> | 23 | #include <linux/spinlock.h> |
| 24 | #include <linux/sysctl.h> | 24 | #include <linux/sysctl.h> |
| 25 | #include <linux/proc_fs.h> | 25 | #include <linux/proc_fs.h> |
| 26 | #include <linux/seq_file.h> | ||
| 26 | #include <linux/mutex.h> | 27 | #include <linux/mutex.h> |
| 27 | #include <net/net_namespace.h> | 28 | #include <net/net_namespace.h> |
| 28 | #include <net/sock.h> | 29 | #include <net/sock.h> |
| @@ -596,15 +597,11 @@ static ctl_table ipq_root_table[] = { | |||
| 596 | { .ctl_name = 0 } | 597 | { .ctl_name = 0 } |
| 597 | }; | 598 | }; |
| 598 | 599 | ||
| 599 | #ifdef CONFIG_PROC_FS | 600 | static int ip6_queue_show(struct seq_file *m, void *v) |
| 600 | static int | ||
| 601 | ipq_get_info(char *buffer, char **start, off_t offset, int length) | ||
| 602 | { | 601 | { |
| 603 | int len; | ||
| 604 | |||
| 605 | read_lock_bh(&queue_lock); | 602 | read_lock_bh(&queue_lock); |
| 606 | 603 | ||
| 607 | len = sprintf(buffer, | 604 | seq_printf(m, |
| 608 | "Peer PID : %d\n" | 605 | "Peer PID : %d\n" |
| 609 | "Copy mode : %hu\n" | 606 | "Copy mode : %hu\n" |
| 610 | "Copy range : %u\n" | 607 | "Copy range : %u\n" |
| @@ -621,16 +618,21 @@ ipq_get_info(char *buffer, char **start, off_t offset, int length) | |||
| 621 | queue_user_dropped); | 618 | queue_user_dropped); |
| 622 | 619 | ||
| 623 | read_unlock_bh(&queue_lock); | 620 | read_unlock_bh(&queue_lock); |
| 621 | return 0; | ||
| 622 | } | ||
| 624 | 623 | ||
| 625 | *start = buffer + offset; | 624 | static int ip6_queue_open(struct inode *inode, struct file *file) |
| 626 | len -= offset; | 625 | { |
| 627 | if (len > length) | 626 | return single_open(file, ip6_queue_show, NULL); |
| 628 | len = length; | ||
| 629 | else if (len < 0) | ||
| 630 | len = 0; | ||
| 631 | return len; | ||
| 632 | } | 627 | } |
| 633 | #endif /* CONFIG_PROC_FS */ | 628 | |
| 629 | static const struct file_operations ip6_queue_proc_fops = { | ||
| 630 | .open = ip6_queue_open, | ||
| 631 | .read = seq_read, | ||
| 632 | .llseek = seq_lseek, | ||
| 633 | .release = single_release, | ||
| 634 | .owner = THIS_MODULE, | ||
| 635 | }; | ||
| 634 | 636 | ||
| 635 | static struct nf_queue_handler nfqh = { | 637 | static struct nf_queue_handler nfqh = { |
| 636 | .name = "ip6_queue", | 638 | .name = "ip6_queue", |
| @@ -650,10 +652,11 @@ static int __init ip6_queue_init(void) | |||
| 650 | goto cleanup_netlink_notifier; | 652 | goto cleanup_netlink_notifier; |
| 651 | } | 653 | } |
| 652 | 654 | ||
| 653 | proc = proc_net_create(&init_net, IPQ_PROC_FS_NAME, 0, ipq_get_info); | 655 | proc = create_proc_entry(IPQ_PROC_FS_NAME, 0, init_net.proc_net); |
| 654 | if (proc) | 656 | if (proc) { |
| 655 | proc->owner = THIS_MODULE; | 657 | proc->owner = THIS_MODULE; |
| 656 | else { | 658 | proc->proc_fops = &ip6_queue_proc_fops; |
| 659 | } else { | ||
| 657 | printk(KERN_ERR "ip6_queue: failed to create proc entry\n"); | 660 | printk(KERN_ERR "ip6_queue: failed to create proc entry\n"); |
| 658 | goto cleanup_ipqnl; | 661 | goto cleanup_ipqnl; |
| 659 | } | 662 | } |
diff --git a/net/ipv6/proc.c b/net/ipv6/proc.c index be526ad92543..8631ed7fe8a9 100644 --- a/net/ipv6/proc.c +++ b/net/ipv6/proc.c | |||
| @@ -32,27 +32,16 @@ | |||
| 32 | 32 | ||
| 33 | static struct proc_dir_entry *proc_net_devsnmp6; | 33 | static struct proc_dir_entry *proc_net_devsnmp6; |
| 34 | 34 | ||
| 35 | static int fold_prot_inuse(struct proto *proto) | ||
| 36 | { | ||
| 37 | int res = 0; | ||
| 38 | int cpu; | ||
| 39 | |||
| 40 | for_each_possible_cpu(cpu) | ||
| 41 | res += proto->stats[cpu].inuse; | ||
| 42 | |||
| 43 | return res; | ||
| 44 | } | ||
| 45 | |||
| 46 | static int sockstat6_seq_show(struct seq_file *seq, void *v) | 35 | static int sockstat6_seq_show(struct seq_file *seq, void *v) |
| 47 | { | 36 | { |
| 48 | seq_printf(seq, "TCP6: inuse %d\n", | 37 | seq_printf(seq, "TCP6: inuse %d\n", |
| 49 | fold_prot_inuse(&tcpv6_prot)); | 38 | sock_prot_inuse(&tcpv6_prot)); |
| 50 | seq_printf(seq, "UDP6: inuse %d\n", | 39 | seq_printf(seq, "UDP6: inuse %d\n", |
| 51 | fold_prot_inuse(&udpv6_prot)); | 40 | sock_prot_inuse(&udpv6_prot)); |
| 52 | seq_printf(seq, "UDPLITE6: inuse %d\n", | 41 | seq_printf(seq, "UDPLITE6: inuse %d\n", |
| 53 | fold_prot_inuse(&udplitev6_prot)); | 42 | sock_prot_inuse(&udplitev6_prot)); |
| 54 | seq_printf(seq, "RAW6: inuse %d\n", | 43 | seq_printf(seq, "RAW6: inuse %d\n", |
| 55 | fold_prot_inuse(&rawv6_prot)); | 44 | sock_prot_inuse(&rawv6_prot)); |
| 56 | seq_printf(seq, "FRAG6: inuse %d memory %d\n", | 45 | seq_printf(seq, "FRAG6: inuse %d memory %d\n", |
| 57 | ip6_frag_nqueues(), ip6_frag_mem()); | 46 | ip6_frag_nqueues(), ip6_frag_mem()); |
| 58 | return 0; | 47 | return 0; |
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index ca24ef19cd8f..807260d03586 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c | |||
| @@ -1144,6 +1144,8 @@ static int rawv6_init_sk(struct sock *sk) | |||
| 1144 | return(0); | 1144 | return(0); |
| 1145 | } | 1145 | } |
| 1146 | 1146 | ||
| 1147 | DEFINE_PROTO_INUSE(rawv6) | ||
| 1148 | |||
| 1147 | struct proto rawv6_prot = { | 1149 | struct proto rawv6_prot = { |
| 1148 | .name = "RAWv6", | 1150 | .name = "RAWv6", |
| 1149 | .owner = THIS_MODULE, | 1151 | .owner = THIS_MODULE, |
| @@ -1166,6 +1168,7 @@ struct proto rawv6_prot = { | |||
| 1166 | .compat_setsockopt = compat_rawv6_setsockopt, | 1168 | .compat_setsockopt = compat_rawv6_setsockopt, |
| 1167 | .compat_getsockopt = compat_rawv6_getsockopt, | 1169 | .compat_getsockopt = compat_rawv6_getsockopt, |
| 1168 | #endif | 1170 | #endif |
| 1171 | REF_PROTO_INUSE(rawv6) | ||
| 1169 | }; | 1172 | }; |
| 1170 | 1173 | ||
| 1171 | #ifdef CONFIG_PROC_FS | 1174 | #ifdef CONFIG_PROC_FS |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 95f8e4a62f68..973a97abc446 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
| @@ -38,12 +38,8 @@ | |||
| 38 | #include <linux/in6.h> | 38 | #include <linux/in6.h> |
| 39 | #include <linux/init.h> | 39 | #include <linux/init.h> |
| 40 | #include <linux/if_arp.h> | 40 | #include <linux/if_arp.h> |
| 41 | |||
| 42 | #ifdef CONFIG_PROC_FS | ||
| 43 | #include <linux/proc_fs.h> | 41 | #include <linux/proc_fs.h> |
| 44 | #include <linux/seq_file.h> | 42 | #include <linux/seq_file.h> |
| 45 | #endif | ||
| 46 | |||
| 47 | #include <net/net_namespace.h> | 43 | #include <net/net_namespace.h> |
| 48 | #include <net/snmp.h> | 44 | #include <net/snmp.h> |
| 49 | #include <net/ipv6.h> | 45 | #include <net/ipv6.h> |
| @@ -2288,71 +2284,50 @@ struct rt6_proc_arg | |||
| 2288 | 2284 | ||
| 2289 | static int rt6_info_route(struct rt6_info *rt, void *p_arg) | 2285 | static int rt6_info_route(struct rt6_info *rt, void *p_arg) |
| 2290 | { | 2286 | { |
| 2291 | struct rt6_proc_arg *arg = (struct rt6_proc_arg *) p_arg; | 2287 | struct seq_file *m = p_arg; |
| 2292 | 2288 | ||
| 2293 | if (arg->skip < arg->offset / RT6_INFO_LEN) { | 2289 | seq_printf(m, NIP6_SEQFMT " %02x ", NIP6(rt->rt6i_dst.addr), |
| 2294 | arg->skip++; | 2290 | rt->rt6i_dst.plen); |
| 2295 | return 0; | ||
| 2296 | } | ||
| 2297 | |||
| 2298 | if (arg->len >= arg->length) | ||
| 2299 | return 0; | ||
| 2300 | |||
| 2301 | arg->len += sprintf(arg->buffer + arg->len, | ||
| 2302 | NIP6_SEQFMT " %02x ", | ||
| 2303 | NIP6(rt->rt6i_dst.addr), | ||
| 2304 | rt->rt6i_dst.plen); | ||
| 2305 | 2291 | ||
| 2306 | #ifdef CONFIG_IPV6_SUBTREES | 2292 | #ifdef CONFIG_IPV6_SUBTREES |
| 2307 | arg->len += sprintf(arg->buffer + arg->len, | 2293 | seq_printf(m, NIP6_SEQFMT " %02x ", NIP6(rt->rt6i_src.addr), |
| 2308 | NIP6_SEQFMT " %02x ", | 2294 | rt->rt6i_src.plen); |
| 2309 | NIP6(rt->rt6i_src.addr), | ||
| 2310 | rt->rt6i_src.plen); | ||
| 2311 | #else | 2295 | #else |
| 2312 | arg->len += sprintf(arg->buffer + arg->len, | 2296 | seq_puts(m, "00000000000000000000000000000000 00 "); |
| 2313 | "00000000000000000000000000000000 00 "); | ||
| 2314 | #endif | 2297 | #endif |
| 2315 | 2298 | ||
| 2316 | if (rt->rt6i_nexthop) { | 2299 | if (rt->rt6i_nexthop) { |
| 2317 | arg->len += sprintf(arg->buffer + arg->len, | 2300 | seq_printf(m, NIP6_SEQFMT, |
| 2318 | NIP6_SEQFMT, | 2301 | NIP6(*((struct in6_addr *)rt->rt6i_nexthop->primary_key))); |
| 2319 | NIP6(*((struct in6_addr *)rt->rt6i_nexthop->primary_key))); | ||
| 2320 | } else { | 2302 | } else { |
| 2321 | arg->len += sprintf(arg->buffer + arg->len, | 2303 | seq_puts(m, "00000000000000000000000000000000"); |
| 2322 | "00000000000000000000000000000000"); | ||
| 2323 | } | 2304 | } |
| 2324 | arg->len += sprintf(arg->buffer + arg->len, | 2305 | seq_printf(m, " %08x %08x %08x %08x %8s\n", |
| 2325 | " %08x %08x %08x %08x %8s\n", | 2306 | rt->rt6i_metric, atomic_read(&rt->u.dst.__refcnt), |
| 2326 | rt->rt6i_metric, atomic_read(&rt->u.dst.__refcnt), | 2307 | rt->u.dst.__use, rt->rt6i_flags, |
| 2327 | rt->u.dst.__use, rt->rt6i_flags, | 2308 | rt->rt6i_dev ? rt->rt6i_dev->name : ""); |
| 2328 | rt->rt6i_dev ? rt->rt6i_dev->name : ""); | ||
| 2329 | return 0; | 2309 | return 0; |
| 2330 | } | 2310 | } |
| 2331 | 2311 | ||
| 2332 | static int rt6_proc_info(char *buffer, char **start, off_t offset, int length) | 2312 | static int ipv6_route_show(struct seq_file *m, void *v) |
| 2333 | { | 2313 | { |
| 2334 | struct rt6_proc_arg arg = { | 2314 | fib6_clean_all(rt6_info_route, 0, m); |
| 2335 | .buffer = buffer, | 2315 | return 0; |
| 2336 | .offset = offset, | 2316 | } |
| 2337 | .length = length, | ||
| 2338 | }; | ||
| 2339 | |||
| 2340 | fib6_clean_all(rt6_info_route, 0, &arg); | ||
| 2341 | |||
| 2342 | *start = buffer; | ||
| 2343 | if (offset) | ||
| 2344 | *start += offset % RT6_INFO_LEN; | ||
| 2345 | |||
| 2346 | arg.len -= offset % RT6_INFO_LEN; | ||
| 2347 | |||
| 2348 | if (arg.len > length) | ||
| 2349 | arg.len = length; | ||
| 2350 | if (arg.len < 0) | ||
| 2351 | arg.len = 0; | ||
| 2352 | 2317 | ||
| 2353 | return arg.len; | 2318 | static int ipv6_route_open(struct inode *inode, struct file *file) |
| 2319 | { | ||
| 2320 | return single_open(file, ipv6_route_show, NULL); | ||
| 2354 | } | 2321 | } |
| 2355 | 2322 | ||
| 2323 | static const struct file_operations ipv6_route_proc_fops = { | ||
| 2324 | .owner = THIS_MODULE, | ||
| 2325 | .open = ipv6_route_open, | ||
| 2326 | .read = seq_read, | ||
| 2327 | .llseek = seq_lseek, | ||
| 2328 | .release = single_release, | ||
| 2329 | }; | ||
| 2330 | |||
| 2356 | static int rt6_stats_seq_show(struct seq_file *seq, void *v) | 2331 | static int rt6_stats_seq_show(struct seq_file *seq, void *v) |
| 2357 | { | 2332 | { |
| 2358 | seq_printf(seq, "%04x %04x %04x %04x %04x %04x %04x\n", | 2333 | seq_printf(seq, "%04x %04x %04x %04x %04x %04x %04x\n", |
| @@ -2489,22 +2464,14 @@ ctl_table ipv6_route_table[] = { | |||
| 2489 | 2464 | ||
| 2490 | void __init ip6_route_init(void) | 2465 | void __init ip6_route_init(void) |
| 2491 | { | 2466 | { |
| 2492 | #ifdef CONFIG_PROC_FS | ||
| 2493 | struct proc_dir_entry *p; | ||
| 2494 | #endif | ||
| 2495 | ip6_dst_ops.kmem_cachep = | 2467 | ip6_dst_ops.kmem_cachep = |
| 2496 | kmem_cache_create("ip6_dst_cache", sizeof(struct rt6_info), 0, | 2468 | kmem_cache_create("ip6_dst_cache", sizeof(struct rt6_info), 0, |
| 2497 | SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL); | 2469 | SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL); |
| 2498 | ip6_dst_blackhole_ops.kmem_cachep = ip6_dst_ops.kmem_cachep; | 2470 | ip6_dst_blackhole_ops.kmem_cachep = ip6_dst_ops.kmem_cachep; |
| 2499 | 2471 | ||
| 2500 | fib6_init(); | 2472 | fib6_init(); |
| 2501 | #ifdef CONFIG_PROC_FS | 2473 | proc_net_fops_create(&init_net, "ipv6_route", 0, &ipv6_route_proc_fops); |
| 2502 | p = proc_net_create(&init_net, "ipv6_route", 0, rt6_proc_info); | ||
| 2503 | if (p) | ||
| 2504 | p->owner = THIS_MODULE; | ||
| 2505 | |||
| 2506 | proc_net_fops_create(&init_net, "rt6_stats", S_IRUGO, &rt6_stats_seq_fops); | 2474 | proc_net_fops_create(&init_net, "rt6_stats", S_IRUGO, &rt6_stats_seq_fops); |
| 2507 | #endif | ||
| 2508 | #ifdef CONFIG_XFRM | 2475 | #ifdef CONFIG_XFRM |
| 2509 | xfrm6_init(); | 2476 | xfrm6_init(); |
| 2510 | #endif | 2477 | #endif |
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index 06be2a1f2730..3aad861975a0 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
| @@ -2107,6 +2107,8 @@ void tcp6_proc_exit(void) | |||
| 2107 | } | 2107 | } |
| 2108 | #endif | 2108 | #endif |
| 2109 | 2109 | ||
| 2110 | DEFINE_PROTO_INUSE(tcpv6) | ||
| 2111 | |||
| 2110 | struct proto tcpv6_prot = { | 2112 | struct proto tcpv6_prot = { |
| 2111 | .name = "TCPv6", | 2113 | .name = "TCPv6", |
| 2112 | .owner = THIS_MODULE, | 2114 | .owner = THIS_MODULE, |
| @@ -2141,6 +2143,7 @@ struct proto tcpv6_prot = { | |||
| 2141 | .compat_setsockopt = compat_tcp_setsockopt, | 2143 | .compat_setsockopt = compat_tcp_setsockopt, |
| 2142 | .compat_getsockopt = compat_tcp_getsockopt, | 2144 | .compat_getsockopt = compat_tcp_getsockopt, |
| 2143 | #endif | 2145 | #endif |
| 2146 | REF_PROTO_INUSE(tcpv6) | ||
| 2144 | }; | 2147 | }; |
| 2145 | 2148 | ||
| 2146 | static struct inet6_protocol tcpv6_protocol = { | 2149 | static struct inet6_protocol tcpv6_protocol = { |
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index caebad6ee510..ee1cc3f8599f 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c | |||
| @@ -205,12 +205,11 @@ out: | |||
| 205 | return err; | 205 | return err; |
| 206 | 206 | ||
| 207 | csum_copy_err: | 207 | csum_copy_err: |
| 208 | UDP6_INC_STATS_USER(UDP_MIB_INERRORS, is_udplite); | ||
| 208 | skb_kill_datagram(sk, skb, flags); | 209 | skb_kill_datagram(sk, skb, flags); |
| 209 | 210 | ||
| 210 | if (flags & MSG_DONTWAIT) { | 211 | if (flags & MSG_DONTWAIT) |
| 211 | UDP6_INC_STATS_USER(UDP_MIB_INERRORS, is_udplite); | ||
| 212 | return -EAGAIN; | 212 | return -EAGAIN; |
| 213 | } | ||
| 214 | goto try_again; | 213 | goto try_again; |
| 215 | } | 214 | } |
| 216 | 215 | ||
| @@ -971,6 +970,8 @@ void udp6_proc_exit(void) { | |||
| 971 | 970 | ||
| 972 | /* ------------------------------------------------------------------------ */ | 971 | /* ------------------------------------------------------------------------ */ |
| 973 | 972 | ||
| 973 | DEFINE_PROTO_INUSE(udpv6) | ||
| 974 | |||
| 974 | struct proto udpv6_prot = { | 975 | struct proto udpv6_prot = { |
| 975 | .name = "UDPv6", | 976 | .name = "UDPv6", |
| 976 | .owner = THIS_MODULE, | 977 | .owner = THIS_MODULE, |
| @@ -992,6 +993,7 @@ struct proto udpv6_prot = { | |||
| 992 | .compat_setsockopt = compat_udpv6_setsockopt, | 993 | .compat_setsockopt = compat_udpv6_setsockopt, |
| 993 | .compat_getsockopt = compat_udpv6_getsockopt, | 994 | .compat_getsockopt = compat_udpv6_getsockopt, |
| 994 | #endif | 995 | #endif |
| 996 | REF_PROTO_INUSE(udpv6) | ||
| 995 | }; | 997 | }; |
| 996 | 998 | ||
| 997 | static struct inet_protosw udpv6_protosw = { | 999 | static struct inet_protosw udpv6_protosw = { |
diff --git a/net/ipv6/udplite.c b/net/ipv6/udplite.c index 766566f7de47..5a0379f71415 100644 --- a/net/ipv6/udplite.c +++ b/net/ipv6/udplite.c | |||
| @@ -40,6 +40,8 @@ static int udplite_v6_get_port(struct sock *sk, unsigned short snum) | |||
| 40 | return udplite_get_port(sk, snum, ipv6_rcv_saddr_equal); | 40 | return udplite_get_port(sk, snum, ipv6_rcv_saddr_equal); |
| 41 | } | 41 | } |
| 42 | 42 | ||
| 43 | DEFINE_PROTO_INUSE(udplitev6) | ||
| 44 | |||
| 43 | struct proto udplitev6_prot = { | 45 | struct proto udplitev6_prot = { |
| 44 | .name = "UDPLITEv6", | 46 | .name = "UDPLITEv6", |
| 45 | .owner = THIS_MODULE, | 47 | .owner = THIS_MODULE, |
| @@ -62,6 +64,7 @@ struct proto udplitev6_prot = { | |||
| 62 | .compat_setsockopt = compat_udpv6_setsockopt, | 64 | .compat_setsockopt = compat_udpv6_setsockopt, |
| 63 | .compat_getsockopt = compat_udpv6_getsockopt, | 65 | .compat_getsockopt = compat_udpv6_getsockopt, |
| 64 | #endif | 66 | #endif |
| 67 | REF_PROTO_INUSE(udplitev6) | ||
| 65 | }; | 68 | }; |
| 66 | 69 | ||
| 67 | static struct inet_protosw udplite6_protosw = { | 70 | static struct inet_protosw udplite6_protosw = { |
diff --git a/net/netfilter/Makefile b/net/netfilter/Makefile index 93c58f973831..ad0e36ebea3d 100644 --- a/net/netfilter/Makefile +++ b/net/netfilter/Makefile | |||
| @@ -40,15 +40,15 @@ obj-$(CONFIG_NETFILTER_XTABLES) += x_tables.o xt_tcpudp.o | |||
| 40 | # targets | 40 | # targets |
| 41 | obj-$(CONFIG_NETFILTER_XT_TARGET_CLASSIFY) += xt_CLASSIFY.o | 41 | obj-$(CONFIG_NETFILTER_XT_TARGET_CLASSIFY) += xt_CLASSIFY.o |
| 42 | obj-$(CONFIG_NETFILTER_XT_TARGET_CONNMARK) += xt_CONNMARK.o | 42 | obj-$(CONFIG_NETFILTER_XT_TARGET_CONNMARK) += xt_CONNMARK.o |
| 43 | obj-$(CONFIG_NETFILTER_XT_TARGET_CONNSECMARK) += xt_CONNSECMARK.o | ||
| 43 | obj-$(CONFIG_NETFILTER_XT_TARGET_DSCP) += xt_DSCP.o | 44 | obj-$(CONFIG_NETFILTER_XT_TARGET_DSCP) += xt_DSCP.o |
| 44 | obj-$(CONFIG_NETFILTER_XT_TARGET_MARK) += xt_MARK.o | 45 | obj-$(CONFIG_NETFILTER_XT_TARGET_MARK) += xt_MARK.o |
| 45 | obj-$(CONFIG_NETFILTER_XT_TARGET_NFQUEUE) += xt_NFQUEUE.o | ||
| 46 | obj-$(CONFIG_NETFILTER_XT_TARGET_NFLOG) += xt_NFLOG.o | 46 | obj-$(CONFIG_NETFILTER_XT_TARGET_NFLOG) += xt_NFLOG.o |
| 47 | obj-$(CONFIG_NETFILTER_XT_TARGET_NFQUEUE) += xt_NFQUEUE.o | ||
| 47 | obj-$(CONFIG_NETFILTER_XT_TARGET_NOTRACK) += xt_NOTRACK.o | 48 | obj-$(CONFIG_NETFILTER_XT_TARGET_NOTRACK) += xt_NOTRACK.o |
| 48 | obj-$(CONFIG_NETFILTER_XT_TARGET_TRACE) += xt_TRACE.o | ||
| 49 | obj-$(CONFIG_NETFILTER_XT_TARGET_SECMARK) += xt_SECMARK.o | 49 | obj-$(CONFIG_NETFILTER_XT_TARGET_SECMARK) += xt_SECMARK.o |
| 50 | obj-$(CONFIG_NETFILTER_XT_TARGET_TCPMSS) += xt_TCPMSS.o | 50 | obj-$(CONFIG_NETFILTER_XT_TARGET_TCPMSS) += xt_TCPMSS.o |
| 51 | obj-$(CONFIG_NETFILTER_XT_TARGET_CONNSECMARK) += xt_CONNSECMARK.o | 51 | obj-$(CONFIG_NETFILTER_XT_TARGET_TRACE) += xt_TRACE.o |
| 52 | 52 | ||
| 53 | # matches | 53 | # matches |
| 54 | obj-$(CONFIG_NETFILTER_XT_MATCH_COMMENT) += xt_comment.o | 54 | obj-$(CONFIG_NETFILTER_XT_MATCH_COMMENT) += xt_comment.o |
| @@ -59,22 +59,22 @@ obj-$(CONFIG_NETFILTER_XT_MATCH_CONNTRACK) += xt_conntrack.o | |||
| 59 | obj-$(CONFIG_NETFILTER_XT_MATCH_DCCP) += xt_dccp.o | 59 | obj-$(CONFIG_NETFILTER_XT_MATCH_DCCP) += xt_dccp.o |
| 60 | obj-$(CONFIG_NETFILTER_XT_MATCH_DSCP) += xt_dscp.o | 60 | obj-$(CONFIG_NETFILTER_XT_MATCH_DSCP) += xt_dscp.o |
| 61 | obj-$(CONFIG_NETFILTER_XT_MATCH_ESP) += xt_esp.o | 61 | obj-$(CONFIG_NETFILTER_XT_MATCH_ESP) += xt_esp.o |
| 62 | obj-$(CONFIG_NETFILTER_XT_MATCH_HASHLIMIT) += xt_hashlimit.o | ||
| 62 | obj-$(CONFIG_NETFILTER_XT_MATCH_HELPER) += xt_helper.o | 63 | obj-$(CONFIG_NETFILTER_XT_MATCH_HELPER) += xt_helper.o |
| 63 | obj-$(CONFIG_NETFILTER_XT_MATCH_LENGTH) += xt_length.o | 64 | obj-$(CONFIG_NETFILTER_XT_MATCH_LENGTH) += xt_length.o |
| 64 | obj-$(CONFIG_NETFILTER_XT_MATCH_LIMIT) += xt_limit.o | 65 | obj-$(CONFIG_NETFILTER_XT_MATCH_LIMIT) += xt_limit.o |
| 65 | obj-$(CONFIG_NETFILTER_XT_MATCH_MAC) += xt_mac.o | 66 | obj-$(CONFIG_NETFILTER_XT_MATCH_MAC) += xt_mac.o |
| 66 | obj-$(CONFIG_NETFILTER_XT_MATCH_MARK) += xt_mark.o | 67 | obj-$(CONFIG_NETFILTER_XT_MATCH_MARK) += xt_mark.o |
| 67 | obj-$(CONFIG_NETFILTER_XT_MATCH_MULTIPORT) += xt_multiport.o | 68 | obj-$(CONFIG_NETFILTER_XT_MATCH_MULTIPORT) += xt_multiport.o |
| 68 | obj-$(CONFIG_NETFILTER_XT_MATCH_POLICY) += xt_policy.o | 69 | obj-$(CONFIG_NETFILTER_XT_MATCH_PHYSDEV) += xt_physdev.o |
| 69 | obj-$(CONFIG_NETFILTER_XT_MATCH_PKTTYPE) += xt_pkttype.o | 70 | obj-$(CONFIG_NETFILTER_XT_MATCH_PKTTYPE) += xt_pkttype.o |
| 71 | obj-$(CONFIG_NETFILTER_XT_MATCH_POLICY) += xt_policy.o | ||
| 70 | obj-$(CONFIG_NETFILTER_XT_MATCH_QUOTA) += xt_quota.o | 72 | obj-$(CONFIG_NETFILTER_XT_MATCH_QUOTA) += xt_quota.o |
| 71 | obj-$(CONFIG_NETFILTER_XT_MATCH_REALM) += xt_realm.o | 73 | obj-$(CONFIG_NETFILTER_XT_MATCH_REALM) += xt_realm.o |
| 72 | obj-$(CONFIG_NETFILTER_XT_MATCH_SCTP) += xt_sctp.o | 74 | obj-$(CONFIG_NETFILTER_XT_MATCH_SCTP) += xt_sctp.o |
| 73 | obj-$(CONFIG_NETFILTER_XT_MATCH_STATE) += xt_state.o | 75 | obj-$(CONFIG_NETFILTER_XT_MATCH_STATE) += xt_state.o |
| 74 | obj-$(CONFIG_NETFILTER_XT_MATCH_STATISTIC) += xt_statistic.o | 76 | obj-$(CONFIG_NETFILTER_XT_MATCH_STATISTIC) += xt_statistic.o |
| 75 | obj-$(CONFIG_NETFILTER_XT_MATCH_STRING) += xt_string.o | 77 | obj-$(CONFIG_NETFILTER_XT_MATCH_STRING) += xt_string.o |
| 76 | obj-$(CONFIG_NETFILTER_XT_MATCH_TIME) += xt_time.o | ||
| 77 | obj-$(CONFIG_NETFILTER_XT_MATCH_TCPMSS) += xt_tcpmss.o | 78 | obj-$(CONFIG_NETFILTER_XT_MATCH_TCPMSS) += xt_tcpmss.o |
| 78 | obj-$(CONFIG_NETFILTER_XT_MATCH_PHYSDEV) += xt_physdev.o | 79 | obj-$(CONFIG_NETFILTER_XT_MATCH_TIME) += xt_time.o |
| 79 | obj-$(CONFIG_NETFILTER_XT_MATCH_U32) += xt_u32.o | 80 | obj-$(CONFIG_NETFILTER_XT_MATCH_U32) += xt_u32.o |
| 80 | obj-$(CONFIG_NETFILTER_XT_MATCH_HASHLIMIT) += xt_hashlimit.o | ||
diff --git a/net/netfilter/nf_sockopt.c b/net/netfilter/nf_sockopt.c index aa2831587b82..2dfac3253569 100644 --- a/net/netfilter/nf_sockopt.c +++ b/net/netfilter/nf_sockopt.c | |||
| @@ -23,14 +23,13 @@ static inline int overlap(int min1, int max1, int min2, int max2) | |||
| 23 | /* Functions to register sockopt ranges (exclusive). */ | 23 | /* Functions to register sockopt ranges (exclusive). */ |
| 24 | int nf_register_sockopt(struct nf_sockopt_ops *reg) | 24 | int nf_register_sockopt(struct nf_sockopt_ops *reg) |
| 25 | { | 25 | { |
| 26 | struct list_head *i; | 26 | struct nf_sockopt_ops *ops; |
| 27 | int ret = 0; | 27 | int ret = 0; |
| 28 | 28 | ||
| 29 | if (mutex_lock_interruptible(&nf_sockopt_mutex) != 0) | 29 | if (mutex_lock_interruptible(&nf_sockopt_mutex) != 0) |
| 30 | return -EINTR; | 30 | return -EINTR; |
| 31 | 31 | ||
| 32 | list_for_each(i, &nf_sockopts) { | 32 | list_for_each_entry(ops, &nf_sockopts, list) { |
| 33 | struct nf_sockopt_ops *ops = (struct nf_sockopt_ops *)i; | ||
| 34 | if (ops->pf == reg->pf | 33 | if (ops->pf == reg->pf |
| 35 | && (overlap(ops->set_optmin, ops->set_optmax, | 34 | && (overlap(ops->set_optmin, ops->set_optmax, |
| 36 | reg->set_optmin, reg->set_optmax) | 35 | reg->set_optmin, reg->set_optmax) |
| @@ -65,7 +64,6 @@ EXPORT_SYMBOL(nf_unregister_sockopt); | |||
| 65 | static int nf_sockopt(struct sock *sk, int pf, int val, | 64 | static int nf_sockopt(struct sock *sk, int pf, int val, |
| 66 | char __user *opt, int *len, int get) | 65 | char __user *opt, int *len, int get) |
| 67 | { | 66 | { |
| 68 | struct list_head *i; | ||
| 69 | struct nf_sockopt_ops *ops; | 67 | struct nf_sockopt_ops *ops; |
| 70 | int ret; | 68 | int ret; |
| 71 | 69 | ||
| @@ -75,8 +73,7 @@ static int nf_sockopt(struct sock *sk, int pf, int val, | |||
| 75 | if (mutex_lock_interruptible(&nf_sockopt_mutex) != 0) | 73 | if (mutex_lock_interruptible(&nf_sockopt_mutex) != 0) |
| 76 | return -EINTR; | 74 | return -EINTR; |
| 77 | 75 | ||
| 78 | list_for_each(i, &nf_sockopts) { | 76 | list_for_each_entry(ops, &nf_sockopts, list) { |
| 79 | ops = (struct nf_sockopt_ops *)i; | ||
| 80 | if (ops->pf == pf) { | 77 | if (ops->pf == pf) { |
| 81 | if (!try_module_get(ops->owner)) | 78 | if (!try_module_get(ops->owner)) |
| 82 | goto out_nosup; | 79 | goto out_nosup; |
| @@ -124,7 +121,6 @@ EXPORT_SYMBOL(nf_getsockopt); | |||
| 124 | static int compat_nf_sockopt(struct sock *sk, int pf, int val, | 121 | static int compat_nf_sockopt(struct sock *sk, int pf, int val, |
| 125 | char __user *opt, int *len, int get) | 122 | char __user *opt, int *len, int get) |
| 126 | { | 123 | { |
| 127 | struct list_head *i; | ||
| 128 | struct nf_sockopt_ops *ops; | 124 | struct nf_sockopt_ops *ops; |
| 129 | int ret; | 125 | int ret; |
| 130 | 126 | ||
| @@ -135,8 +131,7 @@ static int compat_nf_sockopt(struct sock *sk, int pf, int val, | |||
| 135 | if (mutex_lock_interruptible(&nf_sockopt_mutex) != 0) | 131 | if (mutex_lock_interruptible(&nf_sockopt_mutex) != 0) |
| 136 | return -EINTR; | 132 | return -EINTR; |
| 137 | 133 | ||
| 138 | list_for_each(i, &nf_sockopts) { | 134 | list_for_each_entry(ops, &nf_sockopts, list) { |
| 139 | ops = (struct nf_sockopt_ops *)i; | ||
| 140 | if (ops->pf == pf) { | 135 | if (ops->pf == pf) { |
| 141 | if (!try_module_get(ops->owner)) | 136 | if (!try_module_get(ops->owner)) |
| 142 | goto out_nosup; | 137 | goto out_nosup; |
diff --git a/net/netfilter/xt_connlimit.c b/net/netfilter/xt_connlimit.c index 06cff1d13690..d7becf08a93a 100644 --- a/net/netfilter/xt_connlimit.c +++ b/net/netfilter/xt_connlimit.c | |||
| @@ -4,7 +4,8 @@ | |||
| 4 | * (c) 2000 Gerd Knorr <kraxel@bytesex.org> | 4 | * (c) 2000 Gerd Knorr <kraxel@bytesex.org> |
| 5 | * Nov 2002: Martin Bene <martin.bene@icomedias.com>: | 5 | * Nov 2002: Martin Bene <martin.bene@icomedias.com>: |
| 6 | * only ignore TIME_WAIT or gone connections | 6 | * only ignore TIME_WAIT or gone connections |
| 7 | * Copyright © Jan Engelhardt <jengelh@gmx.de>, 2007 | 7 | * (C) CC Computer Consultants GmbH, 2007 |
| 8 | * Contact: <jengelh@computergmbh.de> | ||
| 8 | * | 9 | * |
| 9 | * based on ... | 10 | * based on ... |
| 10 | * | 11 | * |
| @@ -306,7 +307,7 @@ static void __exit xt_connlimit_exit(void) | |||
| 306 | 307 | ||
| 307 | module_init(xt_connlimit_init); | 308 | module_init(xt_connlimit_init); |
| 308 | module_exit(xt_connlimit_exit); | 309 | module_exit(xt_connlimit_exit); |
| 309 | MODULE_AUTHOR("Jan Engelhardt <jengelh@gmx.de>"); | 310 | MODULE_AUTHOR("Jan Engelhardt <jengelh@computergmbh.de>"); |
| 310 | MODULE_DESCRIPTION("netfilter xt_connlimit match module"); | 311 | MODULE_DESCRIPTION("netfilter xt_connlimit match module"); |
| 311 | MODULE_LICENSE("GPL"); | 312 | MODULE_LICENSE("GPL"); |
| 312 | MODULE_ALIAS("ipt_connlimit"); | 313 | MODULE_ALIAS("ipt_connlimit"); |
diff --git a/net/netfilter/xt_time.c b/net/netfilter/xt_time.c index ef48bbd93573..ff44f86c24ce 100644 --- a/net/netfilter/xt_time.c +++ b/net/netfilter/xt_time.c | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * xt_time | 2 | * xt_time |
| 3 | * Copyright © Jan Engelhardt <jengelh@computergmbh.de>, 2007 | 3 | * Copyright © CC Computer Consultants GmbH, 2007 |
| 4 | * Contact: <jengelh@computergmbh.de> | ||
| 4 | * | 5 | * |
| 5 | * based on ipt_time by Fabrice MARIE <fabrice@netfilter.org> | 6 | * based on ipt_time by Fabrice MARIE <fabrice@netfilter.org> |
| 6 | * This is a module which is used for time matching | 7 | * This is a module which is used for time matching |
diff --git a/net/netfilter/xt_u32.c b/net/netfilter/xt_u32.c index bec427915b30..af75b8c3f20b 100644 --- a/net/netfilter/xt_u32.c +++ b/net/netfilter/xt_u32.c | |||
| @@ -2,7 +2,8 @@ | |||
| 2 | * xt_u32 - kernel module to match u32 packet content | 2 | * xt_u32 - kernel module to match u32 packet content |
| 3 | * | 3 | * |
| 4 | * Original author: Don Cohen <don@isis.cs3-inc.com> | 4 | * Original author: Don Cohen <don@isis.cs3-inc.com> |
| 5 | * © Jan Engelhardt <jengelh@gmx.de>, 2007 | 5 | * (C) CC Computer Consultants GmbH, 2007 |
| 6 | * Contact: <jengelh@computergmbh.de> | ||
| 6 | */ | 7 | */ |
| 7 | 8 | ||
| 8 | #include <linux/module.h> | 9 | #include <linux/module.h> |
| @@ -129,7 +130,7 @@ static void __exit xt_u32_exit(void) | |||
| 129 | 130 | ||
| 130 | module_init(xt_u32_init); | 131 | module_init(xt_u32_init); |
| 131 | module_exit(xt_u32_exit); | 132 | module_exit(xt_u32_exit); |
| 132 | MODULE_AUTHOR("Jan Engelhardt <jengelh@gmx.de>"); | 133 | MODULE_AUTHOR("Jan Engelhardt <jengelh@computergmbh.de>"); |
| 133 | MODULE_DESCRIPTION("netfilter u32 match module"); | 134 | MODULE_DESCRIPTION("netfilter u32 match module"); |
| 134 | MODULE_LICENSE("GPL"); | 135 | MODULE_LICENSE("GPL"); |
| 135 | MODULE_ALIAS("ipt_u32"); | 136 | MODULE_ALIAS("ipt_u32"); |
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 260171255576..415c97236f63 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c | |||
| @@ -752,7 +752,7 @@ struct sock *netlink_getsockbyfilp(struct file *filp) | |||
| 752 | * 1: repeat lookup - reference dropped while waiting for socket memory. | 752 | * 1: repeat lookup - reference dropped while waiting for socket memory. |
| 753 | */ | 753 | */ |
| 754 | int netlink_attachskb(struct sock *sk, struct sk_buff *skb, int nonblock, | 754 | int netlink_attachskb(struct sock *sk, struct sk_buff *skb, int nonblock, |
| 755 | long timeo, struct sock *ssk) | 755 | long *timeo, struct sock *ssk) |
| 756 | { | 756 | { |
| 757 | struct netlink_sock *nlk; | 757 | struct netlink_sock *nlk; |
| 758 | 758 | ||
| @@ -761,7 +761,7 @@ int netlink_attachskb(struct sock *sk, struct sk_buff *skb, int nonblock, | |||
| 761 | if (atomic_read(&sk->sk_rmem_alloc) > sk->sk_rcvbuf || | 761 | if (atomic_read(&sk->sk_rmem_alloc) > sk->sk_rcvbuf || |
| 762 | test_bit(0, &nlk->state)) { | 762 | test_bit(0, &nlk->state)) { |
| 763 | DECLARE_WAITQUEUE(wait, current); | 763 | DECLARE_WAITQUEUE(wait, current); |
| 764 | if (!timeo) { | 764 | if (!*timeo) { |
| 765 | if (!ssk || netlink_is_kernel(ssk)) | 765 | if (!ssk || netlink_is_kernel(ssk)) |
| 766 | netlink_overrun(sk); | 766 | netlink_overrun(sk); |
| 767 | sock_put(sk); | 767 | sock_put(sk); |
| @@ -775,7 +775,7 @@ int netlink_attachskb(struct sock *sk, struct sk_buff *skb, int nonblock, | |||
| 775 | if ((atomic_read(&sk->sk_rmem_alloc) > sk->sk_rcvbuf || | 775 | if ((atomic_read(&sk->sk_rmem_alloc) > sk->sk_rcvbuf || |
| 776 | test_bit(0, &nlk->state)) && | 776 | test_bit(0, &nlk->state)) && |
| 777 | !sock_flag(sk, SOCK_DEAD)) | 777 | !sock_flag(sk, SOCK_DEAD)) |
| 778 | timeo = schedule_timeout(timeo); | 778 | *timeo = schedule_timeout(*timeo); |
| 779 | 779 | ||
| 780 | __set_current_state(TASK_RUNNING); | 780 | __set_current_state(TASK_RUNNING); |
| 781 | remove_wait_queue(&nlk->wait, &wait); | 781 | remove_wait_queue(&nlk->wait, &wait); |
| @@ -783,7 +783,7 @@ int netlink_attachskb(struct sock *sk, struct sk_buff *skb, int nonblock, | |||
| 783 | 783 | ||
| 784 | if (signal_pending(current)) { | 784 | if (signal_pending(current)) { |
| 785 | kfree_skb(skb); | 785 | kfree_skb(skb); |
| 786 | return sock_intr_errno(timeo); | 786 | return sock_intr_errno(*timeo); |
| 787 | } | 787 | } |
| 788 | return 1; | 788 | return 1; |
| 789 | } | 789 | } |
| @@ -877,7 +877,7 @@ retry: | |||
| 877 | if (netlink_is_kernel(sk)) | 877 | if (netlink_is_kernel(sk)) |
| 878 | return netlink_unicast_kernel(sk, skb); | 878 | return netlink_unicast_kernel(sk, skb); |
| 879 | 879 | ||
| 880 | err = netlink_attachskb(sk, skb, nonblock, timeo, ssk); | 880 | err = netlink_attachskb(sk, skb, nonblock, &timeo, ssk); |
| 881 | if (err == 1) | 881 | if (err == 1) |
| 882 | goto retry; | 882 | goto retry; |
| 883 | if (err) | 883 | if (err) |
diff --git a/net/sched/cls_u32.c b/net/sched/cls_u32.c index 9e98c6e567dd..53171029439f 100644 --- a/net/sched/cls_u32.c +++ b/net/sched/cls_u32.c | |||
| @@ -91,7 +91,7 @@ static struct tc_u_common *u32_list; | |||
| 91 | 91 | ||
| 92 | static __inline__ unsigned u32_hash_fold(u32 key, struct tc_u32_sel *sel, u8 fshift) | 92 | static __inline__ unsigned u32_hash_fold(u32 key, struct tc_u32_sel *sel, u8 fshift) |
| 93 | { | 93 | { |
| 94 | unsigned h = (key & sel->hmask)>>fshift; | 94 | unsigned h = ntohl(key & sel->hmask)>>fshift; |
| 95 | 95 | ||
| 96 | return h; | 96 | return h; |
| 97 | } | 97 | } |
| @@ -615,7 +615,7 @@ static int u32_change(struct tcf_proto *tp, unsigned long base, u32 handle, | |||
| 615 | n->handle = handle; | 615 | n->handle = handle; |
| 616 | { | 616 | { |
| 617 | u8 i = 0; | 617 | u8 i = 0; |
| 618 | u32 mask = s->hmask; | 618 | u32 mask = ntohl(s->hmask); |
| 619 | if (mask) { | 619 | if (mask) { |
| 620 | while (!(mask & 1)) { | 620 | while (!(mask & 1)) { |
| 621 | i++; | 621 | i++; |
diff --git a/net/sched/sch_teql.c b/net/sched/sch_teql.c index 421281d9dd1d..c0ed06d4a504 100644 --- a/net/sched/sch_teql.c +++ b/net/sched/sch_teql.c | |||
| @@ -252,6 +252,9 @@ __teql_resolve(struct sk_buff *skb, struct sk_buff *skb_res, struct net_device * | |||
| 252 | static inline int teql_resolve(struct sk_buff *skb, | 252 | static inline int teql_resolve(struct sk_buff *skb, |
| 253 | struct sk_buff *skb_res, struct net_device *dev) | 253 | struct sk_buff *skb_res, struct net_device *dev) |
| 254 | { | 254 | { |
| 255 | if (dev->qdisc == &noop_qdisc) | ||
| 256 | return -ENODEV; | ||
| 257 | |||
| 255 | if (dev->header_ops == NULL || | 258 | if (dev->header_ops == NULL || |
| 256 | skb->dst == NULL || | 259 | skb->dst == NULL || |
| 257 | skb->dst->neighbour == NULL) | 260 | skb->dst->neighbour == NULL) |
diff --git a/net/sctp/socket.c b/net/sctp/socket.c index bd6f42a15a4b..a7ecf3159e53 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c | |||
| @@ -6455,6 +6455,8 @@ static void sctp_sock_migrate(struct sock *oldsk, struct sock *newsk, | |||
| 6455 | } | 6455 | } |
| 6456 | 6456 | ||
| 6457 | 6457 | ||
| 6458 | DEFINE_PROTO_INUSE(sctp) | ||
| 6459 | |||
| 6458 | /* This proto struct describes the ULP interface for SCTP. */ | 6460 | /* This proto struct describes the ULP interface for SCTP. */ |
| 6459 | struct proto sctp_prot = { | 6461 | struct proto sctp_prot = { |
| 6460 | .name = "SCTP", | 6462 | .name = "SCTP", |
| @@ -6483,9 +6485,12 @@ struct proto sctp_prot = { | |||
| 6483 | .memory_pressure = &sctp_memory_pressure, | 6485 | .memory_pressure = &sctp_memory_pressure, |
| 6484 | .enter_memory_pressure = sctp_enter_memory_pressure, | 6486 | .enter_memory_pressure = sctp_enter_memory_pressure, |
| 6485 | .memory_allocated = &sctp_memory_allocated, | 6487 | .memory_allocated = &sctp_memory_allocated, |
| 6488 | REF_PROTO_INUSE(sctp) | ||
| 6486 | }; | 6489 | }; |
| 6487 | 6490 | ||
| 6488 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | 6491 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) |
| 6492 | DEFINE_PROTO_INUSE(sctpv6) | ||
| 6493 | |||
| 6489 | struct proto sctpv6_prot = { | 6494 | struct proto sctpv6_prot = { |
| 6490 | .name = "SCTPv6", | 6495 | .name = "SCTPv6", |
| 6491 | .owner = THIS_MODULE, | 6496 | .owner = THIS_MODULE, |
| @@ -6513,5 +6518,6 @@ struct proto sctpv6_prot = { | |||
| 6513 | .memory_pressure = &sctp_memory_pressure, | 6518 | .memory_pressure = &sctp_memory_pressure, |
| 6514 | .enter_memory_pressure = sctp_enter_memory_pressure, | 6519 | .enter_memory_pressure = sctp_enter_memory_pressure, |
| 6515 | .memory_allocated = &sctp_memory_allocated, | 6520 | .memory_allocated = &sctp_memory_allocated, |
| 6521 | REF_PROTO_INUSE(sctpv6) | ||
| 6516 | }; | 6522 | }; |
| 6517 | #endif /* defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) */ | 6523 | #endif /* defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) */ |
