aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2011-03-16 19:29:25 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2011-03-16 19:29:25 -0400
commit7a6362800cb7d1d618a697a650c7aaed3eb39320 (patch)
tree087f9bc6c13ef1fad4b392c5cf9325cd28fa8523 /include
parent6445ced8670f37cfc2c5e24a9de9b413dbfc788d (diff)
parentceda86a108671294052cbf51660097b6534672f5 (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6: (1480 commits) bonding: enable netpoll without checking link status xfrm: Refcount destination entry on xfrm_lookup net: introduce rx_handler results and logic around that bonding: get rid of IFF_SLAVE_INACTIVE netdev->priv_flag bonding: wrap slave state work net: get rid of multiple bond-related netdevice->priv_flags bonding: register slave pointer for rx_handler be2net: Bump up the version number be2net: Copyright notice change. Update to Emulex instead of ServerEngines e1000e: fix kconfig for crc32 dependency netfilter ebtables: fix xt_AUDIT to work with ebtables xen network backend driver bonding: Improve syslog message at device creation time bonding: Call netif_carrier_off after register_netdevice bonding: Incorrect TX queue offset net_sched: fix ip_tos2prio xfrm: fix __xfrm_route_forward() be2net: Fix UDP packet detected status in RX compl Phonet: fix aligned-mode pipe socket buffer header reserve netxen: support for GbE port settings ... Fix up conflicts in drivers/staging/brcm80211/brcmsmac/wl_mac80211.c with the staging updates.
Diffstat (limited to 'include')
-rw-r--r--include/linux/audit.h2
-rw-r--r--include/linux/cpu_rmap.h73
-rw-r--r--include/linux/dcbnl.h113
-rw-r--r--include/linux/dccp.h2
-rw-r--r--include/linux/ethtool.h91
-rw-r--r--include/linux/icmpv6.h4
-rw-r--r--include/linux/ieee80211.h3
-rw-r--r--include/linux/if.h9
-rw-r--r--include/linux/if_link.h1
-rw-r--r--include/linux/igmp.h2
-rw-r--r--include/linux/inetdevice.h1
-rw-r--r--include/linux/ip_vs.h8
-rw-r--r--include/linux/micrel_phy.h16
-rw-r--r--include/linux/net.h3
-rw-r--r--include/linux/netdevice.h305
-rw-r--r--include/linux/netfilter.h27
-rw-r--r--include/linux/netfilter/Kbuild7
-rw-r--r--include/linux/netfilter/ipset/Kbuild4
-rw-r--r--include/linux/netfilter/ipset/ip_set.h452
-rw-r--r--include/linux/netfilter/ipset/ip_set_ahash.h1074
-rw-r--r--include/linux/netfilter/ipset/ip_set_bitmap.h31
-rw-r--r--include/linux/netfilter/ipset/ip_set_getport.h21
-rw-r--r--include/linux/netfilter/ipset/ip_set_hash.h26
-rw-r--r--include/linux/netfilter/ipset/ip_set_list.h27
-rw-r--r--include/linux/netfilter/ipset/ip_set_timeout.h127
-rw-r--r--include/linux/netfilter/ipset/pfxlen.h35
-rw-r--r--include/linux/netfilter/nf_conntrack_snmp.h9
-rw-r--r--include/linux/netfilter/nfnetlink.h3
-rw-r--r--include/linux/netfilter/nfnetlink_conntrack.h9
-rw-r--r--include/linux/netfilter/x_tables.h3
-rw-r--r--include/linux/netfilter/xt_AUDIT.h30
-rw-r--r--include/linux/netfilter/xt_CT.h12
-rw-r--r--include/linux/netfilter/xt_NFQUEUE.h6
-rw-r--r--include/linux/netfilter/xt_TCPOPTSTRIP.h4
-rw-r--r--include/linux/netfilter/xt_TPROXY.h10
-rw-r--r--include/linux/netfilter/xt_addrtype.h44
-rw-r--r--include/linux/netfilter/xt_cluster.h10
-rw-r--r--include/linux/netfilter/xt_comment.h2
-rw-r--r--include/linux/netfilter/xt_connlimit.h16
-rw-r--r--include/linux/netfilter/xt_conntrack.h15
-rw-r--r--include/linux/netfilter/xt_devgroup.h21
-rw-r--r--include/linux/netfilter/xt_quota.h8
-rw-r--r--include/linux/netfilter/xt_set.h56
-rw-r--r--include/linux/netfilter/xt_socket.h2
-rw-r--r--include/linux/netfilter/xt_time.h16
-rw-r--r--include/linux/netfilter/xt_u32.h18
-rw-r--r--include/linux/netfilter_bridge/ebt_802_3.h26
-rw-r--r--include/linux/netfilter_bridge/ebt_among.h4
-rw-r--r--include/linux/netfilter_bridge/ebt_arp.h6
-rw-r--r--include/linux/netfilter_bridge/ebt_ip.h14
-rw-r--r--include/linux/netfilter_bridge/ebt_ip6.h25
-rw-r--r--include/linux/netfilter_bridge/ebt_limit.h10
-rw-r--r--include/linux/netfilter_bridge/ebt_log.h8
-rw-r--r--include/linux/netfilter_bridge/ebt_mark_m.h6
-rw-r--r--include/linux/netfilter_bridge/ebt_nflog.h12
-rw-r--r--include/linux/netfilter_bridge/ebt_pkttype.h6
-rw-r--r--include/linux/netfilter_bridge/ebt_stp.h26
-rw-r--r--include/linux/netfilter_bridge/ebt_ulog.h4
-rw-r--r--include/linux/netfilter_bridge/ebt_vlan.h10
-rw-r--r--include/linux/netfilter_ipv4/ipt_CLUSTERIP.h16
-rw-r--r--include/linux/netfilter_ipv4/ipt_ECN.h8
-rw-r--r--include/linux/netfilter_ipv4/ipt_SAME.h8
-rw-r--r--include/linux/netfilter_ipv4/ipt_TTL.h6
-rw-r--r--include/linux/netfilter_ipv4/ipt_addrtype.h16
-rw-r--r--include/linux/netfilter_ipv4/ipt_ah.h6
-rw-r--r--include/linux/netfilter_ipv4/ipt_ecn.h10
-rw-r--r--include/linux/netfilter_ipv4/ipt_ttl.h6
-rw-r--r--include/linux/netfilter_ipv6/ip6t_HL.h6
-rw-r--r--include/linux/netfilter_ipv6/ip6t_REJECT.h4
-rw-r--r--include/linux/netfilter_ipv6/ip6t_ah.h10
-rw-r--r--include/linux/netfilter_ipv6/ip6t_frag.h10
-rw-r--r--include/linux/netfilter_ipv6/ip6t_hl.h6
-rw-r--r--include/linux/netfilter_ipv6/ip6t_ipv6header.h8
-rw-r--r--include/linux/netfilter_ipv6/ip6t_mh.h6
-rw-r--r--include/linux/netfilter_ipv6/ip6t_opts.h12
-rw-r--r--include/linux/netfilter_ipv6/ip6t_rt.h13
-rw-r--r--include/linux/netlink.h4
-rw-r--r--include/linux/nl80211.h3
-rw-r--r--include/linux/pci.h1
-rw-r--r--include/linux/phonet.h4
-rw-r--r--include/linux/pkt_sched.h107
-rw-r--r--include/linux/security.h7
-rw-r--r--include/linux/skbuff.h16
-rw-r--r--include/linux/sockios.h4
-rw-r--r--include/linux/ssb/ssb_regs.h7
-rw-r--r--include/linux/tipc.h8
-rw-r--r--include/linux/tipc_config.h38
-rw-r--r--include/linux/xfrm.h13
-rw-r--r--include/net/bluetooth/bluetooth.h33
-rw-r--r--include/net/bluetooth/hci.h139
-rw-r--r--include/net/bluetooth/hci_core.h173
-rw-r--r--include/net/bluetooth/l2cap.h53
-rw-r--r--include/net/bluetooth/mgmt.h171
-rw-r--r--include/net/bluetooth/smp.h76
-rw-r--r--include/net/cfg80211.h16
-rw-r--r--include/net/dcbnl.h9
-rw-r--r--include/net/dn.h6
-rw-r--r--include/net/dn_fib.h8
-rw-r--r--include/net/dn_route.h8
-rw-r--r--include/net/dst.h142
-rw-r--r--include/net/dst_ops.h1
-rw-r--r--include/net/flow.h204
-rw-r--r--include/net/icmp.h3
-rw-r--r--include/net/ieee80211_radiotap.h25
-rw-r--r--include/net/inet_sock.h31
-rw-r--r--include/net/inetpeer.h44
-rw-r--r--include/net/ip.h16
-rw-r--r--include/net/ip6_fib.h5
-rw-r--r--include/net/ip6_route.h2
-rw-r--r--include/net/ip_fib.h43
-rw-r--r--include/net/ip_vs.h477
-rw-r--r--include/net/ipv6.h28
-rw-r--r--include/net/mac80211.h106
-rw-r--r--include/net/net_namespace.h2
-rw-r--r--include/net/netevent.h1
-rw-r--r--include/net/netfilter/nf_conntrack.h23
-rw-r--r--include/net/netfilter/nf_conntrack_ecache.h12
-rw-r--r--include/net/netfilter/nf_conntrack_extend.h10
-rw-r--r--include/net/netfilter/nf_conntrack_helper.h6
-rw-r--r--include/net/netfilter/nf_conntrack_l3proto.h2
-rw-r--r--include/net/netfilter/nf_conntrack_timestamp.h65
-rw-r--r--include/net/netfilter/nf_nat.h6
-rw-r--r--include/net/netfilter/nf_nat_core.h4
-rw-r--r--include/net/netlink.h9
-rw-r--r--include/net/netns/conntrack.h4
-rw-r--r--include/net/netns/ipv4.h1
-rw-r--r--include/net/phonet/pep.h23
-rw-r--r--include/net/phonet/phonet.h1
-rw-r--r--include/net/protocol.h4
-rw-r--r--include/net/route.h164
-rw-r--r--include/net/sch_generic.h60
-rw-r--r--include/net/sock.h9
-rw-r--r--include/net/tcp.h16
-rw-r--r--include/net/transp_v6.h4
-rw-r--r--include/net/udp.h13
-rw-r--r--include/net/udplite.h12
-rw-r--r--include/net/xfrm.h213
-rw-r--r--include/xen/events.h6
-rw-r--r--include/xen/interface/io/netif.h80
139 files changed, 5016 insertions, 831 deletions
diff --git a/include/linux/audit.h b/include/linux/audit.h
index 359df0487690..9d339eb27881 100644
--- a/include/linux/audit.h
+++ b/include/linux/audit.h
@@ -103,6 +103,8 @@
103#define AUDIT_BPRM_FCAPS 1321 /* Information about fcaps increasing perms */ 103#define AUDIT_BPRM_FCAPS 1321 /* Information about fcaps increasing perms */
104#define AUDIT_CAPSET 1322 /* Record showing argument to sys_capset */ 104#define AUDIT_CAPSET 1322 /* Record showing argument to sys_capset */
105#define AUDIT_MMAP 1323 /* Record showing descriptor and flags in mmap */ 105#define AUDIT_MMAP 1323 /* Record showing descriptor and flags in mmap */
106#define AUDIT_NETFILTER_PKT 1324 /* Packets traversing netfilter chains */
107#define AUDIT_NETFILTER_CFG 1325 /* Netfilter chain modifications */
106 108
107#define AUDIT_AVC 1400 /* SE Linux avc denial or grant */ 109#define AUDIT_AVC 1400 /* SE Linux avc denial or grant */
108#define AUDIT_SELINUX_ERR 1401 /* Internal SE Linux Errors */ 110#define AUDIT_SELINUX_ERR 1401 /* Internal SE Linux Errors */
diff --git a/include/linux/cpu_rmap.h b/include/linux/cpu_rmap.h
new file mode 100644
index 000000000000..473771a528c0
--- /dev/null
+++ b/include/linux/cpu_rmap.h
@@ -0,0 +1,73 @@
1/*
2 * cpu_rmap.c: CPU affinity reverse-map support
3 * Copyright 2011 Solarflare Communications Inc.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 as published
7 * by the Free Software Foundation, incorporated herein by reference.
8 */
9
10#include <linux/cpumask.h>
11#include <linux/gfp.h>
12#include <linux/slab.h>
13
14/**
15 * struct cpu_rmap - CPU affinity reverse-map
16 * @size: Number of objects to be reverse-mapped
17 * @used: Number of objects added
18 * @obj: Pointer to array of object pointers
19 * @near: For each CPU, the index and distance to the nearest object,
20 * based on affinity masks
21 */
22struct cpu_rmap {
23 u16 size, used;
24 void **obj;
25 struct {
26 u16 index;
27 u16 dist;
28 } near[0];
29};
30#define CPU_RMAP_DIST_INF 0xffff
31
32extern struct cpu_rmap *alloc_cpu_rmap(unsigned int size, gfp_t flags);
33
34/**
35 * free_cpu_rmap - free CPU affinity reverse-map
36 * @rmap: Reverse-map allocated with alloc_cpu_rmap(), or %NULL
37 */
38static inline void free_cpu_rmap(struct cpu_rmap *rmap)
39{
40 kfree(rmap);
41}
42
43extern int cpu_rmap_add(struct cpu_rmap *rmap, void *obj);
44extern int cpu_rmap_update(struct cpu_rmap *rmap, u16 index,
45 const struct cpumask *affinity);
46
47static inline u16 cpu_rmap_lookup_index(struct cpu_rmap *rmap, unsigned int cpu)
48{
49 return rmap->near[cpu].index;
50}
51
52static inline void *cpu_rmap_lookup_obj(struct cpu_rmap *rmap, unsigned int cpu)
53{
54 return rmap->obj[rmap->near[cpu].index];
55}
56
57#ifdef CONFIG_GENERIC_HARDIRQS
58
59/**
60 * alloc_irq_cpu_rmap - allocate CPU affinity reverse-map for IRQs
61 * @size: Number of objects to be mapped
62 *
63 * Must be called in process context.
64 */
65static inline struct cpu_rmap *alloc_irq_cpu_rmap(unsigned int size)
66{
67 return alloc_cpu_rmap(size, GFP_KERNEL);
68}
69extern void free_irq_cpu_rmap(struct cpu_rmap *rmap);
70
71extern int irq_cpu_rmap_add(struct cpu_rmap *rmap, int irq);
72
73#endif
diff --git a/include/linux/dcbnl.h b/include/linux/dcbnl.h
index 66900e3c6eb1..c52280047e2c 100644
--- a/include/linux/dcbnl.h
+++ b/include/linux/dcbnl.h
@@ -1,5 +1,5 @@
1/* 1/*
2 * Copyright (c) 2008, Intel Corporation. 2 * Copyright (c) 2008-2011, Intel Corporation.
3 * 3 *
4 * This program is free software; you can redistribute it and/or modify it 4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms and conditions of the GNU General Public License, 5 * under the terms and conditions of the GNU General Public License,
@@ -25,9 +25,14 @@
25/* IEEE 802.1Qaz std supported values */ 25/* IEEE 802.1Qaz std supported values */
26#define IEEE_8021QAZ_MAX_TCS 8 26#define IEEE_8021QAZ_MAX_TCS 8
27 27
28#define IEEE_8021QAZ_TSA_STRICT 0
29#define IEEE_8021QAZ_TSA_CB_SHAPER 1
30#define IEEE_8021QAZ_TSA_ETS 2
31#define IEEE_8021QAZ_TSA_VENDOR 255
32
28/* This structure contains the IEEE 802.1Qaz ETS managed object 33/* This structure contains the IEEE 802.1Qaz ETS managed object
29 * 34 *
30 * @willing: willing bit in ETS configuratin TLV 35 * @willing: willing bit in ETS configuration TLV
31 * @ets_cap: indicates supported capacity of ets feature 36 * @ets_cap: indicates supported capacity of ets feature
32 * @cbs: credit based shaper ets algorithm supported 37 * @cbs: credit based shaper ets algorithm supported
33 * @tc_tx_bw: tc tx bandwidth indexed by traffic class 38 * @tc_tx_bw: tc tx bandwidth indexed by traffic class
@@ -82,6 +87,50 @@ struct ieee_pfc {
82 __u64 indications[IEEE_8021QAZ_MAX_TCS]; 87 __u64 indications[IEEE_8021QAZ_MAX_TCS];
83}; 88};
84 89
90/* CEE DCBX std supported values */
91#define CEE_DCBX_MAX_PGS 8
92#define CEE_DCBX_MAX_PRIO 8
93
94/**
95 * struct cee_pg - CEE Priority-Group managed object
96 *
97 * @willing: willing bit in the PG tlv
98 * @error: error bit in the PG tlv
99 * @pg_en: enable bit of the PG feature
100 * @tcs_supported: number of traffic classes supported
101 * @pg_bw: bandwidth percentage for each priority group
102 * @prio_pg: priority to PG mapping indexed by priority
103 */
104struct cee_pg {
105 __u8 willing;
106 __u8 error;
107 __u8 pg_en;
108 __u8 tcs_supported;
109 __u8 pg_bw[CEE_DCBX_MAX_PGS];
110 __u8 prio_pg[CEE_DCBX_MAX_PGS];
111};
112
113/**
114 * struct cee_pfc - CEE PFC managed object
115 *
116 * @willing: willing bit in the PFC tlv
117 * @error: error bit in the PFC tlv
118 * @pfc_en: bitmap indicating pfc enabled traffic classes
119 * @tcs_supported: number of traffic classes supported
120 */
121struct cee_pfc {
122 __u8 willing;
123 __u8 error;
124 __u8 pfc_en;
125 __u8 tcs_supported;
126};
127
128/* IEEE 802.1Qaz std supported values */
129#define IEEE_8021QAZ_APP_SEL_ETHERTYPE 1
130#define IEEE_8021QAZ_APP_SEL_STREAM 2
131#define IEEE_8021QAZ_APP_SEL_DGRAM 3
132#define IEEE_8021QAZ_APP_SEL_ANY 4
133
85/* This structure contains the IEEE 802.1Qaz APP managed object. This 134/* This structure contains the IEEE 802.1Qaz APP managed object. This
86 * object is also used for the CEE std as well. There is no difference 135 * object is also used for the CEE std as well. There is no difference
87 * between the objects. 136 * between the objects.
@@ -105,6 +154,20 @@ struct dcb_app {
105 __u16 protocol; 154 __u16 protocol;
106}; 155};
107 156
157/**
158 * struct dcb_peer_app_info - APP feature information sent by the peer
159 *
160 * @willing: willing bit in the peer APP tlv
161 * @error: error bit in the peer APP tlv
162 *
163 * In addition to this information the full peer APP tlv also contains
164 * a table of 'app_count' APP objects defined above.
165 */
166struct dcb_peer_app_info {
167 __u8 willing;
168 __u8 error;
169};
170
108struct dcbmsg { 171struct dcbmsg {
109 __u8 dcb_family; 172 __u8 dcb_family;
110 __u8 cmd; 173 __u8 cmd;
@@ -139,6 +202,7 @@ struct dcbmsg {
139 * @DCB_CMD_SDCBX: set DCBX engine configuration 202 * @DCB_CMD_SDCBX: set DCBX engine configuration
140 * @DCB_CMD_GFEATCFG: get DCBX features flags 203 * @DCB_CMD_GFEATCFG: get DCBX features flags
141 * @DCB_CMD_SFEATCFG: set DCBX features negotiation flags 204 * @DCB_CMD_SFEATCFG: set DCBX features negotiation flags
205 * @DCB_CMD_CEE_GET: get CEE aggregated configuration
142 */ 206 */
143enum dcbnl_commands { 207enum dcbnl_commands {
144 DCB_CMD_UNDEFINED, 208 DCB_CMD_UNDEFINED,
@@ -181,6 +245,8 @@ enum dcbnl_commands {
181 DCB_CMD_GFEATCFG, 245 DCB_CMD_GFEATCFG,
182 DCB_CMD_SFEATCFG, 246 DCB_CMD_SFEATCFG,
183 247
248 DCB_CMD_CEE_GET,
249
184 __DCB_CMD_ENUM_MAX, 250 __DCB_CMD_ENUM_MAX,
185 DCB_CMD_MAX = __DCB_CMD_ENUM_MAX - 1, 251 DCB_CMD_MAX = __DCB_CMD_ENUM_MAX - 1,
186}; 252};
@@ -203,6 +269,7 @@ enum dcbnl_commands {
203 * @DCB_ATTR_IEEE: IEEE 802.1Qaz supported attributes (NLA_NESTED) 269 * @DCB_ATTR_IEEE: IEEE 802.1Qaz supported attributes (NLA_NESTED)
204 * @DCB_ATTR_DCBX: DCBX engine configuration in the device (NLA_U8) 270 * @DCB_ATTR_DCBX: DCBX engine configuration in the device (NLA_U8)
205 * @DCB_ATTR_FEATCFG: DCBX features flags (NLA_NESTED) 271 * @DCB_ATTR_FEATCFG: DCBX features flags (NLA_NESTED)
272 * @DCB_ATTR_CEE: CEE std supported attributes (NLA_NESTED)
206 */ 273 */
207enum dcbnl_attrs { 274enum dcbnl_attrs {
208 DCB_ATTR_UNDEFINED, 275 DCB_ATTR_UNDEFINED,
@@ -226,15 +293,32 @@ enum dcbnl_attrs {
226 DCB_ATTR_DCBX, 293 DCB_ATTR_DCBX,
227 DCB_ATTR_FEATCFG, 294 DCB_ATTR_FEATCFG,
228 295
296 /* CEE nested attributes */
297 DCB_ATTR_CEE,
298
229 __DCB_ATTR_ENUM_MAX, 299 __DCB_ATTR_ENUM_MAX,
230 DCB_ATTR_MAX = __DCB_ATTR_ENUM_MAX - 1, 300 DCB_ATTR_MAX = __DCB_ATTR_ENUM_MAX - 1,
231}; 301};
232 302
303/**
304 * enum ieee_attrs - IEEE 802.1Qaz get/set attributes
305 *
306 * @DCB_ATTR_IEEE_UNSPEC: unspecified
307 * @DCB_ATTR_IEEE_ETS: negotiated ETS configuration
308 * @DCB_ATTR_IEEE_PFC: negotiated PFC configuration
309 * @DCB_ATTR_IEEE_APP_TABLE: negotiated APP configuration
310 * @DCB_ATTR_IEEE_PEER_ETS: peer ETS configuration - get only
311 * @DCB_ATTR_IEEE_PEER_PFC: peer PFC configuration - get only
312 * @DCB_ATTR_IEEE_PEER_APP: peer APP tlv - get only
313 */
233enum ieee_attrs { 314enum ieee_attrs {
234 DCB_ATTR_IEEE_UNSPEC, 315 DCB_ATTR_IEEE_UNSPEC,
235 DCB_ATTR_IEEE_ETS, 316 DCB_ATTR_IEEE_ETS,
236 DCB_ATTR_IEEE_PFC, 317 DCB_ATTR_IEEE_PFC,
237 DCB_ATTR_IEEE_APP_TABLE, 318 DCB_ATTR_IEEE_APP_TABLE,
319 DCB_ATTR_IEEE_PEER_ETS,
320 DCB_ATTR_IEEE_PEER_PFC,
321 DCB_ATTR_IEEE_PEER_APP,
238 __DCB_ATTR_IEEE_MAX 322 __DCB_ATTR_IEEE_MAX
239}; 323};
240#define DCB_ATTR_IEEE_MAX (__DCB_ATTR_IEEE_MAX - 1) 324#define DCB_ATTR_IEEE_MAX (__DCB_ATTR_IEEE_MAX - 1)
@@ -247,6 +331,31 @@ enum ieee_attrs_app {
247#define DCB_ATTR_IEEE_APP_MAX (__DCB_ATTR_IEEE_APP_MAX - 1) 331#define DCB_ATTR_IEEE_APP_MAX (__DCB_ATTR_IEEE_APP_MAX - 1)
248 332
249/** 333/**
334 * enum cee_attrs - CEE DCBX get attributes
335 *
336 * @DCB_ATTR_CEE_UNSPEC: unspecified
337 * @DCB_ATTR_CEE_PEER_PG: peer PG configuration - get only
338 * @DCB_ATTR_CEE_PEER_PFC: peer PFC configuration - get only
339 * @DCB_ATTR_CEE_PEER_APP: peer APP tlv - get only
340 */
341enum cee_attrs {
342 DCB_ATTR_CEE_UNSPEC,
343 DCB_ATTR_CEE_PEER_PG,
344 DCB_ATTR_CEE_PEER_PFC,
345 DCB_ATTR_CEE_PEER_APP_TABLE,
346 __DCB_ATTR_CEE_MAX
347};
348#define DCB_ATTR_CEE_MAX (__DCB_ATTR_CEE_MAX - 1)
349
350enum peer_app_attr {
351 DCB_ATTR_CEE_PEER_APP_UNSPEC,
352 DCB_ATTR_CEE_PEER_APP_INFO,
353 DCB_ATTR_CEE_PEER_APP,
354 __DCB_ATTR_CEE_PEER_APP_MAX
355};
356#define DCB_ATTR_CEE_PEER_APP_MAX (__DCB_ATTR_CEE_PEER_APP_MAX - 1)
357
358/**
250 * enum dcbnl_pfc_attrs - DCB Priority Flow Control user priority nested attrs 359 * enum dcbnl_pfc_attrs - DCB Priority Flow Control user priority nested attrs
251 * 360 *
252 * @DCB_PFC_UP_ATTR_UNDEFINED: unspecified attribute to catch errors 361 * @DCB_PFC_UP_ATTR_UNDEFINED: unspecified attribute to catch errors
diff --git a/include/linux/dccp.h b/include/linux/dccp.h
index 010e2d87ed75..d638e85dc501 100644
--- a/include/linux/dccp.h
+++ b/include/linux/dccp.h
@@ -279,8 +279,6 @@ enum dccp_state {
279 DCCP_MAX_STATES 279 DCCP_MAX_STATES
280}; 280};
281 281
282#define DCCP_STATE_MASK 0x1f
283
284enum { 282enum {
285 DCCPF_OPEN = TCPF_ESTABLISHED, 283 DCCPF_OPEN = TCPF_ESTABLISHED,
286 DCCPF_REQUESTING = TCPF_SYN_SENT, 284 DCCPF_REQUESTING = TCPF_SYN_SENT,
diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h
index 1908929204a9..aac3e2eeb4fd 100644
--- a/include/linux/ethtool.h
+++ b/include/linux/ethtool.h
@@ -251,6 +251,7 @@ enum ethtool_stringset {
251 ETH_SS_STATS, 251 ETH_SS_STATS,
252 ETH_SS_PRIV_FLAGS, 252 ETH_SS_PRIV_FLAGS,
253 ETH_SS_NTUPLE_FILTERS, 253 ETH_SS_NTUPLE_FILTERS,
254 ETH_SS_FEATURES,
254}; 255};
255 256
256/* for passing string sets for data tagging */ 257/* for passing string sets for data tagging */
@@ -523,6 +524,92 @@ struct ethtool_flash {
523 char data[ETHTOOL_FLASH_MAX_FILENAME]; 524 char data[ETHTOOL_FLASH_MAX_FILENAME];
524}; 525};
525 526
527/* for returning and changing feature sets */
528
529/**
530 * struct ethtool_get_features_block - block with state of 32 features
531 * @available: mask of changeable features
532 * @requested: mask of features requested to be enabled if possible
533 * @active: mask of currently enabled features
534 * @never_changed: mask of features not changeable for any device
535 */
536struct ethtool_get_features_block {
537 __u32 available;
538 __u32 requested;
539 __u32 active;
540 __u32 never_changed;
541};
542
543/**
544 * struct ethtool_gfeatures - command to get state of device's features
545 * @cmd: command number = %ETHTOOL_GFEATURES
546 * @size: in: number of elements in the features[] array;
547 * out: number of elements in features[] needed to hold all features
548 * @features: state of features
549 */
550struct ethtool_gfeatures {
551 __u32 cmd;
552 __u32 size;
553 struct ethtool_get_features_block features[0];
554};
555
556/**
557 * struct ethtool_set_features_block - block with request for 32 features
558 * @valid: mask of features to be changed
559 * @requested: values of features to be changed
560 */
561struct ethtool_set_features_block {
562 __u32 valid;
563 __u32 requested;
564};
565
566/**
567 * struct ethtool_sfeatures - command to request change in device's features
568 * @cmd: command number = %ETHTOOL_SFEATURES
569 * @size: array size of the features[] array
570 * @features: feature change masks
571 */
572struct ethtool_sfeatures {
573 __u32 cmd;
574 __u32 size;
575 struct ethtool_set_features_block features[0];
576};
577
578/*
579 * %ETHTOOL_SFEATURES changes features present in features[].valid to the
580 * values of corresponding bits in features[].requested. Bits in .requested
581 * not set in .valid or not changeable are ignored.
582 *
583 * Returns %EINVAL when .valid contains undefined or never-changable bits
584 * or size is not equal to required number of features words (32-bit blocks).
585 * Returns >= 0 if request was completed; bits set in the value mean:
586 * %ETHTOOL_F_UNSUPPORTED - there were bits set in .valid that are not
587 * changeable (not present in %ETHTOOL_GFEATURES' features[].available)
588 * those bits were ignored.
589 * %ETHTOOL_F_WISH - some or all changes requested were recorded but the
590 * resulting state of bits masked by .valid is not equal to .requested.
591 * Probably there are other device-specific constraints on some features
592 * in the set. When %ETHTOOL_F_UNSUPPORTED is set, .valid is considered
593 * here as though ignored bits were cleared.
594 * %ETHTOOL_F_COMPAT - some or all changes requested were made by calling
595 * compatibility functions. Requested offload state cannot be properly
596 * managed by kernel.
597 *
598 * Meaning of bits in the masks are obtained by %ETHTOOL_GSSET_INFO (number of
599 * bits in the arrays - always multiple of 32) and %ETHTOOL_GSTRINGS commands
600 * for ETH_SS_FEATURES string set. First entry in the table corresponds to least
601 * significant bit in features[0] fields. Empty strings mark undefined features.
602 */
603enum ethtool_sfeatures_retval_bits {
604 ETHTOOL_F_UNSUPPORTED__BIT,
605 ETHTOOL_F_WISH__BIT,
606 ETHTOOL_F_COMPAT__BIT,
607};
608
609#define ETHTOOL_F_UNSUPPORTED (1 << ETHTOOL_F_UNSUPPORTED__BIT)
610#define ETHTOOL_F_WISH (1 << ETHTOOL_F_WISH__BIT)
611#define ETHTOOL_F_COMPAT (1 << ETHTOOL_F_COMPAT__BIT)
612
526#ifdef __KERNEL__ 613#ifdef __KERNEL__
527 614
528#include <linux/rculist.h> 615#include <linux/rculist.h>
@@ -543,7 +630,6 @@ struct net_device;
543 630
544/* Some generic methods drivers may use in their ethtool_ops */ 631/* Some generic methods drivers may use in their ethtool_ops */
545u32 ethtool_op_get_link(struct net_device *dev); 632u32 ethtool_op_get_link(struct net_device *dev);
546u32 ethtool_op_get_rx_csum(struct net_device *dev);
547u32 ethtool_op_get_tx_csum(struct net_device *dev); 633u32 ethtool_op_get_tx_csum(struct net_device *dev);
548int ethtool_op_set_tx_csum(struct net_device *dev, u32 data); 634int ethtool_op_set_tx_csum(struct net_device *dev, u32 data);
549int ethtool_op_set_tx_hw_csum(struct net_device *dev, u32 data); 635int ethtool_op_set_tx_hw_csum(struct net_device *dev, u32 data);
@@ -744,6 +830,9 @@ struct ethtool_ops {
744#define ETHTOOL_GRXFHINDIR 0x00000038 /* Get RX flow hash indir'n table */ 830#define ETHTOOL_GRXFHINDIR 0x00000038 /* Get RX flow hash indir'n table */
745#define ETHTOOL_SRXFHINDIR 0x00000039 /* Set RX flow hash indir'n table */ 831#define ETHTOOL_SRXFHINDIR 0x00000039 /* Set RX flow hash indir'n table */
746 832
833#define ETHTOOL_GFEATURES 0x0000003a /* Get device offload settings */
834#define ETHTOOL_SFEATURES 0x0000003b /* Change device offload settings */
835
747/* compatibility with older code */ 836/* compatibility with older code */
748#define SPARC_ETH_GSET ETHTOOL_GSET 837#define SPARC_ETH_GSET ETHTOOL_GSET
749#define SPARC_ETH_SSET ETHTOOL_SSET 838#define SPARC_ETH_SSET ETHTOOL_SSET
diff --git a/include/linux/icmpv6.h b/include/linux/icmpv6.h
index 4c4c74ec5987..ba45e6bc0764 100644
--- a/include/linux/icmpv6.h
+++ b/include/linux/icmpv6.h
@@ -183,10 +183,10 @@ extern void icmpv6_cleanup(void);
183extern void icmpv6_param_prob(struct sk_buff *skb, 183extern void icmpv6_param_prob(struct sk_buff *skb,
184 u8 code, int pos); 184 u8 code, int pos);
185 185
186struct flowi; 186struct flowi6;
187struct in6_addr; 187struct in6_addr;
188extern void icmpv6_flow_init(struct sock *sk, 188extern void icmpv6_flow_init(struct sock *sk,
189 struct flowi *fl, 189 struct flowi6 *fl6,
190 u8 type, 190 u8 type,
191 const struct in6_addr *saddr, 191 const struct in6_addr *saddr,
192 const struct in6_addr *daddr, 192 const struct in6_addr *daddr,
diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h
index 294169e31364..2d1c6117d92c 100644
--- a/include/linux/ieee80211.h
+++ b/include/linux/ieee80211.h
@@ -1325,6 +1325,9 @@ enum {
1325/* Although the spec says 8 I'm seeing 6 in practice */ 1325/* Although the spec says 8 I'm seeing 6 in practice */
1326#define IEEE80211_COUNTRY_IE_MIN_LEN 6 1326#define IEEE80211_COUNTRY_IE_MIN_LEN 6
1327 1327
1328/* The Country String field of the element shall be 3 octets in length */
1329#define IEEE80211_COUNTRY_STRING_LEN 3
1330
1328/* 1331/*
1329 * For regulatory extension stuff see IEEE 802.11-2007 1332 * For regulatory extension stuff see IEEE 802.11-2007
1330 * Annex I (page 1141) and Annex J (page 1147). Also 1333 * Annex I (page 1141) and Annex J (page 1147). Also
diff --git a/include/linux/if.h b/include/linux/if.h
index 123959927745..3bc63e6a02f7 100644
--- a/include/linux/if.h
+++ b/include/linux/if.h
@@ -71,11 +71,10 @@
71 * release skb->dst 71 * release skb->dst
72 */ 72 */
73#define IFF_DONT_BRIDGE 0x800 /* disallow bridging this ether dev */ 73#define IFF_DONT_BRIDGE 0x800 /* disallow bridging this ether dev */
74#define IFF_IN_NETPOLL 0x1000 /* whether we are processing netpoll */ 74#define IFF_DISABLE_NETPOLL 0x1000 /* disable netpoll at run-time */
75#define IFF_DISABLE_NETPOLL 0x2000 /* disable netpoll at run-time */ 75#define IFF_MACVLAN_PORT 0x2000 /* device used as macvlan port */
76#define IFF_MACVLAN_PORT 0x4000 /* device used as macvlan port */ 76#define IFF_BRIDGE_PORT 0x4000 /* device used as bridge port */
77#define IFF_BRIDGE_PORT 0x8000 /* device used as bridge port */ 77#define IFF_OVS_DATAPATH 0x8000 /* device used as Open vSwitch
78#define IFF_OVS_DATAPATH 0x10000 /* device used as Open vSwitch
79 * datapath port */ 78 * datapath port */
80 79
81#define IF_GET_IFACE 0x0001 /* for querying only */ 80#define IF_GET_IFACE 0x0001 /* for querying only */
diff --git a/include/linux/if_link.h b/include/linux/if_link.h
index 6485d2a89bec..f4a2e6b1b864 100644
--- a/include/linux/if_link.h
+++ b/include/linux/if_link.h
@@ -135,6 +135,7 @@ enum {
135 IFLA_VF_PORTS, 135 IFLA_VF_PORTS,
136 IFLA_PORT_SELF, 136 IFLA_PORT_SELF,
137 IFLA_AF_SPEC, 137 IFLA_AF_SPEC,
138 IFLA_GROUP, /* Group the device belongs to */
138 __IFLA_MAX 139 __IFLA_MAX
139}; 140};
140 141
diff --git a/include/linux/igmp.h b/include/linux/igmp.h
index 74cfcff0148b..82de336b8155 100644
--- a/include/linux/igmp.h
+++ b/include/linux/igmp.h
@@ -217,7 +217,7 @@ struct ip_mc_list {
217#define IGMPV3_QQIC(value) IGMPV3_EXP(0x80, 4, 3, value) 217#define IGMPV3_QQIC(value) IGMPV3_EXP(0x80, 4, 3, value)
218#define IGMPV3_MRC(value) IGMPV3_EXP(0x80, 4, 3, value) 218#define IGMPV3_MRC(value) IGMPV3_EXP(0x80, 4, 3, value)
219 219
220extern int ip_check_mc(struct in_device *dev, __be32 mc_addr, __be32 src_addr, u16 proto); 220extern int ip_check_mc_rcu(struct in_device *dev, __be32 mc_addr, __be32 src_addr, u16 proto);
221extern int igmp_rcv(struct sk_buff *); 221extern int igmp_rcv(struct sk_buff *);
222extern int ip_mc_join_group(struct sock *sk, struct ip_mreqn *imr); 222extern int ip_mc_join_group(struct sock *sk, struct ip_mreqn *imr);
223extern int ip_mc_leave_group(struct sock *sk, struct ip_mreqn *imr); 223extern int ip_mc_leave_group(struct sock *sk, struct ip_mreqn *imr);
diff --git a/include/linux/inetdevice.h b/include/linux/inetdevice.h
index ae8fdc54e0c0..5f8146695b7f 100644
--- a/include/linux/inetdevice.h
+++ b/include/linux/inetdevice.h
@@ -144,6 +144,7 @@ static inline void ipv4_devconf_setall(struct in_device *in_dev)
144#define IN_DEV_ARP_NOTIFY(in_dev) IN_DEV_MAXCONF((in_dev), ARP_NOTIFY) 144#define IN_DEV_ARP_NOTIFY(in_dev) IN_DEV_MAXCONF((in_dev), ARP_NOTIFY)
145 145
146struct in_ifaddr { 146struct in_ifaddr {
147 struct hlist_node hash;
147 struct in_ifaddr *ifa_next; 148 struct in_ifaddr *ifa_next;
148 struct in_device *ifa_dev; 149 struct in_device *ifa_dev;
149 struct rcu_head rcu_head; 150 struct rcu_head rcu_head;
diff --git a/include/linux/ip_vs.h b/include/linux/ip_vs.h
index 5f43a3b2e3ad..4deb3834d62c 100644
--- a/include/linux/ip_vs.h
+++ b/include/linux/ip_vs.h
@@ -89,6 +89,14 @@
89#define IP_VS_CONN_F_TEMPLATE 0x1000 /* template, not connection */ 89#define IP_VS_CONN_F_TEMPLATE 0x1000 /* template, not connection */
90#define IP_VS_CONN_F_ONE_PACKET 0x2000 /* forward only one packet */ 90#define IP_VS_CONN_F_ONE_PACKET 0x2000 /* forward only one packet */
91 91
92#define IP_VS_CONN_F_BACKUP_MASK (IP_VS_CONN_F_FWD_MASK | \
93 IP_VS_CONN_F_NOOUTPUT | \
94 IP_VS_CONN_F_INACTIVE | \
95 IP_VS_CONN_F_SEQ_MASK | \
96 IP_VS_CONN_F_NO_CPORT | \
97 IP_VS_CONN_F_TEMPLATE \
98 )
99
92/* Flags that are not sent to backup server start from bit 16 */ 100/* Flags that are not sent to backup server start from bit 16 */
93#define IP_VS_CONN_F_NFCT (1 << 16) /* use netfilter conntrack */ 101#define IP_VS_CONN_F_NFCT (1 << 16) /* use netfilter conntrack */
94 102
diff --git a/include/linux/micrel_phy.h b/include/linux/micrel_phy.h
new file mode 100644
index 000000000000..dd8da342a991
--- /dev/null
+++ b/include/linux/micrel_phy.h
@@ -0,0 +1,16 @@
1#ifndef _MICREL_PHY_H
2#define _MICREL_PHY_H
3
4#define MICREL_PHY_ID_MASK 0x00fffff0
5
6#define PHY_ID_KSZ9021 0x00221611
7#define PHY_ID_KS8737 0x00221720
8#define PHY_ID_KS8041 0x00221510
9#define PHY_ID_KS8051 0x00221550
10/* both for ks8001 Rev. A/B, and for ks8721 Rev 3. */
11#define PHY_ID_KS8001 0x0022161A
12
13/* struct phy_device dev_flags definitions */
14#define MICREL_PHY_50MHZ_CLK 0x00000001
15
16#endif /* _MICREL_PHY_H */
diff --git a/include/linux/net.h b/include/linux/net.h
index 16faa130088c..94de83c0f877 100644
--- a/include/linux/net.h
+++ b/include/linux/net.h
@@ -118,6 +118,7 @@ enum sock_shutdown_cmd {
118}; 118};
119 119
120struct socket_wq { 120struct socket_wq {
121 /* Note: wait MUST be first field of socket_wq */
121 wait_queue_head_t wait; 122 wait_queue_head_t wait;
122 struct fasync_struct *fasync_list; 123 struct fasync_struct *fasync_list;
123 struct rcu_head rcu; 124 struct rcu_head rcu;
@@ -142,7 +143,7 @@ struct socket {
142 143
143 unsigned long flags; 144 unsigned long flags;
144 145
145 struct socket_wq *wq; 146 struct socket_wq __rcu *wq;
146 147
147 struct file *file; 148 struct file *file;
148 struct sock *sk; 149 struct sock *sk;
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 71caf7a5e6c6..5eeb2cd3631c 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -138,6 +138,9 @@ static inline bool dev_xmit_complete(int rc)
138 138
139#define MAX_ADDR_LEN 32 /* Largest hardware address length */ 139#define MAX_ADDR_LEN 32 /* Largest hardware address length */
140 140
141/* Initial net device group. All devices belong to group 0 by default. */
142#define INIT_NETDEV_GROUP 0
143
141#ifdef __KERNEL__ 144#ifdef __KERNEL__
142/* 145/*
143 * Compute the worst case header length according to the protocols 146 * Compute the worst case header length according to the protocols
@@ -387,7 +390,55 @@ enum gro_result {
387}; 390};
388typedef enum gro_result gro_result_t; 391typedef enum gro_result gro_result_t;
389 392
390typedef struct sk_buff *rx_handler_func_t(struct sk_buff *skb); 393/*
394 * enum rx_handler_result - Possible return values for rx_handlers.
395 * @RX_HANDLER_CONSUMED: skb was consumed by rx_handler, do not process it
396 * further.
397 * @RX_HANDLER_ANOTHER: Do another round in receive path. This is indicated in
398 * case skb->dev was changed by rx_handler.
399 * @RX_HANDLER_EXACT: Force exact delivery, no wildcard.
400 * @RX_HANDLER_PASS: Do nothing, passe the skb as if no rx_handler was called.
401 *
402 * rx_handlers are functions called from inside __netif_receive_skb(), to do
403 * special processing of the skb, prior to delivery to protocol handlers.
404 *
405 * Currently, a net_device can only have a single rx_handler registered. Trying
406 * to register a second rx_handler will return -EBUSY.
407 *
408 * To register a rx_handler on a net_device, use netdev_rx_handler_register().
409 * To unregister a rx_handler on a net_device, use
410 * netdev_rx_handler_unregister().
411 *
412 * Upon return, rx_handler is expected to tell __netif_receive_skb() what to
413 * do with the skb.
414 *
415 * If the rx_handler consumed to skb in some way, it should return
416 * RX_HANDLER_CONSUMED. This is appropriate when the rx_handler arranged for
417 * the skb to be delivered in some other ways.
418 *
419 * If the rx_handler changed skb->dev, to divert the skb to another
420 * net_device, it should return RX_HANDLER_ANOTHER. The rx_handler for the
421 * new device will be called if it exists.
422 *
423 * If the rx_handler consider the skb should be ignored, it should return
424 * RX_HANDLER_EXACT. The skb will only be delivered to protocol handlers that
425 * are registred on exact device (ptype->dev == skb->dev).
426 *
427 * If the rx_handler didn't changed skb->dev, but want the skb to be normally
428 * delivered, it should return RX_HANDLER_PASS.
429 *
430 * A device without a registered rx_handler will behave as if rx_handler
431 * returned RX_HANDLER_PASS.
432 */
433
434enum rx_handler_result {
435 RX_HANDLER_CONSUMED,
436 RX_HANDLER_ANOTHER,
437 RX_HANDLER_EXACT,
438 RX_HANDLER_PASS,
439};
440typedef enum rx_handler_result rx_handler_result_t;
441typedef rx_handler_result_t rx_handler_func_t(struct sk_buff **pskb);
391 442
392extern void __napi_schedule(struct napi_struct *n); 443extern void __napi_schedule(struct napi_struct *n);
393 444
@@ -551,14 +602,16 @@ struct rps_map {
551#define RPS_MAP_SIZE(_num) (sizeof(struct rps_map) + (_num * sizeof(u16))) 602#define RPS_MAP_SIZE(_num) (sizeof(struct rps_map) + (_num * sizeof(u16)))
552 603
553/* 604/*
554 * The rps_dev_flow structure contains the mapping of a flow to a CPU and the 605 * The rps_dev_flow structure contains the mapping of a flow to a CPU, the
555 * tail pointer for that CPU's input queue at the time of last enqueue. 606 * tail pointer for that CPU's input queue at the time of last enqueue, and
607 * a hardware filter index.
556 */ 608 */
557struct rps_dev_flow { 609struct rps_dev_flow {
558 u16 cpu; 610 u16 cpu;
559 u16 fill; 611 u16 filter;
560 unsigned int last_qtail; 612 unsigned int last_qtail;
561}; 613};
614#define RPS_NO_FILTER 0xffff
562 615
563/* 616/*
564 * The rps_dev_flow_table structure contains a table of flow mappings. 617 * The rps_dev_flow_table structure contains a table of flow mappings.
@@ -608,6 +661,11 @@ static inline void rps_reset_sock_flow(struct rps_sock_flow_table *table,
608 661
609extern struct rps_sock_flow_table __rcu *rps_sock_flow_table; 662extern struct rps_sock_flow_table __rcu *rps_sock_flow_table;
610 663
664#ifdef CONFIG_RFS_ACCEL
665extern bool rps_may_expire_flow(struct net_device *dev, u16 rxq_index,
666 u32 flow_id, u16 filter_id);
667#endif
668
611/* This structure contains an instance of an RX queue. */ 669/* This structure contains an instance of an RX queue. */
612struct netdev_rx_queue { 670struct netdev_rx_queue {
613 struct rps_map __rcu *rps_map; 671 struct rps_map __rcu *rps_map;
@@ -643,6 +701,14 @@ struct xps_dev_maps {
643 (nr_cpu_ids * sizeof(struct xps_map *))) 701 (nr_cpu_ids * sizeof(struct xps_map *)))
644#endif /* CONFIG_XPS */ 702#endif /* CONFIG_XPS */
645 703
704#define TC_MAX_QUEUE 16
705#define TC_BITMASK 15
706/* HW offloaded queuing disciplines txq count and offset maps */
707struct netdev_tc_txq {
708 u16 count;
709 u16 offset;
710};
711
646/* 712/*
647 * This structure defines the management hooks for network devices. 713 * This structure defines the management hooks for network devices.
648 * The following hooks can be defined; unless noted otherwise, they are 714 * The following hooks can be defined; unless noted otherwise, they are
@@ -753,6 +819,74 @@ struct xps_dev_maps {
753 * int (*ndo_set_vf_port)(struct net_device *dev, int vf, 819 * int (*ndo_set_vf_port)(struct net_device *dev, int vf,
754 * struct nlattr *port[]); 820 * struct nlattr *port[]);
755 * int (*ndo_get_vf_port)(struct net_device *dev, int vf, struct sk_buff *skb); 821 * int (*ndo_get_vf_port)(struct net_device *dev, int vf, struct sk_buff *skb);
822 * int (*ndo_setup_tc)(struct net_device *dev, u8 tc)
823 * Called to setup 'tc' number of traffic classes in the net device. This
824 * is always called from the stack with the rtnl lock held and netif tx
825 * queues stopped. This allows the netdevice to perform queue management
826 * safely.
827 *
828 * Fiber Channel over Ethernet (FCoE) offload functions.
829 * int (*ndo_fcoe_enable)(struct net_device *dev);
830 * Called when the FCoE protocol stack wants to start using LLD for FCoE
831 * so the underlying device can perform whatever needed configuration or
832 * initialization to support acceleration of FCoE traffic.
833 *
834 * int (*ndo_fcoe_disable)(struct net_device *dev);
835 * Called when the FCoE protocol stack wants to stop using LLD for FCoE
836 * so the underlying device can perform whatever needed clean-ups to
837 * stop supporting acceleration of FCoE traffic.
838 *
839 * int (*ndo_fcoe_ddp_setup)(struct net_device *dev, u16 xid,
840 * struct scatterlist *sgl, unsigned int sgc);
841 * Called when the FCoE Initiator wants to initialize an I/O that
842 * is a possible candidate for Direct Data Placement (DDP). The LLD can
843 * perform necessary setup and returns 1 to indicate the device is set up
844 * successfully to perform DDP on this I/O, otherwise this returns 0.
845 *
846 * int (*ndo_fcoe_ddp_done)(struct net_device *dev, u16 xid);
847 * Called when the FCoE Initiator/Target is done with the DDPed I/O as
848 * indicated by the FC exchange id 'xid', so the underlying device can
849 * clean up and reuse resources for later DDP requests.
850 *
851 * int (*ndo_fcoe_ddp_target)(struct net_device *dev, u16 xid,
852 * struct scatterlist *sgl, unsigned int sgc);
853 * Called when the FCoE Target wants to initialize an I/O that
854 * is a possible candidate for Direct Data Placement (DDP). The LLD can
855 * perform necessary setup and returns 1 to indicate the device is set up
856 * successfully to perform DDP on this I/O, otherwise this returns 0.
857 *
858 * int (*ndo_fcoe_get_wwn)(struct net_device *dev, u64 *wwn, int type);
859 * Called when the underlying device wants to override default World Wide
860 * Name (WWN) generation mechanism in FCoE protocol stack to pass its own
861 * World Wide Port Name (WWPN) or World Wide Node Name (WWNN) to the FCoE
862 * protocol stack to use.
863 *
864 * RFS acceleration.
865 * int (*ndo_rx_flow_steer)(struct net_device *dev, const struct sk_buff *skb,
866 * u16 rxq_index, u32 flow_id);
867 * Set hardware filter for RFS. rxq_index is the target queue index;
868 * flow_id is a flow ID to be passed to rps_may_expire_flow() later.
869 * Return the filter ID on success, or a negative error code.
870 *
871 * Slave management functions (for bridge, bonding, etc). User should
872 * call netdev_set_master() to set dev->master properly.
873 * int (*ndo_add_slave)(struct net_device *dev, struct net_device *slave_dev);
874 * Called to make another netdev an underling.
875 *
876 * int (*ndo_del_slave)(struct net_device *dev, struct net_device *slave_dev);
877 * Called to release previously enslaved netdev.
878 *
879 * Feature/offload setting functions.
880 * u32 (*ndo_fix_features)(struct net_device *dev, u32 features);
881 * Adjusts the requested feature flags according to device-specific
882 * constraints, and returns the resulting flags. Must not modify
883 * the device state.
884 *
885 * int (*ndo_set_features)(struct net_device *dev, u32 features);
886 * Called to update device configuration to new features. Passed
887 * feature set might be less than what was returned by ndo_fix_features()).
888 * Must return >0 or -errno if it changed dev->features itself.
889 *
756 */ 890 */
757#define HAVE_NET_DEVICE_OPS 891#define HAVE_NET_DEVICE_OPS
758struct net_device_ops { 892struct net_device_ops {
@@ -811,6 +945,7 @@ struct net_device_ops {
811 struct nlattr *port[]); 945 struct nlattr *port[]);
812 int (*ndo_get_vf_port)(struct net_device *dev, 946 int (*ndo_get_vf_port)(struct net_device *dev,
813 int vf, struct sk_buff *skb); 947 int vf, struct sk_buff *skb);
948 int (*ndo_setup_tc)(struct net_device *dev, u8 tc);
814#if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) 949#if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE)
815 int (*ndo_fcoe_enable)(struct net_device *dev); 950 int (*ndo_fcoe_enable)(struct net_device *dev);
816 int (*ndo_fcoe_disable)(struct net_device *dev); 951 int (*ndo_fcoe_disable)(struct net_device *dev);
@@ -820,11 +955,29 @@ struct net_device_ops {
820 unsigned int sgc); 955 unsigned int sgc);
821 int (*ndo_fcoe_ddp_done)(struct net_device *dev, 956 int (*ndo_fcoe_ddp_done)(struct net_device *dev,
822 u16 xid); 957 u16 xid);
958 int (*ndo_fcoe_ddp_target)(struct net_device *dev,
959 u16 xid,
960 struct scatterlist *sgl,
961 unsigned int sgc);
823#define NETDEV_FCOE_WWNN 0 962#define NETDEV_FCOE_WWNN 0
824#define NETDEV_FCOE_WWPN 1 963#define NETDEV_FCOE_WWPN 1
825 int (*ndo_fcoe_get_wwn)(struct net_device *dev, 964 int (*ndo_fcoe_get_wwn)(struct net_device *dev,
826 u64 *wwn, int type); 965 u64 *wwn, int type);
827#endif 966#endif
967#ifdef CONFIG_RFS_ACCEL
968 int (*ndo_rx_flow_steer)(struct net_device *dev,
969 const struct sk_buff *skb,
970 u16 rxq_index,
971 u32 flow_id);
972#endif
973 int (*ndo_add_slave)(struct net_device *dev,
974 struct net_device *slave_dev);
975 int (*ndo_del_slave)(struct net_device *dev,
976 struct net_device *slave_dev);
977 u32 (*ndo_fix_features)(struct net_device *dev,
978 u32 features);
979 int (*ndo_set_features)(struct net_device *dev,
980 u32 features);
828}; 981};
829 982
830/* 983/*
@@ -876,8 +1029,18 @@ struct net_device {
876 struct list_head napi_list; 1029 struct list_head napi_list;
877 struct list_head unreg_list; 1030 struct list_head unreg_list;
878 1031
879 /* Net device features */ 1032 /* currently active device features */
880 unsigned long features; 1033 u32 features;
1034 /* user-changeable features */
1035 u32 hw_features;
1036 /* user-requested features */
1037 u32 wanted_features;
1038 /* VLAN feature mask */
1039 u32 vlan_features;
1040
1041 /* Net device feature bits; if you change something,
1042 * also update netdev_features_strings[] in ethtool.c */
1043
881#define NETIF_F_SG 1 /* Scatter/gather IO. */ 1044#define NETIF_F_SG 1 /* Scatter/gather IO. */
882#define NETIF_F_IP_CSUM 2 /* Can checksum TCP/UDP over IPv4. */ 1045#define NETIF_F_IP_CSUM 2 /* Can checksum TCP/UDP over IPv4. */
883#define NETIF_F_NO_CSUM 4 /* Does not require checksum. F.e. loopack. */ 1046#define NETIF_F_NO_CSUM 4 /* Does not require checksum. F.e. loopack. */
@@ -902,6 +1065,7 @@ struct net_device {
902#define NETIF_F_FCOE_MTU (1 << 26) /* Supports max FCoE MTU, 2158 bytes*/ 1065#define NETIF_F_FCOE_MTU (1 << 26) /* Supports max FCoE MTU, 2158 bytes*/
903#define NETIF_F_NTUPLE (1 << 27) /* N-tuple filters supported */ 1066#define NETIF_F_NTUPLE (1 << 27) /* N-tuple filters supported */
904#define NETIF_F_RXHASH (1 << 28) /* Receive hashing offload */ 1067#define NETIF_F_RXHASH (1 << 28) /* Receive hashing offload */
1068#define NETIF_F_RXCSUM (1 << 29) /* Receive checksumming offload */
905 1069
906 /* Segmentation offload features */ 1070 /* Segmentation offload features */
907#define NETIF_F_GSO_SHIFT 16 1071#define NETIF_F_GSO_SHIFT 16
@@ -913,6 +1077,12 @@ struct net_device {
913#define NETIF_F_TSO6 (SKB_GSO_TCPV6 << NETIF_F_GSO_SHIFT) 1077#define NETIF_F_TSO6 (SKB_GSO_TCPV6 << NETIF_F_GSO_SHIFT)
914#define NETIF_F_FSO (SKB_GSO_FCOE << NETIF_F_GSO_SHIFT) 1078#define NETIF_F_FSO (SKB_GSO_FCOE << NETIF_F_GSO_SHIFT)
915 1079
1080 /* Features valid for ethtool to change */
1081 /* = all defined minus driver/device-class-related */
1082#define NETIF_F_NEVER_CHANGE (NETIF_F_HIGHDMA | NETIF_F_VLAN_CHALLENGED | \
1083 NETIF_F_LLTX | NETIF_F_NETNS_LOCAL)
1084#define NETIF_F_ETHTOOL_BITS (0x3f3fffff & ~NETIF_F_NEVER_CHANGE)
1085
916 /* List of features with software fallbacks. */ 1086 /* List of features with software fallbacks. */
917#define NETIF_F_GSO_SOFTWARE (NETIF_F_TSO | NETIF_F_TSO_ECN | \ 1087#define NETIF_F_GSO_SOFTWARE (NETIF_F_TSO | NETIF_F_TSO_ECN | \
918 NETIF_F_TSO6 | NETIF_F_UFO) 1088 NETIF_F_TSO6 | NETIF_F_UFO)
@@ -923,6 +1093,12 @@ struct net_device {
923#define NETIF_F_V6_CSUM (NETIF_F_GEN_CSUM | NETIF_F_IPV6_CSUM) 1093#define NETIF_F_V6_CSUM (NETIF_F_GEN_CSUM | NETIF_F_IPV6_CSUM)
924#define NETIF_F_ALL_CSUM (NETIF_F_V4_CSUM | NETIF_F_V6_CSUM) 1094#define NETIF_F_ALL_CSUM (NETIF_F_V4_CSUM | NETIF_F_V6_CSUM)
925 1095
1096#define NETIF_F_ALL_TSO (NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_TSO_ECN)
1097
1098#define NETIF_F_ALL_TX_OFFLOADS (NETIF_F_ALL_CSUM | NETIF_F_SG | \
1099 NETIF_F_FRAGLIST | NETIF_F_ALL_TSO | \
1100 NETIF_F_SCTP_CSUM | NETIF_F_FCOE_CRC)
1101
926 /* 1102 /*
927 * If one device supports one of these features, then enable them 1103 * If one device supports one of these features, then enable them
928 * for all in netdev_increment_features. 1104 * for all in netdev_increment_features.
@@ -931,6 +1107,9 @@ struct net_device {
931 NETIF_F_SG | NETIF_F_HIGHDMA | \ 1107 NETIF_F_SG | NETIF_F_HIGHDMA | \
932 NETIF_F_FRAGLIST) 1108 NETIF_F_FRAGLIST)
933 1109
1110 /* changeable features with no special hardware requirements */
1111#define NETIF_F_SOFT_FEATURES (NETIF_F_GSO | NETIF_F_GRO)
1112
934 /* Interface index. Unique device identifier */ 1113 /* Interface index. Unique device identifier */
935 int ifindex; 1114 int ifindex;
936 int iflink; 1115 int iflink;
@@ -1039,6 +1218,13 @@ struct net_device {
1039 1218
1040 /* Number of RX queues currently active in device */ 1219 /* Number of RX queues currently active in device */
1041 unsigned int real_num_rx_queues; 1220 unsigned int real_num_rx_queues;
1221
1222#ifdef CONFIG_RFS_ACCEL
1223 /* CPU reverse-mapping for RX completion interrupts, indexed
1224 * by RX queue number. Assigned by driver. This must only be
1225 * set if the ndo_rx_flow_steer operation is defined. */
1226 struct cpu_rmap *rx_cpu_rmap;
1227#endif
1042#endif 1228#endif
1043 1229
1044 rx_handler_func_t __rcu *rx_handler; 1230 rx_handler_func_t __rcu *rx_handler;
@@ -1132,9 +1318,6 @@ struct net_device {
1132 /* rtnetlink link ops */ 1318 /* rtnetlink link ops */
1133 const struct rtnl_link_ops *rtnl_link_ops; 1319 const struct rtnl_link_ops *rtnl_link_ops;
1134 1320
1135 /* VLAN feature mask */
1136 unsigned long vlan_features;
1137
1138 /* for setting kernel sock attribute on TCP connection setup */ 1321 /* for setting kernel sock attribute on TCP connection setup */
1139#define GSO_MAX_SIZE 65536 1322#define GSO_MAX_SIZE 65536
1140 unsigned int gso_max_size; 1323 unsigned int gso_max_size;
@@ -1143,6 +1326,9 @@ struct net_device {
1143 /* Data Center Bridging netlink ops */ 1326 /* Data Center Bridging netlink ops */
1144 const struct dcbnl_rtnl_ops *dcbnl_ops; 1327 const struct dcbnl_rtnl_ops *dcbnl_ops;
1145#endif 1328#endif
1329 u8 num_tc;
1330 struct netdev_tc_txq tc_to_txq[TC_MAX_QUEUE];
1331 u8 prio_tc_map[TC_BITMASK + 1];
1146 1332
1147#if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) 1333#if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE)
1148 /* max exchange id for FCoE LRO by ddp */ 1334 /* max exchange id for FCoE LRO by ddp */
@@ -1153,12 +1339,66 @@ struct net_device {
1153 1339
1154 /* phy device may attach itself for hardware timestamping */ 1340 /* phy device may attach itself for hardware timestamping */
1155 struct phy_device *phydev; 1341 struct phy_device *phydev;
1342
1343 /* group the device belongs to */
1344 int group;
1156}; 1345};
1157#define to_net_dev(d) container_of(d, struct net_device, dev) 1346#define to_net_dev(d) container_of(d, struct net_device, dev)
1158 1347
1159#define NETDEV_ALIGN 32 1348#define NETDEV_ALIGN 32
1160 1349
1161static inline 1350static inline
1351int netdev_get_prio_tc_map(const struct net_device *dev, u32 prio)
1352{
1353 return dev->prio_tc_map[prio & TC_BITMASK];
1354}
1355
1356static inline
1357int netdev_set_prio_tc_map(struct net_device *dev, u8 prio, u8 tc)
1358{
1359 if (tc >= dev->num_tc)
1360 return -EINVAL;
1361
1362 dev->prio_tc_map[prio & TC_BITMASK] = tc & TC_BITMASK;
1363 return 0;
1364}
1365
1366static inline
1367void netdev_reset_tc(struct net_device *dev)
1368{
1369 dev->num_tc = 0;
1370 memset(dev->tc_to_txq, 0, sizeof(dev->tc_to_txq));
1371 memset(dev->prio_tc_map, 0, sizeof(dev->prio_tc_map));
1372}
1373
1374static inline
1375int netdev_set_tc_queue(struct net_device *dev, u8 tc, u16 count, u16 offset)
1376{
1377 if (tc >= dev->num_tc)
1378 return -EINVAL;
1379
1380 dev->tc_to_txq[tc].count = count;
1381 dev->tc_to_txq[tc].offset = offset;
1382 return 0;
1383}
1384
1385static inline
1386int netdev_set_num_tc(struct net_device *dev, u8 num_tc)
1387{
1388 if (num_tc > TC_MAX_QUEUE)
1389 return -EINVAL;
1390
1391 dev->num_tc = num_tc;
1392 return 0;
1393}
1394
1395static inline
1396int netdev_get_num_tc(struct net_device *dev)
1397{
1398 return dev->num_tc;
1399}
1400
1401static inline
1162struct netdev_queue *netdev_get_tx_queue(const struct net_device *dev, 1402struct netdev_queue *netdev_get_tx_queue(const struct net_device *dev,
1163 unsigned int index) 1403 unsigned int index)
1164{ 1404{
@@ -1300,7 +1540,7 @@ struct packet_type {
1300 struct packet_type *, 1540 struct packet_type *,
1301 struct net_device *); 1541 struct net_device *);
1302 struct sk_buff *(*gso_segment)(struct sk_buff *skb, 1542 struct sk_buff *(*gso_segment)(struct sk_buff *skb,
1303 int features); 1543 u32 features);
1304 int (*gso_send_check)(struct sk_buff *skb); 1544 int (*gso_send_check)(struct sk_buff *skb);
1305 struct sk_buff **(*gro_receive)(struct sk_buff **head, 1545 struct sk_buff **(*gro_receive)(struct sk_buff **head,
1306 struct sk_buff *skb); 1546 struct sk_buff *skb);
@@ -1345,7 +1585,7 @@ static inline struct net_device *next_net_device_rcu(struct net_device *dev)
1345 struct net *net; 1585 struct net *net;
1346 1586
1347 net = dev_net(dev); 1587 net = dev_net(dev);
1348 lh = rcu_dereference(dev->dev_list.next); 1588 lh = rcu_dereference(list_next_rcu(&dev->dev_list));
1349 return lh == &net->dev_base_head ? NULL : net_device_entry(lh); 1589 return lh == &net->dev_base_head ? NULL : net_device_entry(lh);
1350} 1590}
1351 1591
@@ -1355,6 +1595,13 @@ static inline struct net_device *first_net_device(struct net *net)
1355 net_device_entry(net->dev_base_head.next); 1595 net_device_entry(net->dev_base_head.next);
1356} 1596}
1357 1597
1598static inline struct net_device *first_net_device_rcu(struct net *net)
1599{
1600 struct list_head *lh = rcu_dereference(list_next_rcu(&net->dev_base_head));
1601
1602 return lh == &net->dev_base_head ? NULL : net_device_entry(lh);
1603}
1604
1358extern int netdev_boot_setup_check(struct net_device *dev); 1605extern int netdev_boot_setup_check(struct net_device *dev);
1359extern unsigned long netdev_boot_base(const char *prefix, int unit); 1606extern unsigned long netdev_boot_base(const char *prefix, int unit);
1360extern struct net_device *dev_getbyhwaddr_rcu(struct net *net, unsigned short type, 1607extern struct net_device *dev_getbyhwaddr_rcu(struct net *net, unsigned short type,
@@ -1606,8 +1853,7 @@ static inline void netif_tx_wake_all_queues(struct net_device *dev)
1606static inline void netif_tx_stop_queue(struct netdev_queue *dev_queue) 1853static inline void netif_tx_stop_queue(struct netdev_queue *dev_queue)
1607{ 1854{
1608 if (WARN_ON(!dev_queue)) { 1855 if (WARN_ON(!dev_queue)) {
1609 printk(KERN_INFO "netif_stop_queue() cannot be called before " 1856 pr_info("netif_stop_queue() cannot be called before register_netdev()\n");
1610 "register_netdev()");
1611 return; 1857 return;
1612 } 1858 }
1613 set_bit(__QUEUE_STATE_XOFF, &dev_queue->state); 1859 set_bit(__QUEUE_STATE_XOFF, &dev_queue->state);
@@ -1844,6 +2090,7 @@ extern int dev_set_alias(struct net_device *, const char *, size_t);
1844extern int dev_change_net_namespace(struct net_device *, 2090extern int dev_change_net_namespace(struct net_device *,
1845 struct net *, const char *); 2091 struct net *, const char *);
1846extern int dev_set_mtu(struct net_device *, int); 2092extern int dev_set_mtu(struct net_device *, int);
2093extern void dev_set_group(struct net_device *, int);
1847extern int dev_set_mac_address(struct net_device *, 2094extern int dev_set_mac_address(struct net_device *,
1848 struct sockaddr *); 2095 struct sockaddr *);
1849extern int dev_hard_start_xmit(struct sk_buff *skb, 2096extern int dev_hard_start_xmit(struct sk_buff *skb,
@@ -2267,8 +2514,10 @@ extern int netdev_max_backlog;
2267extern int netdev_tstamp_prequeue; 2514extern int netdev_tstamp_prequeue;
2268extern int weight_p; 2515extern int weight_p;
2269extern int netdev_set_master(struct net_device *dev, struct net_device *master); 2516extern int netdev_set_master(struct net_device *dev, struct net_device *master);
2517extern int netdev_set_bond_master(struct net_device *dev,
2518 struct net_device *master);
2270extern int skb_checksum_help(struct sk_buff *skb); 2519extern int skb_checksum_help(struct sk_buff *skb);
2271extern struct sk_buff *skb_gso_segment(struct sk_buff *skb, int features); 2520extern struct sk_buff *skb_gso_segment(struct sk_buff *skb, u32 features);
2272#ifdef CONFIG_BUG 2521#ifdef CONFIG_BUG
2273extern void netdev_rx_csum_fault(struct net_device *dev); 2522extern void netdev_rx_csum_fault(struct net_device *dev);
2274#else 2523#else
@@ -2295,22 +2544,26 @@ extern char *netdev_drivername(const struct net_device *dev, char *buffer, int l
2295 2544
2296extern void linkwatch_run_queue(void); 2545extern void linkwatch_run_queue(void);
2297 2546
2298unsigned long netdev_increment_features(unsigned long all, unsigned long one, 2547static inline u32 netdev_get_wanted_features(struct net_device *dev)
2299 unsigned long mask); 2548{
2300unsigned long netdev_fix_features(unsigned long features, const char *name); 2549 return (dev->features & ~dev->hw_features) | dev->wanted_features;
2550}
2551u32 netdev_increment_features(u32 all, u32 one, u32 mask);
2552u32 netdev_fix_features(struct net_device *dev, u32 features);
2553void netdev_update_features(struct net_device *dev);
2301 2554
2302void netif_stacked_transfer_operstate(const struct net_device *rootdev, 2555void netif_stacked_transfer_operstate(const struct net_device *rootdev,
2303 struct net_device *dev); 2556 struct net_device *dev);
2304 2557
2305int netif_skb_features(struct sk_buff *skb); 2558u32 netif_skb_features(struct sk_buff *skb);
2306 2559
2307static inline int net_gso_ok(int features, int gso_type) 2560static inline int net_gso_ok(u32 features, int gso_type)
2308{ 2561{
2309 int feature = gso_type << NETIF_F_GSO_SHIFT; 2562 int feature = gso_type << NETIF_F_GSO_SHIFT;
2310 return (features & feature) == feature; 2563 return (features & feature) == feature;
2311} 2564}
2312 2565
2313static inline int skb_gso_ok(struct sk_buff *skb, int features) 2566static inline int skb_gso_ok(struct sk_buff *skb, u32 features)
2314{ 2567{
2315 return net_gso_ok(features, skb_shinfo(skb)->gso_type) && 2568 return net_gso_ok(features, skb_shinfo(skb)->gso_type) &&
2316 (!skb_has_frag_list(skb) || (features & NETIF_F_FRAGLIST)); 2569 (!skb_has_frag_list(skb) || (features & NETIF_F_FRAGLIST));
@@ -2328,15 +2581,9 @@ static inline void netif_set_gso_max_size(struct net_device *dev,
2328 dev->gso_max_size = size; 2581 dev->gso_max_size = size;
2329} 2582}
2330 2583
2331extern int __skb_bond_should_drop(struct sk_buff *skb, 2584static inline int netif_is_bond_slave(struct net_device *dev)
2332 struct net_device *master);
2333
2334static inline int skb_bond_should_drop(struct sk_buff *skb,
2335 struct net_device *master)
2336{ 2585{
2337 if (master) 2586 return dev->flags & IFF_SLAVE && dev->priv_flags & IFF_BONDING;
2338 return __skb_bond_should_drop(skb, master);
2339 return 0;
2340} 2587}
2341 2588
2342extern struct pernet_operations __net_initdata loopback_net_ops; 2589extern struct pernet_operations __net_initdata loopback_net_ops;
@@ -2351,6 +2598,8 @@ static inline int dev_ethtool_get_settings(struct net_device *dev,
2351 2598
2352static inline u32 dev_ethtool_get_rx_csum(struct net_device *dev) 2599static inline u32 dev_ethtool_get_rx_csum(struct net_device *dev)
2353{ 2600{
2601 if (dev->hw_features & NETIF_F_RXCSUM)
2602 return !!(dev->features & NETIF_F_RXCSUM);
2354 if (!dev->ethtool_ops || !dev->ethtool_ops->get_rx_csum) 2603 if (!dev->ethtool_ops || !dev->ethtool_ops->get_rx_csum)
2355 return 0; 2604 return 0;
2356 return dev->ethtool_ops->get_rx_csum(dev); 2605 return dev->ethtool_ops->get_rx_csum(dev);
diff --git a/include/linux/netfilter.h b/include/linux/netfilter.h
index 1893837b3966..eeec00abb664 100644
--- a/include/linux/netfilter.h
+++ b/include/linux/netfilter.h
@@ -24,16 +24,20 @@
24#define NF_MAX_VERDICT NF_STOP 24#define NF_MAX_VERDICT NF_STOP
25 25
26/* we overload the higher bits for encoding auxiliary data such as the queue 26/* we overload the higher bits for encoding auxiliary data such as the queue
27 * number. Not nice, but better than additional function arguments. */ 27 * number or errno values. Not nice, but better than additional function
28#define NF_VERDICT_MASK 0x0000ffff 28 * arguments. */
29#define NF_VERDICT_BITS 16 29#define NF_VERDICT_MASK 0x000000ff
30
31/* extra verdict flags have mask 0x0000ff00 */
32#define NF_VERDICT_FLAG_QUEUE_BYPASS 0x00008000
30 33
34/* queue number (NF_QUEUE) or errno (NF_DROP) */
31#define NF_VERDICT_QMASK 0xffff0000 35#define NF_VERDICT_QMASK 0xffff0000
32#define NF_VERDICT_QBITS 16 36#define NF_VERDICT_QBITS 16
33 37
34#define NF_QUEUE_NR(x) ((((x) << NF_VERDICT_BITS) & NF_VERDICT_QMASK) | NF_QUEUE) 38#define NF_QUEUE_NR(x) ((((x) << 16) & NF_VERDICT_QMASK) | NF_QUEUE)
35 39
36#define NF_DROP_ERR(x) (((-x) << NF_VERDICT_BITS) | NF_DROP) 40#define NF_DROP_ERR(x) (((-x) << 16) | NF_DROP)
37 41
38/* only for userspace compatibility */ 42/* only for userspace compatibility */
39#ifndef __KERNEL__ 43#ifndef __KERNEL__
@@ -41,6 +45,9 @@
41 <= 0x2000 is used for protocol-flags. */ 45 <= 0x2000 is used for protocol-flags. */
42#define NFC_UNKNOWN 0x4000 46#define NFC_UNKNOWN 0x4000
43#define NFC_ALTERED 0x8000 47#define NFC_ALTERED 0x8000
48
49/* NF_VERDICT_BITS should be 8 now, but userspace might break if this changes */
50#define NF_VERDICT_BITS 16
44#endif 51#endif
45 52
46enum nf_inet_hooks { 53enum nf_inet_hooks {
@@ -72,6 +79,10 @@ union nf_inet_addr {
72 79
73#ifdef __KERNEL__ 80#ifdef __KERNEL__
74#ifdef CONFIG_NETFILTER 81#ifdef CONFIG_NETFILTER
82static inline int NF_DROP_GETERR(int verdict)
83{
84 return -(verdict >> NF_VERDICT_QBITS);
85}
75 86
76static inline int nf_inet_addr_cmp(const union nf_inet_addr *a1, 87static inline int nf_inet_addr_cmp(const union nf_inet_addr *a1,
77 const union nf_inet_addr *a2) 88 const union nf_inet_addr *a2)
@@ -267,7 +278,7 @@ struct nf_afinfo {
267 int route_key_size; 278 int route_key_size;
268}; 279};
269 280
270extern const struct nf_afinfo *nf_afinfo[NFPROTO_NUMPROTO]; 281extern const struct nf_afinfo __rcu *nf_afinfo[NFPROTO_NUMPROTO];
271static inline const struct nf_afinfo *nf_get_afinfo(unsigned short family) 282static inline const struct nf_afinfo *nf_get_afinfo(unsigned short family)
272{ 283{
273 return rcu_dereference(nf_afinfo[family]); 284 return rcu_dereference(nf_afinfo[family]);
@@ -357,9 +368,9 @@ nf_nat_decode_session(struct sk_buff *skb, struct flowi *fl, u_int8_t family)
357#endif /*CONFIG_NETFILTER*/ 368#endif /*CONFIG_NETFILTER*/
358 369
359#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) 370#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
360extern void (*ip_ct_attach)(struct sk_buff *, struct sk_buff *); 371extern void (*ip_ct_attach)(struct sk_buff *, struct sk_buff *) __rcu;
361extern void nf_ct_attach(struct sk_buff *, struct sk_buff *); 372extern void nf_ct_attach(struct sk_buff *, struct sk_buff *);
362extern void (*nf_ct_destroy)(struct nf_conntrack *); 373extern void (*nf_ct_destroy)(struct nf_conntrack *) __rcu;
363#else 374#else
364static inline void nf_ct_attach(struct sk_buff *new, struct sk_buff *skb) {} 375static inline void nf_ct_attach(struct sk_buff *new, struct sk_buff *skb) {}
365#endif 376#endif
diff --git a/include/linux/netfilter/Kbuild b/include/linux/netfilter/Kbuild
index 9d40effe7ca7..a1b410c76fc3 100644
--- a/include/linux/netfilter/Kbuild
+++ b/include/linux/netfilter/Kbuild
@@ -1,3 +1,5 @@
1header-y += ipset/
2
1header-y += nf_conntrack_common.h 3header-y += nf_conntrack_common.h
2header-y += nf_conntrack_ftp.h 4header-y += nf_conntrack_ftp.h
3header-y += nf_conntrack_sctp.h 5header-y += nf_conntrack_sctp.h
@@ -9,6 +11,7 @@ header-y += nfnetlink_conntrack.h
9header-y += nfnetlink_log.h 11header-y += nfnetlink_log.h
10header-y += nfnetlink_queue.h 12header-y += nfnetlink_queue.h
11header-y += x_tables.h 13header-y += x_tables.h
14header-y += xt_AUDIT.h
12header-y += xt_CHECKSUM.h 15header-y += xt_CHECKSUM.h
13header-y += xt_CLASSIFY.h 16header-y += xt_CLASSIFY.h
14header-y += xt_CONNMARK.h 17header-y += xt_CONNMARK.h
@@ -26,6 +29,7 @@ header-y += xt_TCPMSS.h
26header-y += xt_TCPOPTSTRIP.h 29header-y += xt_TCPOPTSTRIP.h
27header-y += xt_TEE.h 30header-y += xt_TEE.h
28header-y += xt_TPROXY.h 31header-y += xt_TPROXY.h
32header-y += xt_addrtype.h
29header-y += xt_cluster.h 33header-y += xt_cluster.h
30header-y += xt_comment.h 34header-y += xt_comment.h
31header-y += xt_connbytes.h 35header-y += xt_connbytes.h
@@ -34,6 +38,7 @@ header-y += xt_connmark.h
34header-y += xt_conntrack.h 38header-y += xt_conntrack.h
35header-y += xt_cpu.h 39header-y += xt_cpu.h
36header-y += xt_dccp.h 40header-y += xt_dccp.h
41header-y += xt_devgroup.h
37header-y += xt_dscp.h 42header-y += xt_dscp.h
38header-y += xt_esp.h 43header-y += xt_esp.h
39header-y += xt_hashlimit.h 44header-y += xt_hashlimit.h
@@ -54,7 +59,9 @@ header-y += xt_quota.h
54header-y += xt_rateest.h 59header-y += xt_rateest.h
55header-y += xt_realm.h 60header-y += xt_realm.h
56header-y += xt_recent.h 61header-y += xt_recent.h
62header-y += xt_set.h
57header-y += xt_sctp.h 63header-y += xt_sctp.h
64header-y += xt_socket.h
58header-y += xt_state.h 65header-y += xt_state.h
59header-y += xt_statistic.h 66header-y += xt_statistic.h
60header-y += xt_string.h 67header-y += xt_string.h
diff --git a/include/linux/netfilter/ipset/Kbuild b/include/linux/netfilter/ipset/Kbuild
new file mode 100644
index 000000000000..601fe71d34d5
--- /dev/null
+++ b/include/linux/netfilter/ipset/Kbuild
@@ -0,0 +1,4 @@
1header-y += ip_set.h
2header-y += ip_set_bitmap.h
3header-y += ip_set_hash.h
4header-y += ip_set_list.h
diff --git a/include/linux/netfilter/ipset/ip_set.h b/include/linux/netfilter/ipset/ip_set.h
new file mode 100644
index 000000000000..ec333d83f3b4
--- /dev/null
+++ b/include/linux/netfilter/ipset/ip_set.h
@@ -0,0 +1,452 @@
1#ifndef _IP_SET_H
2#define _IP_SET_H
3
4/* Copyright (C) 2000-2002 Joakim Axelsson <gozem@linux.nu>
5 * Patrick Schaaf <bof@bof.de>
6 * Martin Josefsson <gandalf@wlug.westbo.se>
7 * Copyright (C) 2003-2011 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation.
12 */
13
14/* The protocol version */
15#define IPSET_PROTOCOL 6
16
17/* The max length of strings including NUL: set and type identifiers */
18#define IPSET_MAXNAMELEN 32
19
20/* Message types and commands */
21enum ipset_cmd {
22 IPSET_CMD_NONE,
23 IPSET_CMD_PROTOCOL, /* 1: Return protocol version */
24 IPSET_CMD_CREATE, /* 2: Create a new (empty) set */
25 IPSET_CMD_DESTROY, /* 3: Destroy a (empty) set */
26 IPSET_CMD_FLUSH, /* 4: Remove all elements from a set */
27 IPSET_CMD_RENAME, /* 5: Rename a set */
28 IPSET_CMD_SWAP, /* 6: Swap two sets */
29 IPSET_CMD_LIST, /* 7: List sets */
30 IPSET_CMD_SAVE, /* 8: Save sets */
31 IPSET_CMD_ADD, /* 9: Add an element to a set */
32 IPSET_CMD_DEL, /* 10: Delete an element from a set */
33 IPSET_CMD_TEST, /* 11: Test an element in a set */
34 IPSET_CMD_HEADER, /* 12: Get set header data only */
35 IPSET_CMD_TYPE, /* 13: Get set type */
36 IPSET_MSG_MAX, /* Netlink message commands */
37
38 /* Commands in userspace: */
39 IPSET_CMD_RESTORE = IPSET_MSG_MAX, /* 14: Enter restore mode */
40 IPSET_CMD_HELP, /* 15: Get help */
41 IPSET_CMD_VERSION, /* 16: Get program version */
42 IPSET_CMD_QUIT, /* 17: Quit from interactive mode */
43
44 IPSET_CMD_MAX,
45
46 IPSET_CMD_COMMIT = IPSET_CMD_MAX, /* 18: Commit buffered commands */
47};
48
49/* Attributes at command level */
50enum {
51 IPSET_ATTR_UNSPEC,
52 IPSET_ATTR_PROTOCOL, /* 1: Protocol version */
53 IPSET_ATTR_SETNAME, /* 2: Name of the set */
54 IPSET_ATTR_TYPENAME, /* 3: Typename */
55 IPSET_ATTR_SETNAME2 = IPSET_ATTR_TYPENAME, /* Setname at rename/swap */
56 IPSET_ATTR_REVISION, /* 4: Settype revision */
57 IPSET_ATTR_FAMILY, /* 5: Settype family */
58 IPSET_ATTR_FLAGS, /* 6: Flags at command level */
59 IPSET_ATTR_DATA, /* 7: Nested attributes */
60 IPSET_ATTR_ADT, /* 8: Multiple data containers */
61 IPSET_ATTR_LINENO, /* 9: Restore lineno */
62 IPSET_ATTR_PROTOCOL_MIN, /* 10: Minimal supported version number */
63 IPSET_ATTR_REVISION_MIN = IPSET_ATTR_PROTOCOL_MIN, /* type rev min */
64 __IPSET_ATTR_CMD_MAX,
65};
66#define IPSET_ATTR_CMD_MAX (__IPSET_ATTR_CMD_MAX - 1)
67
68/* CADT specific attributes */
69enum {
70 IPSET_ATTR_IP = IPSET_ATTR_UNSPEC + 1,
71 IPSET_ATTR_IP_FROM = IPSET_ATTR_IP,
72 IPSET_ATTR_IP_TO, /* 2 */
73 IPSET_ATTR_CIDR, /* 3 */
74 IPSET_ATTR_PORT, /* 4 */
75 IPSET_ATTR_PORT_FROM = IPSET_ATTR_PORT,
76 IPSET_ATTR_PORT_TO, /* 5 */
77 IPSET_ATTR_TIMEOUT, /* 6 */
78 IPSET_ATTR_PROTO, /* 7 */
79 IPSET_ATTR_CADT_FLAGS, /* 8 */
80 IPSET_ATTR_CADT_LINENO = IPSET_ATTR_LINENO, /* 9 */
81 /* Reserve empty slots */
82 IPSET_ATTR_CADT_MAX = 16,
83 /* Create-only specific attributes */
84 IPSET_ATTR_GC,
85 IPSET_ATTR_HASHSIZE,
86 IPSET_ATTR_MAXELEM,
87 IPSET_ATTR_NETMASK,
88 IPSET_ATTR_PROBES,
89 IPSET_ATTR_RESIZE,
90 IPSET_ATTR_SIZE,
91 /* Kernel-only */
92 IPSET_ATTR_ELEMENTS,
93 IPSET_ATTR_REFERENCES,
94 IPSET_ATTR_MEMSIZE,
95
96 __IPSET_ATTR_CREATE_MAX,
97};
98#define IPSET_ATTR_CREATE_MAX (__IPSET_ATTR_CREATE_MAX - 1)
99
100/* ADT specific attributes */
101enum {
102 IPSET_ATTR_ETHER = IPSET_ATTR_CADT_MAX + 1,
103 IPSET_ATTR_NAME,
104 IPSET_ATTR_NAMEREF,
105 IPSET_ATTR_IP2,
106 IPSET_ATTR_CIDR2,
107 __IPSET_ATTR_ADT_MAX,
108};
109#define IPSET_ATTR_ADT_MAX (__IPSET_ATTR_ADT_MAX - 1)
110
111/* IP specific attributes */
112enum {
113 IPSET_ATTR_IPADDR_IPV4 = IPSET_ATTR_UNSPEC + 1,
114 IPSET_ATTR_IPADDR_IPV6,
115 __IPSET_ATTR_IPADDR_MAX,
116};
117#define IPSET_ATTR_IPADDR_MAX (__IPSET_ATTR_IPADDR_MAX - 1)
118
119/* Error codes */
120enum ipset_errno {
121 IPSET_ERR_PRIVATE = 4096,
122 IPSET_ERR_PROTOCOL,
123 IPSET_ERR_FIND_TYPE,
124 IPSET_ERR_MAX_SETS,
125 IPSET_ERR_BUSY,
126 IPSET_ERR_EXIST_SETNAME2,
127 IPSET_ERR_TYPE_MISMATCH,
128 IPSET_ERR_EXIST,
129 IPSET_ERR_INVALID_CIDR,
130 IPSET_ERR_INVALID_NETMASK,
131 IPSET_ERR_INVALID_FAMILY,
132 IPSET_ERR_TIMEOUT,
133 IPSET_ERR_REFERENCED,
134 IPSET_ERR_IPADDR_IPV4,
135 IPSET_ERR_IPADDR_IPV6,
136
137 /* Type specific error codes */
138 IPSET_ERR_TYPE_SPECIFIC = 4352,
139};
140
141/* Flags at command level */
142enum ipset_cmd_flags {
143 IPSET_FLAG_BIT_EXIST = 0,
144 IPSET_FLAG_EXIST = (1 << IPSET_FLAG_BIT_EXIST),
145};
146
147/* Flags at CADT attribute level */
148enum ipset_cadt_flags {
149 IPSET_FLAG_BIT_BEFORE = 0,
150 IPSET_FLAG_BEFORE = (1 << IPSET_FLAG_BIT_BEFORE),
151};
152
153/* Commands with settype-specific attributes */
154enum ipset_adt {
155 IPSET_ADD,
156 IPSET_DEL,
157 IPSET_TEST,
158 IPSET_ADT_MAX,
159 IPSET_CREATE = IPSET_ADT_MAX,
160 IPSET_CADT_MAX,
161};
162
163#ifdef __KERNEL__
164#include <linux/ip.h>
165#include <linux/ipv6.h>
166#include <linux/netlink.h>
167#include <linux/netfilter.h>
168#include <linux/vmalloc.h>
169#include <net/netlink.h>
170
171/* Sets are identified by an index in kernel space. Tweak with ip_set_id_t
172 * and IPSET_INVALID_ID if you want to increase the max number of sets.
173 */
174typedef u16 ip_set_id_t;
175
176#define IPSET_INVALID_ID 65535
177
178enum ip_set_dim {
179 IPSET_DIM_ZERO = 0,
180 IPSET_DIM_ONE,
181 IPSET_DIM_TWO,
182 IPSET_DIM_THREE,
183 /* Max dimension in elements.
184 * If changed, new revision of iptables match/target is required.
185 */
186 IPSET_DIM_MAX = 6,
187};
188
189/* Option flags for kernel operations */
190enum ip_set_kopt {
191 IPSET_INV_MATCH = (1 << IPSET_DIM_ZERO),
192 IPSET_DIM_ONE_SRC = (1 << IPSET_DIM_ONE),
193 IPSET_DIM_TWO_SRC = (1 << IPSET_DIM_TWO),
194 IPSET_DIM_THREE_SRC = (1 << IPSET_DIM_THREE),
195};
196
197/* Set features */
198enum ip_set_feature {
199 IPSET_TYPE_IP_FLAG = 0,
200 IPSET_TYPE_IP = (1 << IPSET_TYPE_IP_FLAG),
201 IPSET_TYPE_PORT_FLAG = 1,
202 IPSET_TYPE_PORT = (1 << IPSET_TYPE_PORT_FLAG),
203 IPSET_TYPE_MAC_FLAG = 2,
204 IPSET_TYPE_MAC = (1 << IPSET_TYPE_MAC_FLAG),
205 IPSET_TYPE_IP2_FLAG = 3,
206 IPSET_TYPE_IP2 = (1 << IPSET_TYPE_IP2_FLAG),
207 IPSET_TYPE_NAME_FLAG = 4,
208 IPSET_TYPE_NAME = (1 << IPSET_TYPE_NAME_FLAG),
209 /* Strictly speaking not a feature, but a flag for dumping:
210 * this settype must be dumped last */
211 IPSET_DUMP_LAST_FLAG = 7,
212 IPSET_DUMP_LAST = (1 << IPSET_DUMP_LAST_FLAG),
213};
214
215struct ip_set;
216
217typedef int (*ipset_adtfn)(struct ip_set *set, void *value, u32 timeout);
218
219/* Set type, variant-specific part */
220struct ip_set_type_variant {
221 /* Kernelspace: test/add/del entries
222 * returns negative error code,
223 * zero for no match/success to add/delete
224 * positive for matching element */
225 int (*kadt)(struct ip_set *set, const struct sk_buff * skb,
226 enum ipset_adt adt, u8 pf, u8 dim, u8 flags);
227
228 /* Userspace: test/add/del entries
229 * returns negative error code,
230 * zero for no match/success to add/delete
231 * positive for matching element */
232 int (*uadt)(struct ip_set *set, struct nlattr *tb[],
233 enum ipset_adt adt, u32 *lineno, u32 flags);
234
235 /* Low level add/del/test functions */
236 ipset_adtfn adt[IPSET_ADT_MAX];
237
238 /* When adding entries and set is full, try to resize the set */
239 int (*resize)(struct ip_set *set, bool retried);
240 /* Destroy the set */
241 void (*destroy)(struct ip_set *set);
242 /* Flush the elements */
243 void (*flush)(struct ip_set *set);
244 /* Expire entries before listing */
245 void (*expire)(struct ip_set *set);
246 /* List set header data */
247 int (*head)(struct ip_set *set, struct sk_buff *skb);
248 /* List elements */
249 int (*list)(const struct ip_set *set, struct sk_buff *skb,
250 struct netlink_callback *cb);
251
252 /* Return true if "b" set is the same as "a"
253 * according to the create set parameters */
254 bool (*same_set)(const struct ip_set *a, const struct ip_set *b);
255};
256
257/* The core set type structure */
258struct ip_set_type {
259 struct list_head list;
260
261 /* Typename */
262 char name[IPSET_MAXNAMELEN];
263 /* Protocol version */
264 u8 protocol;
265 /* Set features to control swapping */
266 u8 features;
267 /* Set type dimension */
268 u8 dimension;
269 /* Supported family: may be AF_UNSPEC for both AF_INET/AF_INET6 */
270 u8 family;
271 /* Type revision */
272 u8 revision;
273
274 /* Create set */
275 int (*create)(struct ip_set *set, struct nlattr *tb[], u32 flags);
276
277 /* Attribute policies */
278 const struct nla_policy create_policy[IPSET_ATTR_CREATE_MAX + 1];
279 const struct nla_policy adt_policy[IPSET_ATTR_ADT_MAX + 1];
280
281 /* Set this to THIS_MODULE if you are a module, otherwise NULL */
282 struct module *me;
283};
284
285/* register and unregister set type */
286extern int ip_set_type_register(struct ip_set_type *set_type);
287extern void ip_set_type_unregister(struct ip_set_type *set_type);
288
289/* A generic IP set */
290struct ip_set {
291 /* The name of the set */
292 char name[IPSET_MAXNAMELEN];
293 /* Lock protecting the set data */
294 rwlock_t lock;
295 /* References to the set */
296 atomic_t ref;
297 /* The core set type */
298 struct ip_set_type *type;
299 /* The type variant doing the real job */
300 const struct ip_set_type_variant *variant;
301 /* The actual INET family of the set */
302 u8 family;
303 /* The type specific data */
304 void *data;
305};
306
307/* register and unregister set references */
308extern ip_set_id_t ip_set_get_byname(const char *name, struct ip_set **set);
309extern void ip_set_put_byindex(ip_set_id_t index);
310extern const char * ip_set_name_byindex(ip_set_id_t index);
311extern ip_set_id_t ip_set_nfnl_get(const char *name);
312extern ip_set_id_t ip_set_nfnl_get_byindex(ip_set_id_t index);
313extern void ip_set_nfnl_put(ip_set_id_t index);
314
315/* API for iptables set match, and SET target */
316extern int ip_set_add(ip_set_id_t id, const struct sk_buff *skb,
317 u8 family, u8 dim, u8 flags);
318extern int ip_set_del(ip_set_id_t id, const struct sk_buff *skb,
319 u8 family, u8 dim, u8 flags);
320extern int ip_set_test(ip_set_id_t id, const struct sk_buff *skb,
321 u8 family, u8 dim, u8 flags);
322
323/* Utility functions */
324extern void * ip_set_alloc(size_t size);
325extern void ip_set_free(void *members);
326extern int ip_set_get_ipaddr4(struct nlattr *nla, __be32 *ipaddr);
327extern int ip_set_get_ipaddr6(struct nlattr *nla, union nf_inet_addr *ipaddr);
328
329static inline int
330ip_set_get_hostipaddr4(struct nlattr *nla, u32 *ipaddr)
331{
332 __be32 ip;
333 int ret = ip_set_get_ipaddr4(nla, &ip);
334
335 if (ret)
336 return ret;
337 *ipaddr = ntohl(ip);
338 return 0;
339}
340
341/* Ignore IPSET_ERR_EXIST errors if asked to do so? */
342static inline bool
343ip_set_eexist(int ret, u32 flags)
344{
345 return ret == -IPSET_ERR_EXIST && (flags & IPSET_FLAG_EXIST);
346}
347
348/* Check the NLA_F_NET_BYTEORDER flag */
349static inline bool
350ip_set_attr_netorder(struct nlattr *tb[], int type)
351{
352 return tb[type] && (tb[type]->nla_type & NLA_F_NET_BYTEORDER);
353}
354
355static inline bool
356ip_set_optattr_netorder(struct nlattr *tb[], int type)
357{
358 return !tb[type] || (tb[type]->nla_type & NLA_F_NET_BYTEORDER);
359}
360
361/* Useful converters */
362static inline u32
363ip_set_get_h32(const struct nlattr *attr)
364{
365 return ntohl(nla_get_be32(attr));
366}
367
368static inline u16
369ip_set_get_h16(const struct nlattr *attr)
370{
371 return ntohs(nla_get_be16(attr));
372}
373
374#define ipset_nest_start(skb, attr) nla_nest_start(skb, attr | NLA_F_NESTED)
375#define ipset_nest_end(skb, start) nla_nest_end(skb, start)
376
377#define NLA_PUT_IPADDR4(skb, type, ipaddr) \
378do { \
379 struct nlattr *__nested = ipset_nest_start(skb, type); \
380 \
381 if (!__nested) \
382 goto nla_put_failure; \
383 NLA_PUT_NET32(skb, IPSET_ATTR_IPADDR_IPV4, ipaddr); \
384 ipset_nest_end(skb, __nested); \
385} while (0)
386
387#define NLA_PUT_IPADDR6(skb, type, ipaddrptr) \
388do { \
389 struct nlattr *__nested = ipset_nest_start(skb, type); \
390 \
391 if (!__nested) \
392 goto nla_put_failure; \
393 NLA_PUT(skb, IPSET_ATTR_IPADDR_IPV6, \
394 sizeof(struct in6_addr), ipaddrptr); \
395 ipset_nest_end(skb, __nested); \
396} while (0)
397
398/* Get address from skbuff */
399static inline __be32
400ip4addr(const struct sk_buff *skb, bool src)
401{
402 return src ? ip_hdr(skb)->saddr : ip_hdr(skb)->daddr;
403}
404
405static inline void
406ip4addrptr(const struct sk_buff *skb, bool src, __be32 *addr)
407{
408 *addr = src ? ip_hdr(skb)->saddr : ip_hdr(skb)->daddr;
409}
410
411static inline void
412ip6addrptr(const struct sk_buff *skb, bool src, struct in6_addr *addr)
413{
414 memcpy(addr, src ? &ipv6_hdr(skb)->saddr : &ipv6_hdr(skb)->daddr,
415 sizeof(*addr));
416}
417
418/* Calculate the bytes required to store the inclusive range of a-b */
419static inline int
420bitmap_bytes(u32 a, u32 b)
421{
422 return 4 * ((((b - a + 8) / 8) + 3) / 4);
423}
424
425/* Interface to iptables/ip6tables */
426
427#define SO_IP_SET 83
428
429union ip_set_name_index {
430 char name[IPSET_MAXNAMELEN];
431 ip_set_id_t index;
432};
433
434#define IP_SET_OP_GET_BYNAME 0x00000006 /* Get set index by name */
435struct ip_set_req_get_set {
436 unsigned op;
437 unsigned version;
438 union ip_set_name_index set;
439};
440
441#define IP_SET_OP_GET_BYINDEX 0x00000007 /* Get set name by index */
442/* Uses ip_set_req_get_set */
443
444#define IP_SET_OP_VERSION 0x00000100 /* Ask kernel version */
445struct ip_set_req_version {
446 unsigned op;
447 unsigned version;
448};
449
450#endif /* __KERNEL__ */
451
452#endif /*_IP_SET_H */
diff --git a/include/linux/netfilter/ipset/ip_set_ahash.h b/include/linux/netfilter/ipset/ip_set_ahash.h
new file mode 100644
index 000000000000..ec9d9bea1e37
--- /dev/null
+++ b/include/linux/netfilter/ipset/ip_set_ahash.h
@@ -0,0 +1,1074 @@
1#ifndef _IP_SET_AHASH_H
2#define _IP_SET_AHASH_H
3
4#include <linux/rcupdate.h>
5#include <linux/jhash.h>
6#include <linux/netfilter/ipset/ip_set_timeout.h>
7
8/* Hashing which uses arrays to resolve clashing. The hash table is resized
9 * (doubled) when searching becomes too long.
10 * Internally jhash is used with the assumption that the size of the
11 * stored data is a multiple of sizeof(u32). If storage supports timeout,
12 * the timeout field must be the last one in the data structure - that field
13 * is ignored when computing the hash key.
14 *
15 * Readers and resizing
16 *
17 * Resizing can be triggered by userspace command only, and those
18 * are serialized by the nfnl mutex. During resizing the set is
19 * read-locked, so the only possible concurrent operations are
20 * the kernel side readers. Those must be protected by proper RCU locking.
21 */
22
23/* Number of elements to store in an initial array block */
24#define AHASH_INIT_SIZE 4
25/* Max number of elements to store in an array block */
26#define AHASH_MAX_SIZE (3*4)
27
28/* A hash bucket */
29struct hbucket {
30 void *value; /* the array of the values */
31 u8 size; /* size of the array */
32 u8 pos; /* position of the first free entry */
33};
34
35/* The hash table: the table size stored here in order to make resizing easy */
36struct htable {
37 u8 htable_bits; /* size of hash table == 2^htable_bits */
38 struct hbucket bucket[0]; /* hashtable buckets */
39};
40
41#define hbucket(h, i) &((h)->bucket[i])
42
43/* Book-keeping of the prefixes added to the set */
44struct ip_set_hash_nets {
45 u8 cidr; /* the different cidr values in the set */
46 u32 nets; /* number of elements per cidr */
47};
48
49/* The generic ip_set hash structure */
50struct ip_set_hash {
51 struct htable *table; /* the hash table */
52 u32 maxelem; /* max elements in the hash */
53 u32 elements; /* current element (vs timeout) */
54 u32 initval; /* random jhash init value */
55 u32 timeout; /* timeout value, if enabled */
56 struct timer_list gc; /* garbage collection when timeout enabled */
57#ifdef IP_SET_HASH_WITH_NETMASK
58 u8 netmask; /* netmask value for subnets to store */
59#endif
60#ifdef IP_SET_HASH_WITH_NETS
61 struct ip_set_hash_nets nets[0]; /* book-keeping of prefixes */
62#endif
63};
64
65/* Compute htable_bits from the user input parameter hashsize */
66static u8
67htable_bits(u32 hashsize)
68{
69 /* Assume that hashsize == 2^htable_bits */
70 u8 bits = fls(hashsize - 1);
71 if (jhash_size(bits) != hashsize)
72 /* Round up to the first 2^n value */
73 bits = fls(hashsize);
74
75 return bits;
76}
77
78#ifdef IP_SET_HASH_WITH_NETS
79
80#define SET_HOST_MASK(family) (family == AF_INET ? 32 : 128)
81
82/* Network cidr size book keeping when the hash stores different
83 * sized networks */
84static void
85add_cidr(struct ip_set_hash *h, u8 cidr, u8 host_mask)
86{
87 u8 i;
88
89 ++h->nets[cidr-1].nets;
90
91 pr_debug("add_cidr added %u: %u\n", cidr, h->nets[cidr-1].nets);
92
93 if (h->nets[cidr-1].nets > 1)
94 return;
95
96 /* New cidr size */
97 for (i = 0; i < host_mask && h->nets[i].cidr; i++) {
98 /* Add in increasing prefix order, so larger cidr first */
99 if (h->nets[i].cidr < cidr)
100 swap(h->nets[i].cidr, cidr);
101 }
102 if (i < host_mask)
103 h->nets[i].cidr = cidr;
104}
105
106static void
107del_cidr(struct ip_set_hash *h, u8 cidr, u8 host_mask)
108{
109 u8 i;
110
111 --h->nets[cidr-1].nets;
112
113 pr_debug("del_cidr deleted %u: %u\n", cidr, h->nets[cidr-1].nets);
114
115 if (h->nets[cidr-1].nets != 0)
116 return;
117
118 /* All entries with this cidr size deleted, so cleanup h->cidr[] */
119 for (i = 0; i < host_mask - 1 && h->nets[i].cidr; i++) {
120 if (h->nets[i].cidr == cidr)
121 h->nets[i].cidr = cidr = h->nets[i+1].cidr;
122 }
123 h->nets[i - 1].cidr = 0;
124}
125#endif
126
127/* Destroy the hashtable part of the set */
128static void
129ahash_destroy(struct htable *t)
130{
131 struct hbucket *n;
132 u32 i;
133
134 for (i = 0; i < jhash_size(t->htable_bits); i++) {
135 n = hbucket(t, i);
136 if (n->size)
137 /* FIXME: use slab cache */
138 kfree(n->value);
139 }
140
141 ip_set_free(t);
142}
143
144/* Calculate the actual memory size of the set data */
145static size_t
146ahash_memsize(const struct ip_set_hash *h, size_t dsize, u8 host_mask)
147{
148 u32 i;
149 struct htable *t = h->table;
150 size_t memsize = sizeof(*h)
151 + sizeof(*t)
152#ifdef IP_SET_HASH_WITH_NETS
153 + sizeof(struct ip_set_hash_nets) * host_mask
154#endif
155 + jhash_size(t->htable_bits) * sizeof(struct hbucket);
156
157 for (i = 0; i < jhash_size(t->htable_bits); i++)
158 memsize += t->bucket[i].size * dsize;
159
160 return memsize;
161}
162
163/* Flush a hash type of set: destroy all elements */
164static void
165ip_set_hash_flush(struct ip_set *set)
166{
167 struct ip_set_hash *h = set->data;
168 struct htable *t = h->table;
169 struct hbucket *n;
170 u32 i;
171
172 for (i = 0; i < jhash_size(t->htable_bits); i++) {
173 n = hbucket(t, i);
174 if (n->size) {
175 n->size = n->pos = 0;
176 /* FIXME: use slab cache */
177 kfree(n->value);
178 }
179 }
180#ifdef IP_SET_HASH_WITH_NETS
181 memset(h->nets, 0, sizeof(struct ip_set_hash_nets)
182 * SET_HOST_MASK(set->family));
183#endif
184 h->elements = 0;
185}
186
187/* Destroy a hash type of set */
188static void
189ip_set_hash_destroy(struct ip_set *set)
190{
191 struct ip_set_hash *h = set->data;
192
193 if (with_timeout(h->timeout))
194 del_timer_sync(&h->gc);
195
196 ahash_destroy(h->table);
197 kfree(h);
198
199 set->data = NULL;
200}
201
202#define HKEY(data, initval, htable_bits) \
203(jhash2((u32 *)(data), sizeof(struct type_pf_elem)/sizeof(u32), initval) \
204 & jhash_mask(htable_bits))
205
206#endif /* _IP_SET_AHASH_H */
207
208#define CONCAT(a, b, c) a##b##c
209#define TOKEN(a, b, c) CONCAT(a, b, c)
210
211/* Type/family dependent function prototypes */
212
213#define type_pf_data_equal TOKEN(TYPE, PF, _data_equal)
214#define type_pf_data_isnull TOKEN(TYPE, PF, _data_isnull)
215#define type_pf_data_copy TOKEN(TYPE, PF, _data_copy)
216#define type_pf_data_zero_out TOKEN(TYPE, PF, _data_zero_out)
217#define type_pf_data_netmask TOKEN(TYPE, PF, _data_netmask)
218#define type_pf_data_list TOKEN(TYPE, PF, _data_list)
219#define type_pf_data_tlist TOKEN(TYPE, PF, _data_tlist)
220
221#define type_pf_elem TOKEN(TYPE, PF, _elem)
222#define type_pf_telem TOKEN(TYPE, PF, _telem)
223#define type_pf_data_timeout TOKEN(TYPE, PF, _data_timeout)
224#define type_pf_data_expired TOKEN(TYPE, PF, _data_expired)
225#define type_pf_data_timeout_set TOKEN(TYPE, PF, _data_timeout_set)
226
227#define type_pf_elem_add TOKEN(TYPE, PF, _elem_add)
228#define type_pf_add TOKEN(TYPE, PF, _add)
229#define type_pf_del TOKEN(TYPE, PF, _del)
230#define type_pf_test_cidrs TOKEN(TYPE, PF, _test_cidrs)
231#define type_pf_test TOKEN(TYPE, PF, _test)
232
233#define type_pf_elem_tadd TOKEN(TYPE, PF, _elem_tadd)
234#define type_pf_del_telem TOKEN(TYPE, PF, _ahash_del_telem)
235#define type_pf_expire TOKEN(TYPE, PF, _expire)
236#define type_pf_tadd TOKEN(TYPE, PF, _tadd)
237#define type_pf_tdel TOKEN(TYPE, PF, _tdel)
238#define type_pf_ttest_cidrs TOKEN(TYPE, PF, _ahash_ttest_cidrs)
239#define type_pf_ttest TOKEN(TYPE, PF, _ahash_ttest)
240
241#define type_pf_resize TOKEN(TYPE, PF, _resize)
242#define type_pf_tresize TOKEN(TYPE, PF, _tresize)
243#define type_pf_flush ip_set_hash_flush
244#define type_pf_destroy ip_set_hash_destroy
245#define type_pf_head TOKEN(TYPE, PF, _head)
246#define type_pf_list TOKEN(TYPE, PF, _list)
247#define type_pf_tlist TOKEN(TYPE, PF, _tlist)
248#define type_pf_same_set TOKEN(TYPE, PF, _same_set)
249#define type_pf_kadt TOKEN(TYPE, PF, _kadt)
250#define type_pf_uadt TOKEN(TYPE, PF, _uadt)
251#define type_pf_gc TOKEN(TYPE, PF, _gc)
252#define type_pf_gc_init TOKEN(TYPE, PF, _gc_init)
253#define type_pf_variant TOKEN(TYPE, PF, _variant)
254#define type_pf_tvariant TOKEN(TYPE, PF, _tvariant)
255
256/* Flavour without timeout */
257
258/* Get the ith element from the array block n */
259#define ahash_data(n, i) \
260 ((struct type_pf_elem *)((n)->value) + (i))
261
262/* Add an element to the hash table when resizing the set:
263 * we spare the maintenance of the internal counters. */
264static int
265type_pf_elem_add(struct hbucket *n, const struct type_pf_elem *value)
266{
267 if (n->pos >= n->size) {
268 void *tmp;
269
270 if (n->size >= AHASH_MAX_SIZE)
271 /* Trigger rehashing */
272 return -EAGAIN;
273
274 tmp = kzalloc((n->size + AHASH_INIT_SIZE)
275 * sizeof(struct type_pf_elem),
276 GFP_ATOMIC);
277 if (!tmp)
278 return -ENOMEM;
279 if (n->size) {
280 memcpy(tmp, n->value,
281 sizeof(struct type_pf_elem) * n->size);
282 kfree(n->value);
283 }
284 n->value = tmp;
285 n->size += AHASH_INIT_SIZE;
286 }
287 type_pf_data_copy(ahash_data(n, n->pos++), value);
288 return 0;
289}
290
291/* Resize a hash: create a new hash table with doubling the hashsize
292 * and inserting the elements to it. Repeat until we succeed or
293 * fail due to memory pressures. */
294static int
295type_pf_resize(struct ip_set *set, bool retried)
296{
297 struct ip_set_hash *h = set->data;
298 struct htable *t, *orig = h->table;
299 u8 htable_bits = orig->htable_bits;
300 const struct type_pf_elem *data;
301 struct hbucket *n, *m;
302 u32 i, j;
303 int ret;
304
305retry:
306 ret = 0;
307 htable_bits++;
308 pr_debug("attempt to resize set %s from %u to %u, t %p\n",
309 set->name, orig->htable_bits, htable_bits, orig);
310 if (!htable_bits)
311 /* In case we have plenty of memory :-) */
312 return -IPSET_ERR_HASH_FULL;
313 t = ip_set_alloc(sizeof(*t)
314 + jhash_size(htable_bits) * sizeof(struct hbucket));
315 if (!t)
316 return -ENOMEM;
317 t->htable_bits = htable_bits;
318
319 read_lock_bh(&set->lock);
320 for (i = 0; i < jhash_size(orig->htable_bits); i++) {
321 n = hbucket(orig, i);
322 for (j = 0; j < n->pos; j++) {
323 data = ahash_data(n, j);
324 m = hbucket(t, HKEY(data, h->initval, htable_bits));
325 ret = type_pf_elem_add(m, data);
326 if (ret < 0) {
327 read_unlock_bh(&set->lock);
328 ahash_destroy(t);
329 if (ret == -EAGAIN)
330 goto retry;
331 return ret;
332 }
333 }
334 }
335
336 rcu_assign_pointer(h->table, t);
337 read_unlock_bh(&set->lock);
338
339 /* Give time to other readers of the set */
340 synchronize_rcu_bh();
341
342 pr_debug("set %s resized from %u (%p) to %u (%p)\n", set->name,
343 orig->htable_bits, orig, t->htable_bits, t);
344 ahash_destroy(orig);
345
346 return 0;
347}
348
349/* Add an element to a hash and update the internal counters when succeeded,
350 * otherwise report the proper error code. */
351static int
352type_pf_add(struct ip_set *set, void *value, u32 timeout)
353{
354 struct ip_set_hash *h = set->data;
355 struct htable *t;
356 const struct type_pf_elem *d = value;
357 struct hbucket *n;
358 int i, ret = 0;
359 u32 key;
360
361 if (h->elements >= h->maxelem)
362 return -IPSET_ERR_HASH_FULL;
363
364 rcu_read_lock_bh();
365 t = rcu_dereference_bh(h->table);
366 key = HKEY(value, h->initval, t->htable_bits);
367 n = hbucket(t, key);
368 for (i = 0; i < n->pos; i++)
369 if (type_pf_data_equal(ahash_data(n, i), d)) {
370 ret = -IPSET_ERR_EXIST;
371 goto out;
372 }
373
374 ret = type_pf_elem_add(n, value);
375 if (ret != 0)
376 goto out;
377
378#ifdef IP_SET_HASH_WITH_NETS
379 add_cidr(h, d->cidr, HOST_MASK);
380#endif
381 h->elements++;
382out:
383 rcu_read_unlock_bh();
384 return ret;
385}
386
387/* Delete an element from the hash: swap it with the last element
388 * and free up space if possible.
389 */
390static int
391type_pf_del(struct ip_set *set, void *value, u32 timeout)
392{
393 struct ip_set_hash *h = set->data;
394 struct htable *t = h->table;
395 const struct type_pf_elem *d = value;
396 struct hbucket *n;
397 int i;
398 struct type_pf_elem *data;
399 u32 key;
400
401 key = HKEY(value, h->initval, t->htable_bits);
402 n = hbucket(t, key);
403 for (i = 0; i < n->pos; i++) {
404 data = ahash_data(n, i);
405 if (!type_pf_data_equal(data, d))
406 continue;
407 if (i != n->pos - 1)
408 /* Not last one */
409 type_pf_data_copy(data, ahash_data(n, n->pos - 1));
410
411 n->pos--;
412 h->elements--;
413#ifdef IP_SET_HASH_WITH_NETS
414 del_cidr(h, d->cidr, HOST_MASK);
415#endif
416 if (n->pos + AHASH_INIT_SIZE < n->size) {
417 void *tmp = kzalloc((n->size - AHASH_INIT_SIZE)
418 * sizeof(struct type_pf_elem),
419 GFP_ATOMIC);
420 if (!tmp)
421 return 0;
422 n->size -= AHASH_INIT_SIZE;
423 memcpy(tmp, n->value,
424 n->size * sizeof(struct type_pf_elem));
425 kfree(n->value);
426 n->value = tmp;
427 }
428 return 0;
429 }
430
431 return -IPSET_ERR_EXIST;
432}
433
434#ifdef IP_SET_HASH_WITH_NETS
435
436/* Special test function which takes into account the different network
437 * sizes added to the set */
438static int
439type_pf_test_cidrs(struct ip_set *set, struct type_pf_elem *d, u32 timeout)
440{
441 struct ip_set_hash *h = set->data;
442 struct htable *t = h->table;
443 struct hbucket *n;
444 const struct type_pf_elem *data;
445 int i, j = 0;
446 u32 key;
447 u8 host_mask = SET_HOST_MASK(set->family);
448
449 pr_debug("test by nets\n");
450 for (; j < host_mask && h->nets[j].cidr; j++) {
451 type_pf_data_netmask(d, h->nets[j].cidr);
452 key = HKEY(d, h->initval, t->htable_bits);
453 n = hbucket(t, key);
454 for (i = 0; i < n->pos; i++) {
455 data = ahash_data(n, i);
456 if (type_pf_data_equal(data, d))
457 return 1;
458 }
459 }
460 return 0;
461}
462#endif
463
464/* Test whether the element is added to the set */
465static int
466type_pf_test(struct ip_set *set, void *value, u32 timeout)
467{
468 struct ip_set_hash *h = set->data;
469 struct htable *t = h->table;
470 struct type_pf_elem *d = value;
471 struct hbucket *n;
472 const struct type_pf_elem *data;
473 int i;
474 u32 key;
475
476#ifdef IP_SET_HASH_WITH_NETS
477 /* If we test an IP address and not a network address,
478 * try all possible network sizes */
479 if (d->cidr == SET_HOST_MASK(set->family))
480 return type_pf_test_cidrs(set, d, timeout);
481#endif
482
483 key = HKEY(d, h->initval, t->htable_bits);
484 n = hbucket(t, key);
485 for (i = 0; i < n->pos; i++) {
486 data = ahash_data(n, i);
487 if (type_pf_data_equal(data, d))
488 return 1;
489 }
490 return 0;
491}
492
493/* Reply a HEADER request: fill out the header part of the set */
494static int
495type_pf_head(struct ip_set *set, struct sk_buff *skb)
496{
497 const struct ip_set_hash *h = set->data;
498 struct nlattr *nested;
499 size_t memsize;
500
501 read_lock_bh(&set->lock);
502 memsize = ahash_memsize(h, with_timeout(h->timeout)
503 ? sizeof(struct type_pf_telem)
504 : sizeof(struct type_pf_elem),
505 set->family == AF_INET ? 32 : 128);
506 read_unlock_bh(&set->lock);
507
508 nested = ipset_nest_start(skb, IPSET_ATTR_DATA);
509 if (!nested)
510 goto nla_put_failure;
511 NLA_PUT_NET32(skb, IPSET_ATTR_HASHSIZE,
512 htonl(jhash_size(h->table->htable_bits)));
513 NLA_PUT_NET32(skb, IPSET_ATTR_MAXELEM, htonl(h->maxelem));
514#ifdef IP_SET_HASH_WITH_NETMASK
515 if (h->netmask != HOST_MASK)
516 NLA_PUT_U8(skb, IPSET_ATTR_NETMASK, h->netmask);
517#endif
518 NLA_PUT_NET32(skb, IPSET_ATTR_REFERENCES,
519 htonl(atomic_read(&set->ref) - 1));
520 NLA_PUT_NET32(skb, IPSET_ATTR_MEMSIZE, htonl(memsize));
521 if (with_timeout(h->timeout))
522 NLA_PUT_NET32(skb, IPSET_ATTR_TIMEOUT, htonl(h->timeout));
523 ipset_nest_end(skb, nested);
524
525 return 0;
526nla_put_failure:
527 return -EMSGSIZE;
528}
529
530/* Reply a LIST/SAVE request: dump the elements of the specified set */
531static int
532type_pf_list(const struct ip_set *set,
533 struct sk_buff *skb, struct netlink_callback *cb)
534{
535 const struct ip_set_hash *h = set->data;
536 const struct htable *t = h->table;
537 struct nlattr *atd, *nested;
538 const struct hbucket *n;
539 const struct type_pf_elem *data;
540 u32 first = cb->args[2];
541 /* We assume that one hash bucket fills into one page */
542 void *incomplete;
543 int i;
544
545 atd = ipset_nest_start(skb, IPSET_ATTR_ADT);
546 if (!atd)
547 return -EMSGSIZE;
548 pr_debug("list hash set %s\n", set->name);
549 for (; cb->args[2] < jhash_size(t->htable_bits); cb->args[2]++) {
550 incomplete = skb_tail_pointer(skb);
551 n = hbucket(t, cb->args[2]);
552 pr_debug("cb->args[2]: %lu, t %p n %p\n", cb->args[2], t, n);
553 for (i = 0; i < n->pos; i++) {
554 data = ahash_data(n, i);
555 pr_debug("list hash %lu hbucket %p i %u, data %p\n",
556 cb->args[2], n, i, data);
557 nested = ipset_nest_start(skb, IPSET_ATTR_DATA);
558 if (!nested) {
559 if (cb->args[2] == first) {
560 nla_nest_cancel(skb, atd);
561 return -EMSGSIZE;
562 } else
563 goto nla_put_failure;
564 }
565 if (type_pf_data_list(skb, data))
566 goto nla_put_failure;
567 ipset_nest_end(skb, nested);
568 }
569 }
570 ipset_nest_end(skb, atd);
571 /* Set listing finished */
572 cb->args[2] = 0;
573
574 return 0;
575
576nla_put_failure:
577 nlmsg_trim(skb, incomplete);
578 ipset_nest_end(skb, atd);
579 if (unlikely(first == cb->args[2])) {
580 pr_warning("Can't list set %s: one bucket does not fit into "
581 "a message. Please report it!\n", set->name);
582 cb->args[2] = 0;
583 return -EMSGSIZE;
584 }
585 return 0;
586}
587
588static int
589type_pf_kadt(struct ip_set *set, const struct sk_buff * skb,
590 enum ipset_adt adt, u8 pf, u8 dim, u8 flags);
591static int
592type_pf_uadt(struct ip_set *set, struct nlattr *tb[],
593 enum ipset_adt adt, u32 *lineno, u32 flags);
594
595static const struct ip_set_type_variant type_pf_variant = {
596 .kadt = type_pf_kadt,
597 .uadt = type_pf_uadt,
598 .adt = {
599 [IPSET_ADD] = type_pf_add,
600 [IPSET_DEL] = type_pf_del,
601 [IPSET_TEST] = type_pf_test,
602 },
603 .destroy = type_pf_destroy,
604 .flush = type_pf_flush,
605 .head = type_pf_head,
606 .list = type_pf_list,
607 .resize = type_pf_resize,
608 .same_set = type_pf_same_set,
609};
610
611/* Flavour with timeout support */
612
613#define ahash_tdata(n, i) \
614 (struct type_pf_elem *)((struct type_pf_telem *)((n)->value) + (i))
615
616static inline u32
617type_pf_data_timeout(const struct type_pf_elem *data)
618{
619 const struct type_pf_telem *tdata =
620 (const struct type_pf_telem *) data;
621
622 return tdata->timeout;
623}
624
625static inline bool
626type_pf_data_expired(const struct type_pf_elem *data)
627{
628 const struct type_pf_telem *tdata =
629 (const struct type_pf_telem *) data;
630
631 return ip_set_timeout_expired(tdata->timeout);
632}
633
634static inline void
635type_pf_data_timeout_set(struct type_pf_elem *data, u32 timeout)
636{
637 struct type_pf_telem *tdata = (struct type_pf_telem *) data;
638
639 tdata->timeout = ip_set_timeout_set(timeout);
640}
641
642static int
643type_pf_elem_tadd(struct hbucket *n, const struct type_pf_elem *value,
644 u32 timeout)
645{
646 struct type_pf_elem *data;
647
648 if (n->pos >= n->size) {
649 void *tmp;
650
651 if (n->size >= AHASH_MAX_SIZE)
652 /* Trigger rehashing */
653 return -EAGAIN;
654
655 tmp = kzalloc((n->size + AHASH_INIT_SIZE)
656 * sizeof(struct type_pf_telem),
657 GFP_ATOMIC);
658 if (!tmp)
659 return -ENOMEM;
660 if (n->size) {
661 memcpy(tmp, n->value,
662 sizeof(struct type_pf_telem) * n->size);
663 kfree(n->value);
664 }
665 n->value = tmp;
666 n->size += AHASH_INIT_SIZE;
667 }
668 data = ahash_tdata(n, n->pos++);
669 type_pf_data_copy(data, value);
670 type_pf_data_timeout_set(data, timeout);
671 return 0;
672}
673
674/* Delete expired elements from the hashtable */
675static void
676type_pf_expire(struct ip_set_hash *h)
677{
678 struct htable *t = h->table;
679 struct hbucket *n;
680 struct type_pf_elem *data;
681 u32 i;
682 int j;
683
684 for (i = 0; i < jhash_size(t->htable_bits); i++) {
685 n = hbucket(t, i);
686 for (j = 0; j < n->pos; j++) {
687 data = ahash_tdata(n, j);
688 if (type_pf_data_expired(data)) {
689 pr_debug("expired %u/%u\n", i, j);
690#ifdef IP_SET_HASH_WITH_NETS
691 del_cidr(h, data->cidr, HOST_MASK);
692#endif
693 if (j != n->pos - 1)
694 /* Not last one */
695 type_pf_data_copy(data,
696 ahash_tdata(n, n->pos - 1));
697 n->pos--;
698 h->elements--;
699 }
700 }
701 if (n->pos + AHASH_INIT_SIZE < n->size) {
702 void *tmp = kzalloc((n->size - AHASH_INIT_SIZE)
703 * sizeof(struct type_pf_telem),
704 GFP_ATOMIC);
705 if (!tmp)
706 /* Still try to delete expired elements */
707 continue;
708 n->size -= AHASH_INIT_SIZE;
709 memcpy(tmp, n->value,
710 n->size * sizeof(struct type_pf_telem));
711 kfree(n->value);
712 n->value = tmp;
713 }
714 }
715}
716
717static int
718type_pf_tresize(struct ip_set *set, bool retried)
719{
720 struct ip_set_hash *h = set->data;
721 struct htable *t, *orig = h->table;
722 u8 htable_bits = orig->htable_bits;
723 const struct type_pf_elem *data;
724 struct hbucket *n, *m;
725 u32 i, j;
726 int ret;
727
728 /* Try to cleanup once */
729 if (!retried) {
730 i = h->elements;
731 write_lock_bh(&set->lock);
732 type_pf_expire(set->data);
733 write_unlock_bh(&set->lock);
734 if (h->elements < i)
735 return 0;
736 }
737
738retry:
739 ret = 0;
740 htable_bits++;
741 if (!htable_bits)
742 /* In case we have plenty of memory :-) */
743 return -IPSET_ERR_HASH_FULL;
744 t = ip_set_alloc(sizeof(*t)
745 + jhash_size(htable_bits) * sizeof(struct hbucket));
746 if (!t)
747 return -ENOMEM;
748 t->htable_bits = htable_bits;
749
750 read_lock_bh(&set->lock);
751 for (i = 0; i < jhash_size(orig->htable_bits); i++) {
752 n = hbucket(orig, i);
753 for (j = 0; j < n->pos; j++) {
754 data = ahash_tdata(n, j);
755 m = hbucket(t, HKEY(data, h->initval, htable_bits));
756 ret = type_pf_elem_tadd(m, data,
757 type_pf_data_timeout(data));
758 if (ret < 0) {
759 read_unlock_bh(&set->lock);
760 ahash_destroy(t);
761 if (ret == -EAGAIN)
762 goto retry;
763 return ret;
764 }
765 }
766 }
767
768 rcu_assign_pointer(h->table, t);
769 read_unlock_bh(&set->lock);
770
771 /* Give time to other readers of the set */
772 synchronize_rcu_bh();
773
774 ahash_destroy(orig);
775
776 return 0;
777}
778
779static int
780type_pf_tadd(struct ip_set *set, void *value, u32 timeout)
781{
782 struct ip_set_hash *h = set->data;
783 struct htable *t = h->table;
784 const struct type_pf_elem *d = value;
785 struct hbucket *n;
786 struct type_pf_elem *data;
787 int ret = 0, i, j = AHASH_MAX_SIZE + 1;
788 u32 key;
789
790 if (h->elements >= h->maxelem)
791 /* FIXME: when set is full, we slow down here */
792 type_pf_expire(h);
793 if (h->elements >= h->maxelem)
794 return -IPSET_ERR_HASH_FULL;
795
796 rcu_read_lock_bh();
797 t = rcu_dereference_bh(h->table);
798 key = HKEY(d, h->initval, t->htable_bits);
799 n = hbucket(t, key);
800 for (i = 0; i < n->pos; i++) {
801 data = ahash_tdata(n, i);
802 if (type_pf_data_equal(data, d)) {
803 if (type_pf_data_expired(data))
804 j = i;
805 else {
806 ret = -IPSET_ERR_EXIST;
807 goto out;
808 }
809 } else if (j == AHASH_MAX_SIZE + 1 &&
810 type_pf_data_expired(data))
811 j = i;
812 }
813 if (j != AHASH_MAX_SIZE + 1) {
814 data = ahash_tdata(n, j);
815#ifdef IP_SET_HASH_WITH_NETS
816 del_cidr(h, data->cidr, HOST_MASK);
817 add_cidr(h, d->cidr, HOST_MASK);
818#endif
819 type_pf_data_copy(data, d);
820 type_pf_data_timeout_set(data, timeout);
821 goto out;
822 }
823 ret = type_pf_elem_tadd(n, d, timeout);
824 if (ret != 0)
825 goto out;
826
827#ifdef IP_SET_HASH_WITH_NETS
828 add_cidr(h, d->cidr, HOST_MASK);
829#endif
830 h->elements++;
831out:
832 rcu_read_unlock_bh();
833 return ret;
834}
835
836static int
837type_pf_tdel(struct ip_set *set, void *value, u32 timeout)
838{
839 struct ip_set_hash *h = set->data;
840 struct htable *t = h->table;
841 const struct type_pf_elem *d = value;
842 struct hbucket *n;
843 int i, ret = 0;
844 struct type_pf_elem *data;
845 u32 key;
846
847 key = HKEY(value, h->initval, t->htable_bits);
848 n = hbucket(t, key);
849 for (i = 0; i < n->pos; i++) {
850 data = ahash_tdata(n, i);
851 if (!type_pf_data_equal(data, d))
852 continue;
853 if (type_pf_data_expired(data))
854 ret = -IPSET_ERR_EXIST;
855 if (i != n->pos - 1)
856 /* Not last one */
857 type_pf_data_copy(data, ahash_tdata(n, n->pos - 1));
858
859 n->pos--;
860 h->elements--;
861#ifdef IP_SET_HASH_WITH_NETS
862 del_cidr(h, d->cidr, HOST_MASK);
863#endif
864 if (n->pos + AHASH_INIT_SIZE < n->size) {
865 void *tmp = kzalloc((n->size - AHASH_INIT_SIZE)
866 * sizeof(struct type_pf_telem),
867 GFP_ATOMIC);
868 if (!tmp)
869 return 0;
870 n->size -= AHASH_INIT_SIZE;
871 memcpy(tmp, n->value,
872 n->size * sizeof(struct type_pf_telem));
873 kfree(n->value);
874 n->value = tmp;
875 }
876 return 0;
877 }
878
879 return -IPSET_ERR_EXIST;
880}
881
882#ifdef IP_SET_HASH_WITH_NETS
883static int
884type_pf_ttest_cidrs(struct ip_set *set, struct type_pf_elem *d, u32 timeout)
885{
886 struct ip_set_hash *h = set->data;
887 struct htable *t = h->table;
888 struct type_pf_elem *data;
889 struct hbucket *n;
890 int i, j = 0;
891 u32 key;
892 u8 host_mask = SET_HOST_MASK(set->family);
893
894 for (; j < host_mask && h->nets[j].cidr; j++) {
895 type_pf_data_netmask(d, h->nets[j].cidr);
896 key = HKEY(d, h->initval, t->htable_bits);
897 n = hbucket(t, key);
898 for (i = 0; i < n->pos; i++) {
899 data = ahash_tdata(n, i);
900 if (type_pf_data_equal(data, d))
901 return !type_pf_data_expired(data);
902 }
903 }
904 return 0;
905}
906#endif
907
908static int
909type_pf_ttest(struct ip_set *set, void *value, u32 timeout)
910{
911 struct ip_set_hash *h = set->data;
912 struct htable *t = h->table;
913 struct type_pf_elem *data, *d = value;
914 struct hbucket *n;
915 int i;
916 u32 key;
917
918#ifdef IP_SET_HASH_WITH_NETS
919 if (d->cidr == SET_HOST_MASK(set->family))
920 return type_pf_ttest_cidrs(set, d, timeout);
921#endif
922 key = HKEY(d, h->initval, t->htable_bits);
923 n = hbucket(t, key);
924 for (i = 0; i < n->pos; i++) {
925 data = ahash_tdata(n, i);
926 if (type_pf_data_equal(data, d))
927 return !type_pf_data_expired(data);
928 }
929 return 0;
930}
931
932static int
933type_pf_tlist(const struct ip_set *set,
934 struct sk_buff *skb, struct netlink_callback *cb)
935{
936 const struct ip_set_hash *h = set->data;
937 const struct htable *t = h->table;
938 struct nlattr *atd, *nested;
939 const struct hbucket *n;
940 const struct type_pf_elem *data;
941 u32 first = cb->args[2];
942 /* We assume that one hash bucket fills into one page */
943 void *incomplete;
944 int i;
945
946 atd = ipset_nest_start(skb, IPSET_ATTR_ADT);
947 if (!atd)
948 return -EMSGSIZE;
949 for (; cb->args[2] < jhash_size(t->htable_bits); cb->args[2]++) {
950 incomplete = skb_tail_pointer(skb);
951 n = hbucket(t, cb->args[2]);
952 for (i = 0; i < n->pos; i++) {
953 data = ahash_tdata(n, i);
954 pr_debug("list %p %u\n", n, i);
955 if (type_pf_data_expired(data))
956 continue;
957 pr_debug("do list %p %u\n", n, i);
958 nested = ipset_nest_start(skb, IPSET_ATTR_DATA);
959 if (!nested) {
960 if (cb->args[2] == first) {
961 nla_nest_cancel(skb, atd);
962 return -EMSGSIZE;
963 } else
964 goto nla_put_failure;
965 }
966 if (type_pf_data_tlist(skb, data))
967 goto nla_put_failure;
968 ipset_nest_end(skb, nested);
969 }
970 }
971 ipset_nest_end(skb, atd);
972 /* Set listing finished */
973 cb->args[2] = 0;
974
975 return 0;
976
977nla_put_failure:
978 nlmsg_trim(skb, incomplete);
979 ipset_nest_end(skb, atd);
980 if (unlikely(first == cb->args[2])) {
981 pr_warning("Can't list set %s: one bucket does not fit into "
982 "a message. Please report it!\n", set->name);
983 cb->args[2] = 0;
984 return -EMSGSIZE;
985 }
986 return 0;
987}
988
989static const struct ip_set_type_variant type_pf_tvariant = {
990 .kadt = type_pf_kadt,
991 .uadt = type_pf_uadt,
992 .adt = {
993 [IPSET_ADD] = type_pf_tadd,
994 [IPSET_DEL] = type_pf_tdel,
995 [IPSET_TEST] = type_pf_ttest,
996 },
997 .destroy = type_pf_destroy,
998 .flush = type_pf_flush,
999 .head = type_pf_head,
1000 .list = type_pf_tlist,
1001 .resize = type_pf_tresize,
1002 .same_set = type_pf_same_set,
1003};
1004
1005static void
1006type_pf_gc(unsigned long ul_set)
1007{
1008 struct ip_set *set = (struct ip_set *) ul_set;
1009 struct ip_set_hash *h = set->data;
1010
1011 pr_debug("called\n");
1012 write_lock_bh(&set->lock);
1013 type_pf_expire(h);
1014 write_unlock_bh(&set->lock);
1015
1016 h->gc.expires = jiffies + IPSET_GC_PERIOD(h->timeout) * HZ;
1017 add_timer(&h->gc);
1018}
1019
1020static void
1021type_pf_gc_init(struct ip_set *set)
1022{
1023 struct ip_set_hash *h = set->data;
1024
1025 init_timer(&h->gc);
1026 h->gc.data = (unsigned long) set;
1027 h->gc.function = type_pf_gc;
1028 h->gc.expires = jiffies + IPSET_GC_PERIOD(h->timeout) * HZ;
1029 add_timer(&h->gc);
1030 pr_debug("gc initialized, run in every %u\n",
1031 IPSET_GC_PERIOD(h->timeout));
1032}
1033
1034#undef type_pf_data_equal
1035#undef type_pf_data_isnull
1036#undef type_pf_data_copy
1037#undef type_pf_data_zero_out
1038#undef type_pf_data_list
1039#undef type_pf_data_tlist
1040
1041#undef type_pf_elem
1042#undef type_pf_telem
1043#undef type_pf_data_timeout
1044#undef type_pf_data_expired
1045#undef type_pf_data_netmask
1046#undef type_pf_data_timeout_set
1047
1048#undef type_pf_elem_add
1049#undef type_pf_add
1050#undef type_pf_del
1051#undef type_pf_test_cidrs
1052#undef type_pf_test
1053
1054#undef type_pf_elem_tadd
1055#undef type_pf_expire
1056#undef type_pf_tadd
1057#undef type_pf_tdel
1058#undef type_pf_ttest_cidrs
1059#undef type_pf_ttest
1060
1061#undef type_pf_resize
1062#undef type_pf_tresize
1063#undef type_pf_flush
1064#undef type_pf_destroy
1065#undef type_pf_head
1066#undef type_pf_list
1067#undef type_pf_tlist
1068#undef type_pf_same_set
1069#undef type_pf_kadt
1070#undef type_pf_uadt
1071#undef type_pf_gc
1072#undef type_pf_gc_init
1073#undef type_pf_variant
1074#undef type_pf_tvariant
diff --git a/include/linux/netfilter/ipset/ip_set_bitmap.h b/include/linux/netfilter/ipset/ip_set_bitmap.h
new file mode 100644
index 000000000000..61a9e8746c83
--- /dev/null
+++ b/include/linux/netfilter/ipset/ip_set_bitmap.h
@@ -0,0 +1,31 @@
1#ifndef __IP_SET_BITMAP_H
2#define __IP_SET_BITMAP_H
3
4/* Bitmap type specific error codes */
5enum {
6 /* The element is out of the range of the set */
7 IPSET_ERR_BITMAP_RANGE = IPSET_ERR_TYPE_SPECIFIC,
8 /* The range exceeds the size limit of the set type */
9 IPSET_ERR_BITMAP_RANGE_SIZE,
10};
11
12#ifdef __KERNEL__
13#define IPSET_BITMAP_MAX_RANGE 0x0000FFFF
14
15/* Common functions */
16
17static inline u32
18range_to_mask(u32 from, u32 to, u8 *bits)
19{
20 u32 mask = 0xFFFFFFFE;
21
22 *bits = 32;
23 while (--(*bits) > 0 && mask && (to & mask) != from)
24 mask <<= 1;
25
26 return mask;
27}
28
29#endif /* __KERNEL__ */
30
31#endif /* __IP_SET_BITMAP_H */
diff --git a/include/linux/netfilter/ipset/ip_set_getport.h b/include/linux/netfilter/ipset/ip_set_getport.h
new file mode 100644
index 000000000000..3882a81a3b3c
--- /dev/null
+++ b/include/linux/netfilter/ipset/ip_set_getport.h
@@ -0,0 +1,21 @@
1#ifndef _IP_SET_GETPORT_H
2#define _IP_SET_GETPORT_H
3
4extern bool ip_set_get_ip4_port(const struct sk_buff *skb, bool src,
5 __be16 *port, u8 *proto);
6
7#if defined(CONFIG_IP6_NF_IPTABLES) || defined(CONFIG_IP6_NF_IPTABLES_MODULE)
8extern bool ip_set_get_ip6_port(const struct sk_buff *skb, bool src,
9 __be16 *port, u8 *proto);
10#else
11static inline bool ip_set_get_ip6_port(const struct sk_buff *skb, bool src,
12 __be16 *port, u8 *proto)
13{
14 return false;
15}
16#endif
17
18extern bool ip_set_get_ip_port(const struct sk_buff *skb, u8 pf, bool src,
19 __be16 *port);
20
21#endif /*_IP_SET_GETPORT_H*/
diff --git a/include/linux/netfilter/ipset/ip_set_hash.h b/include/linux/netfilter/ipset/ip_set_hash.h
new file mode 100644
index 000000000000..b86f15c04524
--- /dev/null
+++ b/include/linux/netfilter/ipset/ip_set_hash.h
@@ -0,0 +1,26 @@
1#ifndef __IP_SET_HASH_H
2#define __IP_SET_HASH_H
3
4/* Hash type specific error codes */
5enum {
6 /* Hash is full */
7 IPSET_ERR_HASH_FULL = IPSET_ERR_TYPE_SPECIFIC,
8 /* Null-valued element */
9 IPSET_ERR_HASH_ELEM,
10 /* Invalid protocol */
11 IPSET_ERR_INVALID_PROTO,
12 /* Protocol missing but must be specified */
13 IPSET_ERR_MISSING_PROTO,
14};
15
16#ifdef __KERNEL__
17
18#define IPSET_DEFAULT_HASHSIZE 1024
19#define IPSET_MIMINAL_HASHSIZE 64
20#define IPSET_DEFAULT_MAXELEM 65536
21#define IPSET_DEFAULT_PROBES 4
22#define IPSET_DEFAULT_RESIZE 100
23
24#endif /* __KERNEL__ */
25
26#endif /* __IP_SET_HASH_H */
diff --git a/include/linux/netfilter/ipset/ip_set_list.h b/include/linux/netfilter/ipset/ip_set_list.h
new file mode 100644
index 000000000000..40a63f302613
--- /dev/null
+++ b/include/linux/netfilter/ipset/ip_set_list.h
@@ -0,0 +1,27 @@
1#ifndef __IP_SET_LIST_H
2#define __IP_SET_LIST_H
3
4/* List type specific error codes */
5enum {
6 /* Set name to be added/deleted/tested does not exist. */
7 IPSET_ERR_NAME = IPSET_ERR_TYPE_SPECIFIC,
8 /* list:set type is not permitted to add */
9 IPSET_ERR_LOOP,
10 /* Missing reference set */
11 IPSET_ERR_BEFORE,
12 /* Reference set does not exist */
13 IPSET_ERR_NAMEREF,
14 /* Set is full */
15 IPSET_ERR_LIST_FULL,
16 /* Reference set is not added to the set */
17 IPSET_ERR_REF_EXIST,
18};
19
20#ifdef __KERNEL__
21
22#define IP_SET_LIST_DEFAULT_SIZE 8
23#define IP_SET_LIST_MIN_SIZE 4
24
25#endif /* __KERNEL__ */
26
27#endif /* __IP_SET_LIST_H */
diff --git a/include/linux/netfilter/ipset/ip_set_timeout.h b/include/linux/netfilter/ipset/ip_set_timeout.h
new file mode 100644
index 000000000000..9f30c5f2ec1c
--- /dev/null
+++ b/include/linux/netfilter/ipset/ip_set_timeout.h
@@ -0,0 +1,127 @@
1#ifndef _IP_SET_TIMEOUT_H
2#define _IP_SET_TIMEOUT_H
3
4/* Copyright (C) 2003-2011 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 */
10
11#ifdef __KERNEL__
12
13/* How often should the gc be run by default */
14#define IPSET_GC_TIME (3 * 60)
15
16/* Timeout period depending on the timeout value of the given set */
17#define IPSET_GC_PERIOD(timeout) \
18 ((timeout/3) ? min_t(u32, (timeout)/3, IPSET_GC_TIME) : 1)
19
20/* Set is defined without timeout support: timeout value may be 0 */
21#define IPSET_NO_TIMEOUT UINT_MAX
22
23#define with_timeout(timeout) ((timeout) != IPSET_NO_TIMEOUT)
24
25static inline unsigned int
26ip_set_timeout_uget(struct nlattr *tb)
27{
28 unsigned int timeout = ip_set_get_h32(tb);
29
30 /* Userspace supplied TIMEOUT parameter: adjust crazy size */
31 return timeout == IPSET_NO_TIMEOUT ? IPSET_NO_TIMEOUT - 1 : timeout;
32}
33
34#ifdef IP_SET_BITMAP_TIMEOUT
35
36/* Bitmap specific timeout constants and macros for the entries */
37
38/* Bitmap entry is unset */
39#define IPSET_ELEM_UNSET 0
40/* Bitmap entry is set with no timeout value */
41#define IPSET_ELEM_PERMANENT (UINT_MAX/2)
42
43static inline bool
44ip_set_timeout_test(unsigned long timeout)
45{
46 return timeout != IPSET_ELEM_UNSET &&
47 (timeout == IPSET_ELEM_PERMANENT ||
48 time_after(timeout, jiffies));
49}
50
51static inline bool
52ip_set_timeout_expired(unsigned long timeout)
53{
54 return timeout != IPSET_ELEM_UNSET &&
55 timeout != IPSET_ELEM_PERMANENT &&
56 time_before(timeout, jiffies);
57}
58
59static inline unsigned long
60ip_set_timeout_set(u32 timeout)
61{
62 unsigned long t;
63
64 if (!timeout)
65 return IPSET_ELEM_PERMANENT;
66
67 t = timeout * HZ + jiffies;
68 if (t == IPSET_ELEM_UNSET || t == IPSET_ELEM_PERMANENT)
69 /* Bingo! */
70 t++;
71
72 return t;
73}
74
75static inline u32
76ip_set_timeout_get(unsigned long timeout)
77{
78 return timeout == IPSET_ELEM_PERMANENT ? 0 : (timeout - jiffies)/HZ;
79}
80
81#else
82
83/* Hash specific timeout constants and macros for the entries */
84
85/* Hash entry is set with no timeout value */
86#define IPSET_ELEM_PERMANENT 0
87
88static inline bool
89ip_set_timeout_test(unsigned long timeout)
90{
91 return timeout == IPSET_ELEM_PERMANENT ||
92 time_after(timeout, jiffies);
93}
94
95static inline bool
96ip_set_timeout_expired(unsigned long timeout)
97{
98 return timeout != IPSET_ELEM_PERMANENT &&
99 time_before(timeout, jiffies);
100}
101
102static inline unsigned long
103ip_set_timeout_set(u32 timeout)
104{
105 unsigned long t;
106
107 if (!timeout)
108 return IPSET_ELEM_PERMANENT;
109
110 t = timeout * HZ + jiffies;
111 if (t == IPSET_ELEM_PERMANENT)
112 /* Bingo! :-) */
113 t++;
114
115 return t;
116}
117
118static inline u32
119ip_set_timeout_get(unsigned long timeout)
120{
121 return timeout == IPSET_ELEM_PERMANENT ? 0 : (timeout - jiffies)/HZ;
122}
123#endif /* ! IP_SET_BITMAP_TIMEOUT */
124
125#endif /* __KERNEL__ */
126
127#endif /* _IP_SET_TIMEOUT_H */
diff --git a/include/linux/netfilter/ipset/pfxlen.h b/include/linux/netfilter/ipset/pfxlen.h
new file mode 100644
index 000000000000..0e1fb50da562
--- /dev/null
+++ b/include/linux/netfilter/ipset/pfxlen.h
@@ -0,0 +1,35 @@
1#ifndef _PFXLEN_H
2#define _PFXLEN_H
3
4#include <asm/byteorder.h>
5#include <linux/netfilter.h>
6
7/* Prefixlen maps, by Jan Engelhardt */
8extern const union nf_inet_addr ip_set_netmask_map[];
9extern const union nf_inet_addr ip_set_hostmask_map[];
10
11static inline __be32
12ip_set_netmask(u8 pfxlen)
13{
14 return ip_set_netmask_map[pfxlen].ip;
15}
16
17static inline const __be32 *
18ip_set_netmask6(u8 pfxlen)
19{
20 return &ip_set_netmask_map[pfxlen].ip6[0];
21}
22
23static inline u32
24ip_set_hostmask(u8 pfxlen)
25{
26 return (__force u32) ip_set_hostmask_map[pfxlen].ip;
27}
28
29static inline const __be32 *
30ip_set_hostmask6(u8 pfxlen)
31{
32 return &ip_set_hostmask_map[pfxlen].ip6[0];
33}
34
35#endif /*_PFXLEN_H */
diff --git a/include/linux/netfilter/nf_conntrack_snmp.h b/include/linux/netfilter/nf_conntrack_snmp.h
new file mode 100644
index 000000000000..064bc63a5346
--- /dev/null
+++ b/include/linux/netfilter/nf_conntrack_snmp.h
@@ -0,0 +1,9 @@
1#ifndef _NF_CONNTRACK_SNMP_H
2#define _NF_CONNTRACK_SNMP_H
3
4extern int (*nf_nat_snmp_hook)(struct sk_buff *skb,
5 unsigned int protoff,
6 struct nf_conn *ct,
7 enum ip_conntrack_info ctinfo);
8
9#endif /* _NF_CONNTRACK_SNMP_H */
diff --git a/include/linux/netfilter/nfnetlink.h b/include/linux/netfilter/nfnetlink.h
index 361d6b5630ee..2b11fc1a86be 100644
--- a/include/linux/netfilter/nfnetlink.h
+++ b/include/linux/netfilter/nfnetlink.h
@@ -47,7 +47,8 @@ struct nfgenmsg {
47#define NFNL_SUBSYS_QUEUE 3 47#define NFNL_SUBSYS_QUEUE 3
48#define NFNL_SUBSYS_ULOG 4 48#define NFNL_SUBSYS_ULOG 4
49#define NFNL_SUBSYS_OSF 5 49#define NFNL_SUBSYS_OSF 5
50#define NFNL_SUBSYS_COUNT 6 50#define NFNL_SUBSYS_IPSET 6
51#define NFNL_SUBSYS_COUNT 7
51 52
52#ifdef __KERNEL__ 53#ifdef __KERNEL__
53 54
diff --git a/include/linux/netfilter/nfnetlink_conntrack.h b/include/linux/netfilter/nfnetlink_conntrack.h
index 19711e3ffd42..debf1aefd753 100644
--- a/include/linux/netfilter/nfnetlink_conntrack.h
+++ b/include/linux/netfilter/nfnetlink_conntrack.h
@@ -42,6 +42,7 @@ enum ctattr_type {
42 CTA_SECMARK, /* obsolete */ 42 CTA_SECMARK, /* obsolete */
43 CTA_ZONE, 43 CTA_ZONE,
44 CTA_SECCTX, 44 CTA_SECCTX,
45 CTA_TIMESTAMP,
45 __CTA_MAX 46 __CTA_MAX
46}; 47};
47#define CTA_MAX (__CTA_MAX - 1) 48#define CTA_MAX (__CTA_MAX - 1)
@@ -127,6 +128,14 @@ enum ctattr_counters {
127}; 128};
128#define CTA_COUNTERS_MAX (__CTA_COUNTERS_MAX - 1) 129#define CTA_COUNTERS_MAX (__CTA_COUNTERS_MAX - 1)
129 130
131enum ctattr_tstamp {
132 CTA_TIMESTAMP_UNSPEC,
133 CTA_TIMESTAMP_START,
134 CTA_TIMESTAMP_STOP,
135 __CTA_TIMESTAMP_MAX
136};
137#define CTA_TIMESTAMP_MAX (__CTA_TIMESTAMP_MAX - 1)
138
130enum ctattr_nat { 139enum ctattr_nat {
131 CTA_NAT_UNSPEC, 140 CTA_NAT_UNSPEC,
132 CTA_NAT_MINIP, 141 CTA_NAT_MINIP,
diff --git a/include/linux/netfilter/x_tables.h b/include/linux/netfilter/x_tables.h
index 6712e713b299..37219525ff6f 100644
--- a/include/linux/netfilter/x_tables.h
+++ b/include/linux/netfilter/x_tables.h
@@ -611,8 +611,9 @@ struct _compat_xt_align {
611extern void xt_compat_lock(u_int8_t af); 611extern void xt_compat_lock(u_int8_t af);
612extern void xt_compat_unlock(u_int8_t af); 612extern void xt_compat_unlock(u_int8_t af);
613 613
614extern int xt_compat_add_offset(u_int8_t af, unsigned int offset, short delta); 614extern int xt_compat_add_offset(u_int8_t af, unsigned int offset, int delta);
615extern void xt_compat_flush_offsets(u_int8_t af); 615extern void xt_compat_flush_offsets(u_int8_t af);
616extern void xt_compat_init_offsets(u_int8_t af, unsigned int number);
616extern int xt_compat_calc_jump(u_int8_t af, unsigned int offset); 617extern int xt_compat_calc_jump(u_int8_t af, unsigned int offset);
617 618
618extern int xt_compat_match_offset(const struct xt_match *match); 619extern int xt_compat_match_offset(const struct xt_match *match);
diff --git a/include/linux/netfilter/xt_AUDIT.h b/include/linux/netfilter/xt_AUDIT.h
new file mode 100644
index 000000000000..38751d2ea52b
--- /dev/null
+++ b/include/linux/netfilter/xt_AUDIT.h
@@ -0,0 +1,30 @@
1/*
2 * Header file for iptables xt_AUDIT target
3 *
4 * (C) 2010-2011 Thomas Graf <tgraf@redhat.com>
5 * (C) 2010-2011 Red Hat, Inc.
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 */
11
12#ifndef _XT_AUDIT_TARGET_H
13#define _XT_AUDIT_TARGET_H
14
15#include <linux/types.h>
16
17enum {
18 XT_AUDIT_TYPE_ACCEPT = 0,
19 XT_AUDIT_TYPE_DROP,
20 XT_AUDIT_TYPE_REJECT,
21 __XT_AUDIT_TYPE_MAX,
22};
23
24#define XT_AUDIT_TYPE_MAX (__XT_AUDIT_TYPE_MAX - 1)
25
26struct xt_audit_info {
27 __u8 type; /* XT_AUDIT_TYPE_* */
28};
29
30#endif /* _XT_AUDIT_TARGET_H */
diff --git a/include/linux/netfilter/xt_CT.h b/include/linux/netfilter/xt_CT.h
index 1b564106891d..b56e76811c04 100644
--- a/include/linux/netfilter/xt_CT.h
+++ b/include/linux/netfilter/xt_CT.h
@@ -1,14 +1,16 @@
1#ifndef _XT_CT_H 1#ifndef _XT_CT_H
2#define _XT_CT_H 2#define _XT_CT_H
3 3
4#include <linux/types.h>
5
4#define XT_CT_NOTRACK 0x1 6#define XT_CT_NOTRACK 0x1
5 7
6struct xt_ct_target_info { 8struct xt_ct_target_info {
7 u_int16_t flags; 9 __u16 flags;
8 u_int16_t zone; 10 __u16 zone;
9 u_int32_t ct_events; 11 __u32 ct_events;
10 u_int32_t exp_events; 12 __u32 exp_events;
11 char helper[16]; 13 char helper[16];
12 14
13 /* Used internally by the kernel */ 15 /* Used internally by the kernel */
14 struct nf_conn *ct __attribute__((aligned(8))); 16 struct nf_conn *ct __attribute__((aligned(8)));
diff --git a/include/linux/netfilter/xt_NFQUEUE.h b/include/linux/netfilter/xt_NFQUEUE.h
index 2584f4a777de..9eafdbbb401c 100644
--- a/include/linux/netfilter/xt_NFQUEUE.h
+++ b/include/linux/netfilter/xt_NFQUEUE.h
@@ -20,4 +20,10 @@ struct xt_NFQ_info_v1 {
20 __u16 queues_total; 20 __u16 queues_total;
21}; 21};
22 22
23struct xt_NFQ_info_v2 {
24 __u16 queuenum;
25 __u16 queues_total;
26 __u16 bypass;
27};
28
23#endif /* _XT_NFQ_TARGET_H */ 29#endif /* _XT_NFQ_TARGET_H */
diff --git a/include/linux/netfilter/xt_TCPOPTSTRIP.h b/include/linux/netfilter/xt_TCPOPTSTRIP.h
index 2db543214ff5..7157318499c2 100644
--- a/include/linux/netfilter/xt_TCPOPTSTRIP.h
+++ b/include/linux/netfilter/xt_TCPOPTSTRIP.h
@@ -1,13 +1,15 @@
1#ifndef _XT_TCPOPTSTRIP_H 1#ifndef _XT_TCPOPTSTRIP_H
2#define _XT_TCPOPTSTRIP_H 2#define _XT_TCPOPTSTRIP_H
3 3
4#include <linux/types.h>
5
4#define tcpoptstrip_set_bit(bmap, idx) \ 6#define tcpoptstrip_set_bit(bmap, idx) \
5 (bmap[(idx) >> 5] |= 1U << (idx & 31)) 7 (bmap[(idx) >> 5] |= 1U << (idx & 31))
6#define tcpoptstrip_test_bit(bmap, idx) \ 8#define tcpoptstrip_test_bit(bmap, idx) \
7 (((1U << (idx & 31)) & bmap[(idx) >> 5]) != 0) 9 (((1U << (idx & 31)) & bmap[(idx) >> 5]) != 0)
8 10
9struct xt_tcpoptstrip_target_info { 11struct xt_tcpoptstrip_target_info {
10 u_int32_t strip_bmap[8]; 12 __u32 strip_bmap[8];
11}; 13};
12 14
13#endif /* _XT_TCPOPTSTRIP_H */ 15#endif /* _XT_TCPOPTSTRIP_H */
diff --git a/include/linux/netfilter/xt_TPROXY.h b/include/linux/netfilter/xt_TPROXY.h
index 3f3d69361289..902043c2073f 100644
--- a/include/linux/netfilter/xt_TPROXY.h
+++ b/include/linux/netfilter/xt_TPROXY.h
@@ -1,19 +1,21 @@
1#ifndef _XT_TPROXY_H 1#ifndef _XT_TPROXY_H
2#define _XT_TPROXY_H 2#define _XT_TPROXY_H
3 3
4#include <linux/types.h>
5
4/* TPROXY target is capable of marking the packet to perform 6/* TPROXY target is capable of marking the packet to perform
5 * redirection. We can get rid of that whenever we get support for 7 * redirection. We can get rid of that whenever we get support for
6 * mutliple targets in the same rule. */ 8 * mutliple targets in the same rule. */
7struct xt_tproxy_target_info { 9struct xt_tproxy_target_info {
8 u_int32_t mark_mask; 10 __u32 mark_mask;
9 u_int32_t mark_value; 11 __u32 mark_value;
10 __be32 laddr; 12 __be32 laddr;
11 __be16 lport; 13 __be16 lport;
12}; 14};
13 15
14struct xt_tproxy_target_info_v1 { 16struct xt_tproxy_target_info_v1 {
15 u_int32_t mark_mask; 17 __u32 mark_mask;
16 u_int32_t mark_value; 18 __u32 mark_value;
17 union nf_inet_addr laddr; 19 union nf_inet_addr laddr;
18 __be16 lport; 20 __be16 lport;
19}; 21};
diff --git a/include/linux/netfilter/xt_addrtype.h b/include/linux/netfilter/xt_addrtype.h
new file mode 100644
index 000000000000..b156baa9d55e
--- /dev/null
+++ b/include/linux/netfilter/xt_addrtype.h
@@ -0,0 +1,44 @@
1#ifndef _XT_ADDRTYPE_H
2#define _XT_ADDRTYPE_H
3
4#include <linux/types.h>
5
6enum {
7 XT_ADDRTYPE_INVERT_SOURCE = 0x0001,
8 XT_ADDRTYPE_INVERT_DEST = 0x0002,
9 XT_ADDRTYPE_LIMIT_IFACE_IN = 0x0004,
10 XT_ADDRTYPE_LIMIT_IFACE_OUT = 0x0008,
11};
12
13
14/* rtn_type enum values from rtnetlink.h, but shifted */
15enum {
16 XT_ADDRTYPE_UNSPEC = 1 << 0,
17 XT_ADDRTYPE_UNICAST = 1 << 1, /* 1 << RTN_UNICAST */
18 XT_ADDRTYPE_LOCAL = 1 << 2, /* 1 << RTN_LOCAL, etc */
19 XT_ADDRTYPE_BROADCAST = 1 << 3,
20 XT_ADDRTYPE_ANYCAST = 1 << 4,
21 XT_ADDRTYPE_MULTICAST = 1 << 5,
22 XT_ADDRTYPE_BLACKHOLE = 1 << 6,
23 XT_ADDRTYPE_UNREACHABLE = 1 << 7,
24 XT_ADDRTYPE_PROHIBIT = 1 << 8,
25 XT_ADDRTYPE_THROW = 1 << 9,
26 XT_ADDRTYPE_NAT = 1 << 10,
27 XT_ADDRTYPE_XRESOLVE = 1 << 11,
28};
29
30struct xt_addrtype_info_v1 {
31 __u16 source; /* source-type mask */
32 __u16 dest; /* dest-type mask */
33 __u32 flags;
34};
35
36/* revision 0 */
37struct xt_addrtype_info {
38 __u16 source; /* source-type mask */
39 __u16 dest; /* dest-type mask */
40 __u32 invert_source;
41 __u32 invert_dest;
42};
43
44#endif
diff --git a/include/linux/netfilter/xt_cluster.h b/include/linux/netfilter/xt_cluster.h
index 886682656f09..9b883c8fbf54 100644
--- a/include/linux/netfilter/xt_cluster.h
+++ b/include/linux/netfilter/xt_cluster.h
@@ -1,15 +1,17 @@
1#ifndef _XT_CLUSTER_MATCH_H 1#ifndef _XT_CLUSTER_MATCH_H
2#define _XT_CLUSTER_MATCH_H 2#define _XT_CLUSTER_MATCH_H
3 3
4#include <linux/types.h>
5
4enum xt_cluster_flags { 6enum xt_cluster_flags {
5 XT_CLUSTER_F_INV = (1 << 0) 7 XT_CLUSTER_F_INV = (1 << 0)
6}; 8};
7 9
8struct xt_cluster_match_info { 10struct xt_cluster_match_info {
9 u_int32_t total_nodes; 11 __u32 total_nodes;
10 u_int32_t node_mask; 12 __u32 node_mask;
11 u_int32_t hash_seed; 13 __u32 hash_seed;
12 u_int32_t flags; 14 __u32 flags;
13}; 15};
14 16
15#define XT_CLUSTER_NODES_MAX 32 17#define XT_CLUSTER_NODES_MAX 32
diff --git a/include/linux/netfilter/xt_comment.h b/include/linux/netfilter/xt_comment.h
index eacfedc6b5d0..0ea5e79f5bd7 100644
--- a/include/linux/netfilter/xt_comment.h
+++ b/include/linux/netfilter/xt_comment.h
@@ -4,7 +4,7 @@
4#define XT_MAX_COMMENT_LEN 256 4#define XT_MAX_COMMENT_LEN 256
5 5
6struct xt_comment_info { 6struct xt_comment_info {
7 unsigned char comment[XT_MAX_COMMENT_LEN]; 7 char comment[XT_MAX_COMMENT_LEN];
8}; 8};
9 9
10#endif /* XT_COMMENT_H */ 10#endif /* XT_COMMENT_H */
diff --git a/include/linux/netfilter/xt_connlimit.h b/include/linux/netfilter/xt_connlimit.h
index 7e3284bcbd2b..0ca66e97acbc 100644
--- a/include/linux/netfilter/xt_connlimit.h
+++ b/include/linux/netfilter/xt_connlimit.h
@@ -1,8 +1,15 @@
1#ifndef _XT_CONNLIMIT_H 1#ifndef _XT_CONNLIMIT_H
2#define _XT_CONNLIMIT_H 2#define _XT_CONNLIMIT_H
3 3
4#include <linux/types.h>
5
4struct xt_connlimit_data; 6struct xt_connlimit_data;
5 7
8enum {
9 XT_CONNLIMIT_INVERT = 1 << 0,
10 XT_CONNLIMIT_DADDR = 1 << 1,
11};
12
6struct xt_connlimit_info { 13struct xt_connlimit_info {
7 union { 14 union {
8 union nf_inet_addr mask; 15 union nf_inet_addr mask;
@@ -13,7 +20,14 @@ struct xt_connlimit_info {
13 }; 20 };
14#endif 21#endif
15 }; 22 };
16 unsigned int limit, inverse; 23 unsigned int limit;
24 union {
25 /* revision 0 */
26 unsigned int inverse;
27
28 /* revision 1 */
29 __u32 flags;
30 };
17 31
18 /* Used internally by the kernel */ 32 /* Used internally by the kernel */
19 struct xt_connlimit_data *data __attribute__((aligned(8))); 33 struct xt_connlimit_data *data __attribute__((aligned(8)));
diff --git a/include/linux/netfilter/xt_conntrack.h b/include/linux/netfilter/xt_conntrack.h
index 54f47a2f6152..74b904d8f99c 100644
--- a/include/linux/netfilter/xt_conntrack.h
+++ b/include/linux/netfilter/xt_conntrack.h
@@ -58,4 +58,19 @@ struct xt_conntrack_mtinfo2 {
58 __u16 state_mask, status_mask; 58 __u16 state_mask, status_mask;
59}; 59};
60 60
61struct xt_conntrack_mtinfo3 {
62 union nf_inet_addr origsrc_addr, origsrc_mask;
63 union nf_inet_addr origdst_addr, origdst_mask;
64 union nf_inet_addr replsrc_addr, replsrc_mask;
65 union nf_inet_addr repldst_addr, repldst_mask;
66 __u32 expires_min, expires_max;
67 __u16 l4proto;
68 __u16 origsrc_port, origdst_port;
69 __u16 replsrc_port, repldst_port;
70 __u16 match_flags, invert_flags;
71 __u16 state_mask, status_mask;
72 __u16 origsrc_port_high, origdst_port_high;
73 __u16 replsrc_port_high, repldst_port_high;
74};
75
61#endif /*_XT_CONNTRACK_H*/ 76#endif /*_XT_CONNTRACK_H*/
diff --git a/include/linux/netfilter/xt_devgroup.h b/include/linux/netfilter/xt_devgroup.h
new file mode 100644
index 000000000000..1babde0ec900
--- /dev/null
+++ b/include/linux/netfilter/xt_devgroup.h
@@ -0,0 +1,21 @@
1#ifndef _XT_DEVGROUP_H
2#define _XT_DEVGROUP_H
3
4#include <linux/types.h>
5
6enum xt_devgroup_flags {
7 XT_DEVGROUP_MATCH_SRC = 0x1,
8 XT_DEVGROUP_INVERT_SRC = 0x2,
9 XT_DEVGROUP_MATCH_DST = 0x4,
10 XT_DEVGROUP_INVERT_DST = 0x8,
11};
12
13struct xt_devgroup_info {
14 __u32 flags;
15 __u32 src_group;
16 __u32 src_mask;
17 __u32 dst_group;
18 __u32 dst_mask;
19};
20
21#endif /* _XT_DEVGROUP_H */
diff --git a/include/linux/netfilter/xt_quota.h b/include/linux/netfilter/xt_quota.h
index b0d28c659ab7..ca6e03e47a17 100644
--- a/include/linux/netfilter/xt_quota.h
+++ b/include/linux/netfilter/xt_quota.h
@@ -1,6 +1,8 @@
1#ifndef _XT_QUOTA_H 1#ifndef _XT_QUOTA_H
2#define _XT_QUOTA_H 2#define _XT_QUOTA_H
3 3
4#include <linux/types.h>
5
4enum xt_quota_flags { 6enum xt_quota_flags {
5 XT_QUOTA_INVERT = 0x1, 7 XT_QUOTA_INVERT = 0x1,
6}; 8};
@@ -9,9 +11,9 @@ enum xt_quota_flags {
9struct xt_quota_priv; 11struct xt_quota_priv;
10 12
11struct xt_quota_info { 13struct xt_quota_info {
12 u_int32_t flags; 14 __u32 flags;
13 u_int32_t pad; 15 __u32 pad;
14 aligned_u64 quota; 16 aligned_u64 quota;
15 17
16 /* Used internally by the kernel */ 18 /* Used internally by the kernel */
17 struct xt_quota_priv *master; 19 struct xt_quota_priv *master;
diff --git a/include/linux/netfilter/xt_set.h b/include/linux/netfilter/xt_set.h
new file mode 100644
index 000000000000..081f1ded2842
--- /dev/null
+++ b/include/linux/netfilter/xt_set.h
@@ -0,0 +1,56 @@
1#ifndef _XT_SET_H
2#define _XT_SET_H
3
4#include <linux/types.h>
5#include <linux/netfilter/ipset/ip_set.h>
6
7/* Revision 0 interface: backward compatible with netfilter/iptables */
8
9/*
10 * Option flags for kernel operations (xt_set_info_v0)
11 */
12#define IPSET_SRC 0x01 /* Source match/add */
13#define IPSET_DST 0x02 /* Destination match/add */
14#define IPSET_MATCH_INV 0x04 /* Inverse matching */
15
16struct xt_set_info_v0 {
17 ip_set_id_t index;
18 union {
19 __u32 flags[IPSET_DIM_MAX + 1];
20 struct {
21 __u32 __flags[IPSET_DIM_MAX];
22 __u8 dim;
23 __u8 flags;
24 } compat;
25 } u;
26};
27
28/* match and target infos */
29struct xt_set_info_match_v0 {
30 struct xt_set_info_v0 match_set;
31};
32
33struct xt_set_info_target_v0 {
34 struct xt_set_info_v0 add_set;
35 struct xt_set_info_v0 del_set;
36};
37
38/* Revision 1: current interface to netfilter/iptables */
39
40struct xt_set_info {
41 ip_set_id_t index;
42 __u8 dim;
43 __u8 flags;
44};
45
46/* match and target infos */
47struct xt_set_info_match {
48 struct xt_set_info match_set;
49};
50
51struct xt_set_info_target {
52 struct xt_set_info add_set;
53 struct xt_set_info del_set;
54};
55
56#endif /*_XT_SET_H*/
diff --git a/include/linux/netfilter/xt_socket.h b/include/linux/netfilter/xt_socket.h
index 6f475b8ff34b..26d7217bd4f1 100644
--- a/include/linux/netfilter/xt_socket.h
+++ b/include/linux/netfilter/xt_socket.h
@@ -1,6 +1,8 @@
1#ifndef _XT_SOCKET_H 1#ifndef _XT_SOCKET_H
2#define _XT_SOCKET_H 2#define _XT_SOCKET_H
3 3
4#include <linux/types.h>
5
4enum { 6enum {
5 XT_SOCKET_TRANSPARENT = 1 << 0, 7 XT_SOCKET_TRANSPARENT = 1 << 0,
6}; 8};
diff --git a/include/linux/netfilter/xt_time.h b/include/linux/netfilter/xt_time.h
index 14b6df412c9f..7c37fac576c4 100644
--- a/include/linux/netfilter/xt_time.h
+++ b/include/linux/netfilter/xt_time.h
@@ -1,14 +1,16 @@
1#ifndef _XT_TIME_H 1#ifndef _XT_TIME_H
2#define _XT_TIME_H 1 2#define _XT_TIME_H 1
3 3
4#include <linux/types.h>
5
4struct xt_time_info { 6struct xt_time_info {
5 u_int32_t date_start; 7 __u32 date_start;
6 u_int32_t date_stop; 8 __u32 date_stop;
7 u_int32_t daytime_start; 9 __u32 daytime_start;
8 u_int32_t daytime_stop; 10 __u32 daytime_stop;
9 u_int32_t monthdays_match; 11 __u32 monthdays_match;
10 u_int8_t weekdays_match; 12 __u8 weekdays_match;
11 u_int8_t flags; 13 __u8 flags;
12}; 14};
13 15
14enum { 16enum {
diff --git a/include/linux/netfilter/xt_u32.h b/include/linux/netfilter/xt_u32.h
index 9947f56cdbdd..04d1bfea03c2 100644
--- a/include/linux/netfilter/xt_u32.h
+++ b/include/linux/netfilter/xt_u32.h
@@ -1,6 +1,8 @@
1#ifndef _XT_U32_H 1#ifndef _XT_U32_H
2#define _XT_U32_H 1 2#define _XT_U32_H 1
3 3
4#include <linux/types.h>
5
4enum xt_u32_ops { 6enum xt_u32_ops {
5 XT_U32_AND, 7 XT_U32_AND,
6 XT_U32_LEFTSH, 8 XT_U32_LEFTSH,
@@ -9,13 +11,13 @@ enum xt_u32_ops {
9}; 11};
10 12
11struct xt_u32_location_element { 13struct xt_u32_location_element {
12 u_int32_t number; 14 __u32 number;
13 u_int8_t nextop; 15 __u8 nextop;
14}; 16};
15 17
16struct xt_u32_value_element { 18struct xt_u32_value_element {
17 u_int32_t min; 19 __u32 min;
18 u_int32_t max; 20 __u32 max;
19}; 21};
20 22
21/* 23/*
@@ -27,14 +29,14 @@ struct xt_u32_value_element {
27struct xt_u32_test { 29struct xt_u32_test {
28 struct xt_u32_location_element location[XT_U32_MAXSIZE+1]; 30 struct xt_u32_location_element location[XT_U32_MAXSIZE+1];
29 struct xt_u32_value_element value[XT_U32_MAXSIZE+1]; 31 struct xt_u32_value_element value[XT_U32_MAXSIZE+1];
30 u_int8_t nnums; 32 __u8 nnums;
31 u_int8_t nvalues; 33 __u8 nvalues;
32}; 34};
33 35
34struct xt_u32 { 36struct xt_u32 {
35 struct xt_u32_test tests[XT_U32_MAXSIZE+1]; 37 struct xt_u32_test tests[XT_U32_MAXSIZE+1];
36 u_int8_t ntests; 38 __u8 ntests;
37 u_int8_t invert; 39 __u8 invert;
38}; 40};
39 41
40#endif /* _XT_U32_H */ 42#endif /* _XT_U32_H */
diff --git a/include/linux/netfilter_bridge/ebt_802_3.h b/include/linux/netfilter_bridge/ebt_802_3.h
index c73ef0b18bdc..be5be1577a56 100644
--- a/include/linux/netfilter_bridge/ebt_802_3.h
+++ b/include/linux/netfilter_bridge/ebt_802_3.h
@@ -1,6 +1,8 @@
1#ifndef __LINUX_BRIDGE_EBT_802_3_H 1#ifndef __LINUX_BRIDGE_EBT_802_3_H
2#define __LINUX_BRIDGE_EBT_802_3_H 2#define __LINUX_BRIDGE_EBT_802_3_H
3 3
4#include <linux/types.h>
5
4#define EBT_802_3_SAP 0x01 6#define EBT_802_3_SAP 0x01
5#define EBT_802_3_TYPE 0x02 7#define EBT_802_3_TYPE 0x02
6 8
@@ -24,24 +26,24 @@
24 26
25/* ui has one byte ctrl, ni has two */ 27/* ui has one byte ctrl, ni has two */
26struct hdr_ui { 28struct hdr_ui {
27 uint8_t dsap; 29 __u8 dsap;
28 uint8_t ssap; 30 __u8 ssap;
29 uint8_t ctrl; 31 __u8 ctrl;
30 uint8_t orig[3]; 32 __u8 orig[3];
31 __be16 type; 33 __be16 type;
32}; 34};
33 35
34struct hdr_ni { 36struct hdr_ni {
35 uint8_t dsap; 37 __u8 dsap;
36 uint8_t ssap; 38 __u8 ssap;
37 __be16 ctrl; 39 __be16 ctrl;
38 uint8_t orig[3]; 40 __u8 orig[3];
39 __be16 type; 41 __be16 type;
40}; 42};
41 43
42struct ebt_802_3_hdr { 44struct ebt_802_3_hdr {
43 uint8_t daddr[6]; 45 __u8 daddr[6];
44 uint8_t saddr[6]; 46 __u8 saddr[6];
45 __be16 len; 47 __be16 len;
46 union { 48 union {
47 struct hdr_ui ui; 49 struct hdr_ui ui;
@@ -59,10 +61,10 @@ static inline struct ebt_802_3_hdr *ebt_802_3_hdr(const struct sk_buff *skb)
59#endif 61#endif
60 62
61struct ebt_802_3_info { 63struct ebt_802_3_info {
62 uint8_t sap; 64 __u8 sap;
63 __be16 type; 65 __be16 type;
64 uint8_t bitmask; 66 __u8 bitmask;
65 uint8_t invflags; 67 __u8 invflags;
66}; 68};
67 69
68#endif 70#endif
diff --git a/include/linux/netfilter_bridge/ebt_among.h b/include/linux/netfilter_bridge/ebt_among.h
index 0009558609a7..bd4e3ad0b706 100644
--- a/include/linux/netfilter_bridge/ebt_among.h
+++ b/include/linux/netfilter_bridge/ebt_among.h
@@ -1,6 +1,8 @@
1#ifndef __LINUX_BRIDGE_EBT_AMONG_H 1#ifndef __LINUX_BRIDGE_EBT_AMONG_H
2#define __LINUX_BRIDGE_EBT_AMONG_H 2#define __LINUX_BRIDGE_EBT_AMONG_H
3 3
4#include <linux/types.h>
5
4#define EBT_AMONG_DST 0x01 6#define EBT_AMONG_DST 0x01
5#define EBT_AMONG_SRC 0x02 7#define EBT_AMONG_SRC 0x02
6 8
@@ -30,7 +32,7 @@
30 */ 32 */
31 33
32struct ebt_mac_wormhash_tuple { 34struct ebt_mac_wormhash_tuple {
33 uint32_t cmp[2]; 35 __u32 cmp[2];
34 __be32 ip; 36 __be32 ip;
35}; 37};
36 38
diff --git a/include/linux/netfilter_bridge/ebt_arp.h b/include/linux/netfilter_bridge/ebt_arp.h
index cbf4843b6b0f..522f3e427f49 100644
--- a/include/linux/netfilter_bridge/ebt_arp.h
+++ b/include/linux/netfilter_bridge/ebt_arp.h
@@ -1,6 +1,8 @@
1#ifndef __LINUX_BRIDGE_EBT_ARP_H 1#ifndef __LINUX_BRIDGE_EBT_ARP_H
2#define __LINUX_BRIDGE_EBT_ARP_H 2#define __LINUX_BRIDGE_EBT_ARP_H
3 3
4#include <linux/types.h>
5
4#define EBT_ARP_OPCODE 0x01 6#define EBT_ARP_OPCODE 0x01
5#define EBT_ARP_HTYPE 0x02 7#define EBT_ARP_HTYPE 0x02
6#define EBT_ARP_PTYPE 0x04 8#define EBT_ARP_PTYPE 0x04
@@ -27,8 +29,8 @@ struct ebt_arp_info
27 unsigned char smmsk[ETH_ALEN]; 29 unsigned char smmsk[ETH_ALEN];
28 unsigned char dmaddr[ETH_ALEN]; 30 unsigned char dmaddr[ETH_ALEN];
29 unsigned char dmmsk[ETH_ALEN]; 31 unsigned char dmmsk[ETH_ALEN];
30 uint8_t bitmask; 32 __u8 bitmask;
31 uint8_t invflags; 33 __u8 invflags;
32}; 34};
33 35
34#endif 36#endif
diff --git a/include/linux/netfilter_bridge/ebt_ip.h b/include/linux/netfilter_bridge/ebt_ip.h
index 6a708fb92241..c4bbc41b0ea4 100644
--- a/include/linux/netfilter_bridge/ebt_ip.h
+++ b/include/linux/netfilter_bridge/ebt_ip.h
@@ -15,6 +15,8 @@
15#ifndef __LINUX_BRIDGE_EBT_IP_H 15#ifndef __LINUX_BRIDGE_EBT_IP_H
16#define __LINUX_BRIDGE_EBT_IP_H 16#define __LINUX_BRIDGE_EBT_IP_H
17 17
18#include <linux/types.h>
19
18#define EBT_IP_SOURCE 0x01 20#define EBT_IP_SOURCE 0x01
19#define EBT_IP_DEST 0x02 21#define EBT_IP_DEST 0x02
20#define EBT_IP_TOS 0x04 22#define EBT_IP_TOS 0x04
@@ -31,12 +33,12 @@ struct ebt_ip_info {
31 __be32 daddr; 33 __be32 daddr;
32 __be32 smsk; 34 __be32 smsk;
33 __be32 dmsk; 35 __be32 dmsk;
34 uint8_t tos; 36 __u8 tos;
35 uint8_t protocol; 37 __u8 protocol;
36 uint8_t bitmask; 38 __u8 bitmask;
37 uint8_t invflags; 39 __u8 invflags;
38 uint16_t sport[2]; 40 __u16 sport[2];
39 uint16_t dport[2]; 41 __u16 dport[2];
40}; 42};
41 43
42#endif 44#endif
diff --git a/include/linux/netfilter_bridge/ebt_ip6.h b/include/linux/netfilter_bridge/ebt_ip6.h
index e5de98701519..42b889682721 100644
--- a/include/linux/netfilter_bridge/ebt_ip6.h
+++ b/include/linux/netfilter_bridge/ebt_ip6.h
@@ -12,14 +12,19 @@
12#ifndef __LINUX_BRIDGE_EBT_IP6_H 12#ifndef __LINUX_BRIDGE_EBT_IP6_H
13#define __LINUX_BRIDGE_EBT_IP6_H 13#define __LINUX_BRIDGE_EBT_IP6_H
14 14
15#include <linux/types.h>
16
15#define EBT_IP6_SOURCE 0x01 17#define EBT_IP6_SOURCE 0x01
16#define EBT_IP6_DEST 0x02 18#define EBT_IP6_DEST 0x02
17#define EBT_IP6_TCLASS 0x04 19#define EBT_IP6_TCLASS 0x04
18#define EBT_IP6_PROTO 0x08 20#define EBT_IP6_PROTO 0x08
19#define EBT_IP6_SPORT 0x10 21#define EBT_IP6_SPORT 0x10
20#define EBT_IP6_DPORT 0x20 22#define EBT_IP6_DPORT 0x20
23#define EBT_IP6_ICMP6 0x40
24
21#define EBT_IP6_MASK (EBT_IP6_SOURCE | EBT_IP6_DEST | EBT_IP6_TCLASS |\ 25#define EBT_IP6_MASK (EBT_IP6_SOURCE | EBT_IP6_DEST | EBT_IP6_TCLASS |\
22 EBT_IP6_PROTO | EBT_IP6_SPORT | EBT_IP6_DPORT) 26 EBT_IP6_PROTO | EBT_IP6_SPORT | EBT_IP6_DPORT | \
27 EBT_IP6_ICMP6)
23#define EBT_IP6_MATCH "ip6" 28#define EBT_IP6_MATCH "ip6"
24 29
25/* the same values are used for the invflags */ 30/* the same values are used for the invflags */
@@ -28,12 +33,18 @@ struct ebt_ip6_info {
28 struct in6_addr daddr; 33 struct in6_addr daddr;
29 struct in6_addr smsk; 34 struct in6_addr smsk;
30 struct in6_addr dmsk; 35 struct in6_addr dmsk;
31 uint8_t tclass; 36 __u8 tclass;
32 uint8_t protocol; 37 __u8 protocol;
33 uint8_t bitmask; 38 __u8 bitmask;
34 uint8_t invflags; 39 __u8 invflags;
35 uint16_t sport[2]; 40 union {
36 uint16_t dport[2]; 41 __u16 sport[2];
42 __u8 icmpv6_type[2];
43 };
44 union {
45 __u16 dport[2];
46 __u8 icmpv6_code[2];
47 };
37}; 48};
38 49
39#endif 50#endif
diff --git a/include/linux/netfilter_bridge/ebt_limit.h b/include/linux/netfilter_bridge/ebt_limit.h
index 4bf76b751676..66d80b30ba0e 100644
--- a/include/linux/netfilter_bridge/ebt_limit.h
+++ b/include/linux/netfilter_bridge/ebt_limit.h
@@ -1,6 +1,8 @@
1#ifndef __LINUX_BRIDGE_EBT_LIMIT_H 1#ifndef __LINUX_BRIDGE_EBT_LIMIT_H
2#define __LINUX_BRIDGE_EBT_LIMIT_H 2#define __LINUX_BRIDGE_EBT_LIMIT_H
3 3
4#include <linux/types.h>
5
4#define EBT_LIMIT_MATCH "limit" 6#define EBT_LIMIT_MATCH "limit"
5 7
6/* timings are in milliseconds. */ 8/* timings are in milliseconds. */
@@ -10,13 +12,13 @@
10 seconds, or one every 59 hours. */ 12 seconds, or one every 59 hours. */
11 13
12struct ebt_limit_info { 14struct ebt_limit_info {
13 u_int32_t avg; /* Average secs between packets * scale */ 15 __u32 avg; /* Average secs between packets * scale */
14 u_int32_t burst; /* Period multiplier for upper limit. */ 16 __u32 burst; /* Period multiplier for upper limit. */
15 17
16 /* Used internally by the kernel */ 18 /* Used internally by the kernel */
17 unsigned long prev; 19 unsigned long prev;
18 u_int32_t credit; 20 __u32 credit;
19 u_int32_t credit_cap, cost; 21 __u32 credit_cap, cost;
20}; 22};
21 23
22#endif 24#endif
diff --git a/include/linux/netfilter_bridge/ebt_log.h b/include/linux/netfilter_bridge/ebt_log.h
index cc2cdfb764bc..7e7f1d1fe494 100644
--- a/include/linux/netfilter_bridge/ebt_log.h
+++ b/include/linux/netfilter_bridge/ebt_log.h
@@ -1,6 +1,8 @@
1#ifndef __LINUX_BRIDGE_EBT_LOG_H 1#ifndef __LINUX_BRIDGE_EBT_LOG_H
2#define __LINUX_BRIDGE_EBT_LOG_H 2#define __LINUX_BRIDGE_EBT_LOG_H
3 3
4#include <linux/types.h>
5
4#define EBT_LOG_IP 0x01 /* if the frame is made by ip, log the ip information */ 6#define EBT_LOG_IP 0x01 /* if the frame is made by ip, log the ip information */
5#define EBT_LOG_ARP 0x02 7#define EBT_LOG_ARP 0x02
6#define EBT_LOG_NFLOG 0x04 8#define EBT_LOG_NFLOG 0x04
@@ -10,9 +12,9 @@
10#define EBT_LOG_WATCHER "log" 12#define EBT_LOG_WATCHER "log"
11 13
12struct ebt_log_info { 14struct ebt_log_info {
13 uint8_t loglevel; 15 __u8 loglevel;
14 uint8_t prefix[EBT_LOG_PREFIX_SIZE]; 16 __u8 prefix[EBT_LOG_PREFIX_SIZE];
15 uint32_t bitmask; 17 __u32 bitmask;
16}; 18};
17 19
18#endif 20#endif
diff --git a/include/linux/netfilter_bridge/ebt_mark_m.h b/include/linux/netfilter_bridge/ebt_mark_m.h
index 9ceb10ec0ed6..410f9e5a71d4 100644
--- a/include/linux/netfilter_bridge/ebt_mark_m.h
+++ b/include/linux/netfilter_bridge/ebt_mark_m.h
@@ -1,13 +1,15 @@
1#ifndef __LINUX_BRIDGE_EBT_MARK_M_H 1#ifndef __LINUX_BRIDGE_EBT_MARK_M_H
2#define __LINUX_BRIDGE_EBT_MARK_M_H 2#define __LINUX_BRIDGE_EBT_MARK_M_H
3 3
4#include <linux/types.h>
5
4#define EBT_MARK_AND 0x01 6#define EBT_MARK_AND 0x01
5#define EBT_MARK_OR 0x02 7#define EBT_MARK_OR 0x02
6#define EBT_MARK_MASK (EBT_MARK_AND | EBT_MARK_OR) 8#define EBT_MARK_MASK (EBT_MARK_AND | EBT_MARK_OR)
7struct ebt_mark_m_info { 9struct ebt_mark_m_info {
8 unsigned long mark, mask; 10 unsigned long mark, mask;
9 uint8_t invert; 11 __u8 invert;
10 uint8_t bitmask; 12 __u8 bitmask;
11}; 13};
12#define EBT_MARK_MATCH "mark_m" 14#define EBT_MARK_MATCH "mark_m"
13 15
diff --git a/include/linux/netfilter_bridge/ebt_nflog.h b/include/linux/netfilter_bridge/ebt_nflog.h
index 052817849b83..df829fce9125 100644
--- a/include/linux/netfilter_bridge/ebt_nflog.h
+++ b/include/linux/netfilter_bridge/ebt_nflog.h
@@ -1,6 +1,8 @@
1#ifndef __LINUX_BRIDGE_EBT_NFLOG_H 1#ifndef __LINUX_BRIDGE_EBT_NFLOG_H
2#define __LINUX_BRIDGE_EBT_NFLOG_H 2#define __LINUX_BRIDGE_EBT_NFLOG_H
3 3
4#include <linux/types.h>
5
4#define EBT_NFLOG_MASK 0x0 6#define EBT_NFLOG_MASK 0x0
5 7
6#define EBT_NFLOG_PREFIX_SIZE 64 8#define EBT_NFLOG_PREFIX_SIZE 64
@@ -10,11 +12,11 @@
10#define EBT_NFLOG_DEFAULT_THRESHOLD 1 12#define EBT_NFLOG_DEFAULT_THRESHOLD 1
11 13
12struct ebt_nflog_info { 14struct ebt_nflog_info {
13 u_int32_t len; 15 __u32 len;
14 u_int16_t group; 16 __u16 group;
15 u_int16_t threshold; 17 __u16 threshold;
16 u_int16_t flags; 18 __u16 flags;
17 u_int16_t pad; 19 __u16 pad;
18 char prefix[EBT_NFLOG_PREFIX_SIZE]; 20 char prefix[EBT_NFLOG_PREFIX_SIZE];
19}; 21};
20 22
diff --git a/include/linux/netfilter_bridge/ebt_pkttype.h b/include/linux/netfilter_bridge/ebt_pkttype.h
index 51a799840931..c241badcd036 100644
--- a/include/linux/netfilter_bridge/ebt_pkttype.h
+++ b/include/linux/netfilter_bridge/ebt_pkttype.h
@@ -1,9 +1,11 @@
1#ifndef __LINUX_BRIDGE_EBT_PKTTYPE_H 1#ifndef __LINUX_BRIDGE_EBT_PKTTYPE_H
2#define __LINUX_BRIDGE_EBT_PKTTYPE_H 2#define __LINUX_BRIDGE_EBT_PKTTYPE_H
3 3
4#include <linux/types.h>
5
4struct ebt_pkttype_info { 6struct ebt_pkttype_info {
5 uint8_t pkt_type; 7 __u8 pkt_type;
6 uint8_t invert; 8 __u8 invert;
7}; 9};
8#define EBT_PKTTYPE_MATCH "pkttype" 10#define EBT_PKTTYPE_MATCH "pkttype"
9 11
diff --git a/include/linux/netfilter_bridge/ebt_stp.h b/include/linux/netfilter_bridge/ebt_stp.h
index e503a0aa2728..1025b9f5fb7d 100644
--- a/include/linux/netfilter_bridge/ebt_stp.h
+++ b/include/linux/netfilter_bridge/ebt_stp.h
@@ -1,6 +1,8 @@
1#ifndef __LINUX_BRIDGE_EBT_STP_H 1#ifndef __LINUX_BRIDGE_EBT_STP_H
2#define __LINUX_BRIDGE_EBT_STP_H 2#define __LINUX_BRIDGE_EBT_STP_H
3 3
4#include <linux/types.h>
5
4#define EBT_STP_TYPE 0x0001 6#define EBT_STP_TYPE 0x0001
5 7
6#define EBT_STP_FLAGS 0x0002 8#define EBT_STP_FLAGS 0x0002
@@ -21,24 +23,24 @@
21#define EBT_STP_MATCH "stp" 23#define EBT_STP_MATCH "stp"
22 24
23struct ebt_stp_config_info { 25struct ebt_stp_config_info {
24 uint8_t flags; 26 __u8 flags;
25 uint16_t root_priol, root_priou; 27 __u16 root_priol, root_priou;
26 char root_addr[6], root_addrmsk[6]; 28 char root_addr[6], root_addrmsk[6];
27 uint32_t root_costl, root_costu; 29 __u32 root_costl, root_costu;
28 uint16_t sender_priol, sender_priou; 30 __u16 sender_priol, sender_priou;
29 char sender_addr[6], sender_addrmsk[6]; 31 char sender_addr[6], sender_addrmsk[6];
30 uint16_t portl, portu; 32 __u16 portl, portu;
31 uint16_t msg_agel, msg_ageu; 33 __u16 msg_agel, msg_ageu;
32 uint16_t max_agel, max_ageu; 34 __u16 max_agel, max_ageu;
33 uint16_t hello_timel, hello_timeu; 35 __u16 hello_timel, hello_timeu;
34 uint16_t forward_delayl, forward_delayu; 36 __u16 forward_delayl, forward_delayu;
35}; 37};
36 38
37struct ebt_stp_info { 39struct ebt_stp_info {
38 uint8_t type; 40 __u8 type;
39 struct ebt_stp_config_info config; 41 struct ebt_stp_config_info config;
40 uint16_t bitmask; 42 __u16 bitmask;
41 uint16_t invflags; 43 __u16 invflags;
42}; 44};
43 45
44#endif 46#endif
diff --git a/include/linux/netfilter_bridge/ebt_ulog.h b/include/linux/netfilter_bridge/ebt_ulog.h
index b677e2671541..89a6becb5269 100644
--- a/include/linux/netfilter_bridge/ebt_ulog.h
+++ b/include/linux/netfilter_bridge/ebt_ulog.h
@@ -1,6 +1,8 @@
1#ifndef _EBT_ULOG_H 1#ifndef _EBT_ULOG_H
2#define _EBT_ULOG_H 2#define _EBT_ULOG_H
3 3
4#include <linux/types.h>
5
4#define EBT_ULOG_DEFAULT_NLGROUP 0 6#define EBT_ULOG_DEFAULT_NLGROUP 0
5#define EBT_ULOG_DEFAULT_QTHRESHOLD 1 7#define EBT_ULOG_DEFAULT_QTHRESHOLD 1
6#define EBT_ULOG_MAXNLGROUPS 32 /* hardcoded netlink max */ 8#define EBT_ULOG_MAXNLGROUPS 32 /* hardcoded netlink max */
@@ -10,7 +12,7 @@
10#define EBT_ULOG_VERSION 1 12#define EBT_ULOG_VERSION 1
11 13
12struct ebt_ulog_info { 14struct ebt_ulog_info {
13 uint32_t nlgroup; 15 __u32 nlgroup;
14 unsigned int cprange; 16 unsigned int cprange;
15 unsigned int qthreshold; 17 unsigned int qthreshold;
16 char prefix[EBT_ULOG_PREFIX_LEN]; 18 char prefix[EBT_ULOG_PREFIX_LEN];
diff --git a/include/linux/netfilter_bridge/ebt_vlan.h b/include/linux/netfilter_bridge/ebt_vlan.h
index 1d98be4031e7..967d1d5cf98d 100644
--- a/include/linux/netfilter_bridge/ebt_vlan.h
+++ b/include/linux/netfilter_bridge/ebt_vlan.h
@@ -1,6 +1,8 @@
1#ifndef __LINUX_BRIDGE_EBT_VLAN_H 1#ifndef __LINUX_BRIDGE_EBT_VLAN_H
2#define __LINUX_BRIDGE_EBT_VLAN_H 2#define __LINUX_BRIDGE_EBT_VLAN_H
3 3
4#include <linux/types.h>
5
4#define EBT_VLAN_ID 0x01 6#define EBT_VLAN_ID 0x01
5#define EBT_VLAN_PRIO 0x02 7#define EBT_VLAN_PRIO 0x02
6#define EBT_VLAN_ENCAP 0x04 8#define EBT_VLAN_ENCAP 0x04
@@ -8,12 +10,12 @@
8#define EBT_VLAN_MATCH "vlan" 10#define EBT_VLAN_MATCH "vlan"
9 11
10struct ebt_vlan_info { 12struct ebt_vlan_info {
11 uint16_t id; /* VLAN ID {1-4095} */ 13 __u16 id; /* VLAN ID {1-4095} */
12 uint8_t prio; /* VLAN User Priority {0-7} */ 14 __u8 prio; /* VLAN User Priority {0-7} */
13 __be16 encap; /* VLAN Encapsulated frame code {0-65535} */ 15 __be16 encap; /* VLAN Encapsulated frame code {0-65535} */
14 uint8_t bitmask; /* Args bitmask bit 1=1 - ID arg, 16 __u8 bitmask; /* Args bitmask bit 1=1 - ID arg,
15 bit 2=1 User-Priority arg, bit 3=1 encap*/ 17 bit 2=1 User-Priority arg, bit 3=1 encap*/
16 uint8_t invflags; /* Inverse bitmask bit 1=1 - inversed ID arg, 18 __u8 invflags; /* Inverse bitmask bit 1=1 - inversed ID arg,
17 bit 2=1 - inversed Pirority arg */ 19 bit 2=1 - inversed Pirority arg */
18}; 20};
19 21
diff --git a/include/linux/netfilter_ipv4/ipt_CLUSTERIP.h b/include/linux/netfilter_ipv4/ipt_CLUSTERIP.h
index e5a3687c8a72..c6a204c97047 100644
--- a/include/linux/netfilter_ipv4/ipt_CLUSTERIP.h
+++ b/include/linux/netfilter_ipv4/ipt_CLUSTERIP.h
@@ -1,6 +1,8 @@
1#ifndef _IPT_CLUSTERIP_H_target 1#ifndef _IPT_CLUSTERIP_H_target
2#define _IPT_CLUSTERIP_H_target 2#define _IPT_CLUSTERIP_H_target
3 3
4#include <linux/types.h>
5
4enum clusterip_hashmode { 6enum clusterip_hashmode {
5 CLUSTERIP_HASHMODE_SIP = 0, 7 CLUSTERIP_HASHMODE_SIP = 0,
6 CLUSTERIP_HASHMODE_SIP_SPT, 8 CLUSTERIP_HASHMODE_SIP_SPT,
@@ -17,15 +19,15 @@ struct clusterip_config;
17 19
18struct ipt_clusterip_tgt_info { 20struct ipt_clusterip_tgt_info {
19 21
20 u_int32_t flags; 22 __u32 flags;
21 23
22 /* only relevant for new ones */ 24 /* only relevant for new ones */
23 u_int8_t clustermac[6]; 25 __u8 clustermac[6];
24 u_int16_t num_total_nodes; 26 __u16 num_total_nodes;
25 u_int16_t num_local_nodes; 27 __u16 num_local_nodes;
26 u_int16_t local_nodes[CLUSTERIP_MAX_NODES]; 28 __u16 local_nodes[CLUSTERIP_MAX_NODES];
27 u_int32_t hash_mode; 29 __u32 hash_mode;
28 u_int32_t hash_initval; 30 __u32 hash_initval;
29 31
30 /* Used internally by the kernel */ 32 /* Used internally by the kernel */
31 struct clusterip_config *config; 33 struct clusterip_config *config;
diff --git a/include/linux/netfilter_ipv4/ipt_ECN.h b/include/linux/netfilter_ipv4/ipt_ECN.h
index 7ca45918ab8e..bb88d5315a4d 100644
--- a/include/linux/netfilter_ipv4/ipt_ECN.h
+++ b/include/linux/netfilter_ipv4/ipt_ECN.h
@@ -8,6 +8,8 @@
8*/ 8*/
9#ifndef _IPT_ECN_TARGET_H 9#ifndef _IPT_ECN_TARGET_H
10#define _IPT_ECN_TARGET_H 10#define _IPT_ECN_TARGET_H
11
12#include <linux/types.h>
11#include <linux/netfilter/xt_DSCP.h> 13#include <linux/netfilter/xt_DSCP.h>
12 14
13#define IPT_ECN_IP_MASK (~XT_DSCP_MASK) 15#define IPT_ECN_IP_MASK (~XT_DSCP_MASK)
@@ -19,11 +21,11 @@
19#define IPT_ECN_OP_MASK 0xce 21#define IPT_ECN_OP_MASK 0xce
20 22
21struct ipt_ECN_info { 23struct ipt_ECN_info {
22 u_int8_t operation; /* bitset of operations */ 24 __u8 operation; /* bitset of operations */
23 u_int8_t ip_ect; /* ECT codepoint of IPv4 header, pre-shifted */ 25 __u8 ip_ect; /* ECT codepoint of IPv4 header, pre-shifted */
24 union { 26 union {
25 struct { 27 struct {
26 u_int8_t ece:1, cwr:1; /* TCP ECT bits */ 28 __u8 ece:1, cwr:1; /* TCP ECT bits */
27 } tcp; 29 } tcp;
28 } proto; 30 } proto;
29}; 31};
diff --git a/include/linux/netfilter_ipv4/ipt_SAME.h b/include/linux/netfilter_ipv4/ipt_SAME.h
index 2529660c5b38..5bca78267afd 100644
--- a/include/linux/netfilter_ipv4/ipt_SAME.h
+++ b/include/linux/netfilter_ipv4/ipt_SAME.h
@@ -1,15 +1,17 @@
1#ifndef _IPT_SAME_H 1#ifndef _IPT_SAME_H
2#define _IPT_SAME_H 2#define _IPT_SAME_H
3 3
4#include <linux/types.h>
5
4#define IPT_SAME_MAX_RANGE 10 6#define IPT_SAME_MAX_RANGE 10
5 7
6#define IPT_SAME_NODST 0x01 8#define IPT_SAME_NODST 0x01
7 9
8struct ipt_same_info { 10struct ipt_same_info {
9 unsigned char info; 11 unsigned char info;
10 u_int32_t rangesize; 12 __u32 rangesize;
11 u_int32_t ipnum; 13 __u32 ipnum;
12 u_int32_t *iparray; 14 __u32 *iparray;
13 15
14 /* hangs off end. */ 16 /* hangs off end. */
15 struct nf_nat_range range[IPT_SAME_MAX_RANGE]; 17 struct nf_nat_range range[IPT_SAME_MAX_RANGE];
diff --git a/include/linux/netfilter_ipv4/ipt_TTL.h b/include/linux/netfilter_ipv4/ipt_TTL.h
index ee6611edc112..f6ac169d92f9 100644
--- a/include/linux/netfilter_ipv4/ipt_TTL.h
+++ b/include/linux/netfilter_ipv4/ipt_TTL.h
@@ -4,6 +4,8 @@
4#ifndef _IPT_TTL_H 4#ifndef _IPT_TTL_H
5#define _IPT_TTL_H 5#define _IPT_TTL_H
6 6
7#include <linux/types.h>
8
7enum { 9enum {
8 IPT_TTL_SET = 0, 10 IPT_TTL_SET = 0,
9 IPT_TTL_INC, 11 IPT_TTL_INC,
@@ -13,8 +15,8 @@ enum {
13#define IPT_TTL_MAXMODE IPT_TTL_DEC 15#define IPT_TTL_MAXMODE IPT_TTL_DEC
14 16
15struct ipt_TTL_info { 17struct ipt_TTL_info {
16 u_int8_t mode; 18 __u8 mode;
17 u_int8_t ttl; 19 __u8 ttl;
18}; 20};
19 21
20 22
diff --git a/include/linux/netfilter_ipv4/ipt_addrtype.h b/include/linux/netfilter_ipv4/ipt_addrtype.h
index 446de6aef983..0da42237c8da 100644
--- a/include/linux/netfilter_ipv4/ipt_addrtype.h
+++ b/include/linux/netfilter_ipv4/ipt_addrtype.h
@@ -1,6 +1,8 @@
1#ifndef _IPT_ADDRTYPE_H 1#ifndef _IPT_ADDRTYPE_H
2#define _IPT_ADDRTYPE_H 2#define _IPT_ADDRTYPE_H
3 3
4#include <linux/types.h>
5
4enum { 6enum {
5 IPT_ADDRTYPE_INVERT_SOURCE = 0x0001, 7 IPT_ADDRTYPE_INVERT_SOURCE = 0x0001,
6 IPT_ADDRTYPE_INVERT_DEST = 0x0002, 8 IPT_ADDRTYPE_INVERT_DEST = 0x0002,
@@ -9,17 +11,17 @@ enum {
9}; 11};
10 12
11struct ipt_addrtype_info_v1 { 13struct ipt_addrtype_info_v1 {
12 u_int16_t source; /* source-type mask */ 14 __u16 source; /* source-type mask */
13 u_int16_t dest; /* dest-type mask */ 15 __u16 dest; /* dest-type mask */
14 u_int32_t flags; 16 __u32 flags;
15}; 17};
16 18
17/* revision 0 */ 19/* revision 0 */
18struct ipt_addrtype_info { 20struct ipt_addrtype_info {
19 u_int16_t source; /* source-type mask */ 21 __u16 source; /* source-type mask */
20 u_int16_t dest; /* dest-type mask */ 22 __u16 dest; /* dest-type mask */
21 u_int32_t invert_source; 23 __u32 invert_source;
22 u_int32_t invert_dest; 24 __u32 invert_dest;
23}; 25};
24 26
25#endif 27#endif
diff --git a/include/linux/netfilter_ipv4/ipt_ah.h b/include/linux/netfilter_ipv4/ipt_ah.h
index 2e555b4d05e3..4e02bb0119e3 100644
--- a/include/linux/netfilter_ipv4/ipt_ah.h
+++ b/include/linux/netfilter_ipv4/ipt_ah.h
@@ -1,9 +1,11 @@
1#ifndef _IPT_AH_H 1#ifndef _IPT_AH_H
2#define _IPT_AH_H 2#define _IPT_AH_H
3 3
4#include <linux/types.h>
5
4struct ipt_ah { 6struct ipt_ah {
5 u_int32_t spis[2]; /* Security Parameter Index */ 7 __u32 spis[2]; /* Security Parameter Index */
6 u_int8_t invflags; /* Inverse flags */ 8 __u8 invflags; /* Inverse flags */
7}; 9};
8 10
9 11
diff --git a/include/linux/netfilter_ipv4/ipt_ecn.h b/include/linux/netfilter_ipv4/ipt_ecn.h
index 9945baa4ccd7..eabf95fb7d3e 100644
--- a/include/linux/netfilter_ipv4/ipt_ecn.h
+++ b/include/linux/netfilter_ipv4/ipt_ecn.h
@@ -8,6 +8,8 @@
8*/ 8*/
9#ifndef _IPT_ECN_H 9#ifndef _IPT_ECN_H
10#define _IPT_ECN_H 10#define _IPT_ECN_H
11
12#include <linux/types.h>
11#include <linux/netfilter/xt_dscp.h> 13#include <linux/netfilter/xt_dscp.h>
12 14
13#define IPT_ECN_IP_MASK (~XT_DSCP_MASK) 15#define IPT_ECN_IP_MASK (~XT_DSCP_MASK)
@@ -20,12 +22,12 @@
20 22
21/* match info */ 23/* match info */
22struct ipt_ecn_info { 24struct ipt_ecn_info {
23 u_int8_t operation; 25 __u8 operation;
24 u_int8_t invert; 26 __u8 invert;
25 u_int8_t ip_ect; 27 __u8 ip_ect;
26 union { 28 union {
27 struct { 29 struct {
28 u_int8_t ect; 30 __u8 ect;
29 } tcp; 31 } tcp;
30 } proto; 32 } proto;
31}; 33};
diff --git a/include/linux/netfilter_ipv4/ipt_ttl.h b/include/linux/netfilter_ipv4/ipt_ttl.h
index ee24fd86a3aa..37bee4442486 100644
--- a/include/linux/netfilter_ipv4/ipt_ttl.h
+++ b/include/linux/netfilter_ipv4/ipt_ttl.h
@@ -4,6 +4,8 @@
4#ifndef _IPT_TTL_H 4#ifndef _IPT_TTL_H
5#define _IPT_TTL_H 5#define _IPT_TTL_H
6 6
7#include <linux/types.h>
8
7enum { 9enum {
8 IPT_TTL_EQ = 0, /* equals */ 10 IPT_TTL_EQ = 0, /* equals */
9 IPT_TTL_NE, /* not equals */ 11 IPT_TTL_NE, /* not equals */
@@ -13,8 +15,8 @@ enum {
13 15
14 16
15struct ipt_ttl_info { 17struct ipt_ttl_info {
16 u_int8_t mode; 18 __u8 mode;
17 u_int8_t ttl; 19 __u8 ttl;
18}; 20};
19 21
20 22
diff --git a/include/linux/netfilter_ipv6/ip6t_HL.h b/include/linux/netfilter_ipv6/ip6t_HL.h
index afb7813d45ab..ebd8ead1bb63 100644
--- a/include/linux/netfilter_ipv6/ip6t_HL.h
+++ b/include/linux/netfilter_ipv6/ip6t_HL.h
@@ -5,6 +5,8 @@
5#ifndef _IP6T_HL_H 5#ifndef _IP6T_HL_H
6#define _IP6T_HL_H 6#define _IP6T_HL_H
7 7
8#include <linux/types.h>
9
8enum { 10enum {
9 IP6T_HL_SET = 0, 11 IP6T_HL_SET = 0,
10 IP6T_HL_INC, 12 IP6T_HL_INC,
@@ -14,8 +16,8 @@ enum {
14#define IP6T_HL_MAXMODE IP6T_HL_DEC 16#define IP6T_HL_MAXMODE IP6T_HL_DEC
15 17
16struct ip6t_HL_info { 18struct ip6t_HL_info {
17 u_int8_t mode; 19 __u8 mode;
18 u_int8_t hop_limit; 20 __u8 hop_limit;
19}; 21};
20 22
21 23
diff --git a/include/linux/netfilter_ipv6/ip6t_REJECT.h b/include/linux/netfilter_ipv6/ip6t_REJECT.h
index 6be6504162bb..205ed62e4605 100644
--- a/include/linux/netfilter_ipv6/ip6t_REJECT.h
+++ b/include/linux/netfilter_ipv6/ip6t_REJECT.h
@@ -1,6 +1,8 @@
1#ifndef _IP6T_REJECT_H 1#ifndef _IP6T_REJECT_H
2#define _IP6T_REJECT_H 2#define _IP6T_REJECT_H
3 3
4#include <linux/types.h>
5
4enum ip6t_reject_with { 6enum ip6t_reject_with {
5 IP6T_ICMP6_NO_ROUTE, 7 IP6T_ICMP6_NO_ROUTE,
6 IP6T_ICMP6_ADM_PROHIBITED, 8 IP6T_ICMP6_ADM_PROHIBITED,
@@ -12,7 +14,7 @@ enum ip6t_reject_with {
12}; 14};
13 15
14struct ip6t_reject_info { 16struct ip6t_reject_info {
15 u_int32_t with; /* reject type */ 17 __u32 with; /* reject type */
16}; 18};
17 19
18#endif /*_IP6T_REJECT_H*/ 20#endif /*_IP6T_REJECT_H*/
diff --git a/include/linux/netfilter_ipv6/ip6t_ah.h b/include/linux/netfilter_ipv6/ip6t_ah.h
index 17a745cfb2c7..5da2b65cb3ad 100644
--- a/include/linux/netfilter_ipv6/ip6t_ah.h
+++ b/include/linux/netfilter_ipv6/ip6t_ah.h
@@ -1,11 +1,13 @@
1#ifndef _IP6T_AH_H 1#ifndef _IP6T_AH_H
2#define _IP6T_AH_H 2#define _IP6T_AH_H
3 3
4#include <linux/types.h>
5
4struct ip6t_ah { 6struct ip6t_ah {
5 u_int32_t spis[2]; /* Security Parameter Index */ 7 __u32 spis[2]; /* Security Parameter Index */
6 u_int32_t hdrlen; /* Header Length */ 8 __u32 hdrlen; /* Header Length */
7 u_int8_t hdrres; /* Test of the Reserved Filed */ 9 __u8 hdrres; /* Test of the Reserved Filed */
8 u_int8_t invflags; /* Inverse flags */ 10 __u8 invflags; /* Inverse flags */
9}; 11};
10 12
11#define IP6T_AH_SPI 0x01 13#define IP6T_AH_SPI 0x01
diff --git a/include/linux/netfilter_ipv6/ip6t_frag.h b/include/linux/netfilter_ipv6/ip6t_frag.h
index 3724d0850920..b47f61b9e082 100644
--- a/include/linux/netfilter_ipv6/ip6t_frag.h
+++ b/include/linux/netfilter_ipv6/ip6t_frag.h
@@ -1,11 +1,13 @@
1#ifndef _IP6T_FRAG_H 1#ifndef _IP6T_FRAG_H
2#define _IP6T_FRAG_H 2#define _IP6T_FRAG_H
3 3
4#include <linux/types.h>
5
4struct ip6t_frag { 6struct ip6t_frag {
5 u_int32_t ids[2]; /* Security Parameter Index */ 7 __u32 ids[2]; /* Security Parameter Index */
6 u_int32_t hdrlen; /* Header Length */ 8 __u32 hdrlen; /* Header Length */
7 u_int8_t flags; /* */ 9 __u8 flags; /* */
8 u_int8_t invflags; /* Inverse flags */ 10 __u8 invflags; /* Inverse flags */
9}; 11};
10 12
11#define IP6T_FRAG_IDS 0x01 13#define IP6T_FRAG_IDS 0x01
diff --git a/include/linux/netfilter_ipv6/ip6t_hl.h b/include/linux/netfilter_ipv6/ip6t_hl.h
index 5ef91b8319a8..6e76dbc6c19a 100644
--- a/include/linux/netfilter_ipv6/ip6t_hl.h
+++ b/include/linux/netfilter_ipv6/ip6t_hl.h
@@ -5,6 +5,8 @@
5#ifndef _IP6T_HL_H 5#ifndef _IP6T_HL_H
6#define _IP6T_HL_H 6#define _IP6T_HL_H
7 7
8#include <linux/types.h>
9
8enum { 10enum {
9 IP6T_HL_EQ = 0, /* equals */ 11 IP6T_HL_EQ = 0, /* equals */
10 IP6T_HL_NE, /* not equals */ 12 IP6T_HL_NE, /* not equals */
@@ -14,8 +16,8 @@ enum {
14 16
15 17
16struct ip6t_hl_info { 18struct ip6t_hl_info {
17 u_int8_t mode; 19 __u8 mode;
18 u_int8_t hop_limit; 20 __u8 hop_limit;
19}; 21};
20 22
21 23
diff --git a/include/linux/netfilter_ipv6/ip6t_ipv6header.h b/include/linux/netfilter_ipv6/ip6t_ipv6header.h
index 01dfd445596a..efae3a20c214 100644
--- a/include/linux/netfilter_ipv6/ip6t_ipv6header.h
+++ b/include/linux/netfilter_ipv6/ip6t_ipv6header.h
@@ -8,10 +8,12 @@ on whether they contain certain headers */
8#ifndef __IPV6HEADER_H 8#ifndef __IPV6HEADER_H
9#define __IPV6HEADER_H 9#define __IPV6HEADER_H
10 10
11#include <linux/types.h>
12
11struct ip6t_ipv6header_info { 13struct ip6t_ipv6header_info {
12 u_int8_t matchflags; 14 __u8 matchflags;
13 u_int8_t invflags; 15 __u8 invflags;
14 u_int8_t modeflag; 16 __u8 modeflag;
15}; 17};
16 18
17#define MASK_HOPOPTS 128 19#define MASK_HOPOPTS 128
diff --git a/include/linux/netfilter_ipv6/ip6t_mh.h b/include/linux/netfilter_ipv6/ip6t_mh.h
index 18549bca2d1f..a7729a5025cd 100644
--- a/include/linux/netfilter_ipv6/ip6t_mh.h
+++ b/include/linux/netfilter_ipv6/ip6t_mh.h
@@ -1,10 +1,12 @@
1#ifndef _IP6T_MH_H 1#ifndef _IP6T_MH_H
2#define _IP6T_MH_H 2#define _IP6T_MH_H
3 3
4#include <linux/types.h>
5
4/* MH matching stuff */ 6/* MH matching stuff */
5struct ip6t_mh { 7struct ip6t_mh {
6 u_int8_t types[2]; /* MH type range */ 8 __u8 types[2]; /* MH type range */
7 u_int8_t invflags; /* Inverse flags */ 9 __u8 invflags; /* Inverse flags */
8}; 10};
9 11
10/* Values for "invflags" field in struct ip6t_mh. */ 12/* Values for "invflags" field in struct ip6t_mh. */
diff --git a/include/linux/netfilter_ipv6/ip6t_opts.h b/include/linux/netfilter_ipv6/ip6t_opts.h
index 62d89bcd9f9c..17d419a811fd 100644
--- a/include/linux/netfilter_ipv6/ip6t_opts.h
+++ b/include/linux/netfilter_ipv6/ip6t_opts.h
@@ -1,14 +1,16 @@
1#ifndef _IP6T_OPTS_H 1#ifndef _IP6T_OPTS_H
2#define _IP6T_OPTS_H 2#define _IP6T_OPTS_H
3 3
4#include <linux/types.h>
5
4#define IP6T_OPTS_OPTSNR 16 6#define IP6T_OPTS_OPTSNR 16
5 7
6struct ip6t_opts { 8struct ip6t_opts {
7 u_int32_t hdrlen; /* Header Length */ 9 __u32 hdrlen; /* Header Length */
8 u_int8_t flags; /* */ 10 __u8 flags; /* */
9 u_int8_t invflags; /* Inverse flags */ 11 __u8 invflags; /* Inverse flags */
10 u_int16_t opts[IP6T_OPTS_OPTSNR]; /* opts */ 12 __u16 opts[IP6T_OPTS_OPTSNR]; /* opts */
11 u_int8_t optsnr; /* Nr of OPts */ 13 __u8 optsnr; /* Nr of OPts */
12}; 14};
13 15
14#define IP6T_OPTS_LEN 0x01 16#define IP6T_OPTS_LEN 0x01
diff --git a/include/linux/netfilter_ipv6/ip6t_rt.h b/include/linux/netfilter_ipv6/ip6t_rt.h
index ab91bfd2cd00..7605a5ff81cd 100644
--- a/include/linux/netfilter_ipv6/ip6t_rt.h
+++ b/include/linux/netfilter_ipv6/ip6t_rt.h
@@ -1,18 +1,19 @@
1#ifndef _IP6T_RT_H 1#ifndef _IP6T_RT_H
2#define _IP6T_RT_H 2#define _IP6T_RT_H
3 3
4#include <linux/types.h>
4/*#include <linux/in6.h>*/ 5/*#include <linux/in6.h>*/
5 6
6#define IP6T_RT_HOPS 16 7#define IP6T_RT_HOPS 16
7 8
8struct ip6t_rt { 9struct ip6t_rt {
9 u_int32_t rt_type; /* Routing Type */ 10 __u32 rt_type; /* Routing Type */
10 u_int32_t segsleft[2]; /* Segments Left */ 11 __u32 segsleft[2]; /* Segments Left */
11 u_int32_t hdrlen; /* Header Length */ 12 __u32 hdrlen; /* Header Length */
12 u_int8_t flags; /* */ 13 __u8 flags; /* */
13 u_int8_t invflags; /* Inverse flags */ 14 __u8 invflags; /* Inverse flags */
14 struct in6_addr addrs[IP6T_RT_HOPS]; /* Hops */ 15 struct in6_addr addrs[IP6T_RT_HOPS]; /* Hops */
15 u_int8_t addrnr; /* Nr of Addresses */ 16 __u8 addrnr; /* Nr of Addresses */
16}; 17};
17 18
18#define IP6T_RT_TYP 0x01 19#define IP6T_RT_TYP 0x01
diff --git a/include/linux/netlink.h b/include/linux/netlink.h
index e2b9e63afa68..4c4ac3f3ce5a 100644
--- a/include/linux/netlink.h
+++ b/include/linux/netlink.h
@@ -160,10 +160,6 @@ struct netlink_skb_parms {
160 struct ucred creds; /* Skb credentials */ 160 struct ucred creds; /* Skb credentials */
161 __u32 pid; 161 __u32 pid;
162 __u32 dst_group; 162 __u32 dst_group;
163 kernel_cap_t eff_cap;
164 __u32 loginuid; /* Login (audit) uid */
165 __u32 sessionid; /* Session id (audit) */
166 __u32 sid; /* SELinux security id */
167}; 163};
168 164
169#define NETLINK_CB(skb) (*(struct netlink_skb_parms*)&((skb)->cb)) 165#define NETLINK_CB(skb) (*(struct netlink_skb_parms*)&((skb)->cb))
diff --git a/include/linux/nl80211.h b/include/linux/nl80211.h
index 821ffb954f14..30022189104d 100644
--- a/include/linux/nl80211.h
+++ b/include/linux/nl80211.h
@@ -1243,6 +1243,8 @@ enum nl80211_rate_info {
1243 * @NL80211_STA_INFO_LLID: the station's mesh LLID 1243 * @NL80211_STA_INFO_LLID: the station's mesh LLID
1244 * @NL80211_STA_INFO_PLID: the station's mesh PLID 1244 * @NL80211_STA_INFO_PLID: the station's mesh PLID
1245 * @NL80211_STA_INFO_PLINK_STATE: peer link state for the station 1245 * @NL80211_STA_INFO_PLINK_STATE: peer link state for the station
1246 * @NL80211_STA_INFO_RX_BITRATE: last unicast data frame rx rate, nested
1247 * attribute, like NL80211_STA_INFO_TX_BITRATE.
1246 * @__NL80211_STA_INFO_AFTER_LAST: internal 1248 * @__NL80211_STA_INFO_AFTER_LAST: internal
1247 * @NL80211_STA_INFO_MAX: highest possible station info attribute 1249 * @NL80211_STA_INFO_MAX: highest possible station info attribute
1248 */ 1250 */
@@ -1261,6 +1263,7 @@ enum nl80211_sta_info {
1261 NL80211_STA_INFO_TX_RETRIES, 1263 NL80211_STA_INFO_TX_RETRIES,
1262 NL80211_STA_INFO_TX_FAILED, 1264 NL80211_STA_INFO_TX_FAILED,
1263 NL80211_STA_INFO_SIGNAL_AVG, 1265 NL80211_STA_INFO_SIGNAL_AVG,
1266 NL80211_STA_INFO_RX_BITRATE,
1264 1267
1265 /* keep last */ 1268 /* keep last */
1266 __NL80211_STA_INFO_AFTER_LAST, 1269 __NL80211_STA_INFO_AFTER_LAST,
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 559d02897075..ff5bccb87136 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -1479,6 +1479,7 @@ void pci_request_acs(void);
1479#define PCI_VPD_RO_KEYWORD_PARTNO "PN" 1479#define PCI_VPD_RO_KEYWORD_PARTNO "PN"
1480#define PCI_VPD_RO_KEYWORD_MFR_ID "MN" 1480#define PCI_VPD_RO_KEYWORD_MFR_ID "MN"
1481#define PCI_VPD_RO_KEYWORD_VENDOR0 "V0" 1481#define PCI_VPD_RO_KEYWORD_VENDOR0 "V0"
1482#define PCI_VPD_RO_KEYWORD_CHKSUM "RV"
1482 1483
1483/** 1484/**
1484 * pci_vpd_lrdt_size - Extracts the Large Resource Data Type length 1485 * pci_vpd_lrdt_size - Extracts the Large Resource Data Type length
diff --git a/include/linux/phonet.h b/include/linux/phonet.h
index 26c8df786918..6fb13841db45 100644
--- a/include/linux/phonet.h
+++ b/include/linux/phonet.h
@@ -36,9 +36,7 @@
36/* Socket options for SOL_PNPIPE level */ 36/* Socket options for SOL_PNPIPE level */
37#define PNPIPE_ENCAP 1 37#define PNPIPE_ENCAP 1
38#define PNPIPE_IFINDEX 2 38#define PNPIPE_IFINDEX 2
39#define PNPIPE_PIPE_HANDLE 3 39#define PNPIPE_HANDLE 3
40#define PNPIPE_ENABLE 4
41/* unused slot */
42 40
43#define PNADDR_ANY 0 41#define PNADDR_ANY 0
44#define PNADDR_BROADCAST 0xFC 42#define PNADDR_BROADCAST 0xFC
diff --git a/include/linux/pkt_sched.h b/include/linux/pkt_sched.h
index 2cfa4bc8dea6..b1032a3fafdc 100644
--- a/include/linux/pkt_sched.h
+++ b/include/linux/pkt_sched.h
@@ -247,6 +247,35 @@ struct tc_gred_sopt {
247 __u16 pad1; 247 __u16 pad1;
248}; 248};
249 249
250/* CHOKe section */
251
252enum {
253 TCA_CHOKE_UNSPEC,
254 TCA_CHOKE_PARMS,
255 TCA_CHOKE_STAB,
256 __TCA_CHOKE_MAX,
257};
258
259#define TCA_CHOKE_MAX (__TCA_CHOKE_MAX - 1)
260
261struct tc_choke_qopt {
262 __u32 limit; /* Hard queue length (packets) */
263 __u32 qth_min; /* Min average threshold (packets) */
264 __u32 qth_max; /* Max average threshold (packets) */
265 unsigned char Wlog; /* log(W) */
266 unsigned char Plog; /* log(P_max/(qth_max-qth_min)) */
267 unsigned char Scell_log; /* cell size for idle damping */
268 unsigned char flags; /* see RED flags */
269};
270
271struct tc_choke_xstats {
272 __u32 early; /* Early drops */
273 __u32 pdrop; /* Drops due to queue limits */
274 __u32 other; /* Drops due to drop() calls */
275 __u32 marked; /* Marked packets */
276 __u32 matched; /* Drops due to flow match */
277};
278
250/* HTB section */ 279/* HTB section */
251#define TC_HTB_NUMPRIO 8 280#define TC_HTB_NUMPRIO 8
252#define TC_HTB_MAXDEPTH 8 281#define TC_HTB_MAXDEPTH 8
@@ -435,6 +464,7 @@ enum {
435 TCA_NETEM_DELAY_DIST, 464 TCA_NETEM_DELAY_DIST,
436 TCA_NETEM_REORDER, 465 TCA_NETEM_REORDER,
437 TCA_NETEM_CORRUPT, 466 TCA_NETEM_CORRUPT,
467 TCA_NETEM_LOSS,
438 __TCA_NETEM_MAX, 468 __TCA_NETEM_MAX,
439}; 469};
440 470
@@ -465,7 +495,33 @@ struct tc_netem_corrupt {
465 __u32 correlation; 495 __u32 correlation;
466}; 496};
467 497
498enum {
499 NETEM_LOSS_UNSPEC,
500 NETEM_LOSS_GI, /* General Intuitive - 4 state model */
501 NETEM_LOSS_GE, /* Gilbert Elliot models */
502 __NETEM_LOSS_MAX
503};
504#define NETEM_LOSS_MAX (__NETEM_LOSS_MAX - 1)
505
506/* State transition probablities for 4 state model */
507struct tc_netem_gimodel {
508 __u32 p13;
509 __u32 p31;
510 __u32 p32;
511 __u32 p14;
512 __u32 p23;
513};
514
515/* Gilbert-Elliot models */
516struct tc_netem_gemodel {
517 __u32 p;
518 __u32 r;
519 __u32 h;
520 __u32 k1;
521};
522
468#define NETEM_DIST_SCALE 8192 523#define NETEM_DIST_SCALE 8192
524#define NETEM_DIST_MAX 16384
469 525
470/* DRR */ 526/* DRR */
471 527
@@ -481,4 +537,55 @@ struct tc_drr_stats {
481 __u32 deficit; 537 __u32 deficit;
482}; 538};
483 539
540/* MQPRIO */
541#define TC_QOPT_BITMASK 15
542#define TC_QOPT_MAX_QUEUE 16
543
544struct tc_mqprio_qopt {
545 __u8 num_tc;
546 __u8 prio_tc_map[TC_QOPT_BITMASK + 1];
547 __u8 hw;
548 __u16 count[TC_QOPT_MAX_QUEUE];
549 __u16 offset[TC_QOPT_MAX_QUEUE];
550};
551
552/* SFB */
553
554enum {
555 TCA_SFB_UNSPEC,
556 TCA_SFB_PARMS,
557 __TCA_SFB_MAX,
558};
559
560#define TCA_SFB_MAX (__TCA_SFB_MAX - 1)
561
562/*
563 * Note: increment, decrement are Q0.16 fixed-point values.
564 */
565struct tc_sfb_qopt {
566 __u32 rehash_interval; /* delay between hash move, in ms */
567 __u32 warmup_time; /* double buffering warmup time in ms (warmup_time < rehash_interval) */
568 __u32 max; /* max len of qlen_min */
569 __u32 bin_size; /* maximum queue length per bin */
570 __u32 increment; /* probability increment, (d1 in Blue) */
571 __u32 decrement; /* probability decrement, (d2 in Blue) */
572 __u32 limit; /* max SFB queue length */
573 __u32 penalty_rate; /* inelastic flows are rate limited to 'rate' pps */
574 __u32 penalty_burst;
575};
576
577struct tc_sfb_xstats {
578 __u32 earlydrop;
579 __u32 penaltydrop;
580 __u32 bucketdrop;
581 __u32 queuedrop;
582 __u32 childdrop; /* drops in child qdisc */
583 __u32 marked;
584 __u32 maxqlen;
585 __u32 maxprob;
586 __u32 avgprob;
587};
588
589#define SFB_MAX_PROB 0xFFFF
590
484#endif 591#endif
diff --git a/include/linux/security.h b/include/linux/security.h
index 83d9227abf02..56cac520d014 100644
--- a/include/linux/security.h
+++ b/include/linux/security.h
@@ -1626,7 +1626,7 @@ struct security_operations {
1626 int (*xfrm_policy_lookup) (struct xfrm_sec_ctx *ctx, u32 fl_secid, u8 dir); 1626 int (*xfrm_policy_lookup) (struct xfrm_sec_ctx *ctx, u32 fl_secid, u8 dir);
1627 int (*xfrm_state_pol_flow_match) (struct xfrm_state *x, 1627 int (*xfrm_state_pol_flow_match) (struct xfrm_state *x,
1628 struct xfrm_policy *xp, 1628 struct xfrm_policy *xp,
1629 struct flowi *fl); 1629 const struct flowi *fl);
1630 int (*xfrm_decode_session) (struct sk_buff *skb, u32 *secid, int ckall); 1630 int (*xfrm_decode_session) (struct sk_buff *skb, u32 *secid, int ckall);
1631#endif /* CONFIG_SECURITY_NETWORK_XFRM */ 1631#endif /* CONFIG_SECURITY_NETWORK_XFRM */
1632 1632
@@ -2767,7 +2767,8 @@ int security_xfrm_state_delete(struct xfrm_state *x);
2767void security_xfrm_state_free(struct xfrm_state *x); 2767void security_xfrm_state_free(struct xfrm_state *x);
2768int security_xfrm_policy_lookup(struct xfrm_sec_ctx *ctx, u32 fl_secid, u8 dir); 2768int security_xfrm_policy_lookup(struct xfrm_sec_ctx *ctx, u32 fl_secid, u8 dir);
2769int security_xfrm_state_pol_flow_match(struct xfrm_state *x, 2769int security_xfrm_state_pol_flow_match(struct xfrm_state *x,
2770 struct xfrm_policy *xp, struct flowi *fl); 2770 struct xfrm_policy *xp,
2771 const struct flowi *fl);
2771int security_xfrm_decode_session(struct sk_buff *skb, u32 *secid); 2772int security_xfrm_decode_session(struct sk_buff *skb, u32 *secid);
2772void security_skb_classify_flow(struct sk_buff *skb, struct flowi *fl); 2773void security_skb_classify_flow(struct sk_buff *skb, struct flowi *fl);
2773 2774
@@ -2819,7 +2820,7 @@ static inline int security_xfrm_policy_lookup(struct xfrm_sec_ctx *ctx, u32 fl_s
2819} 2820}
2820 2821
2821static inline int security_xfrm_state_pol_flow_match(struct xfrm_state *x, 2822static inline int security_xfrm_state_pol_flow_match(struct xfrm_state *x,
2822 struct xfrm_policy *xp, struct flowi *fl) 2823 struct xfrm_policy *xp, const struct flowi *fl)
2823{ 2824{
2824 return 1; 2825 return 1;
2825} 2826}
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index bf221d65d9ad..24cfa626931e 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -388,10 +388,7 @@ struct sk_buff {
388 kmemcheck_bitfield_begin(flags2); 388 kmemcheck_bitfield_begin(flags2);
389 __u16 queue_mapping:16; 389 __u16 queue_mapping:16;
390#ifdef CONFIG_IPV6_NDISC_NODETYPE 390#ifdef CONFIG_IPV6_NDISC_NODETYPE
391 __u8 ndisc_nodetype:2, 391 __u8 ndisc_nodetype:2;
392 deliver_no_wcard:1;
393#else
394 __u8 deliver_no_wcard:1;
395#endif 392#endif
396 __u8 ooo_okay:1; 393 __u8 ooo_okay:1;
397 kmemcheck_bitfield_end(flags2); 394 kmemcheck_bitfield_end(flags2);
@@ -1801,6 +1798,15 @@ static inline int pskb_trim_rcsum(struct sk_buff *skb, unsigned int len)
1801 prefetch(skb->prev), (skb != (struct sk_buff *)(queue)); \ 1798 prefetch(skb->prev), (skb != (struct sk_buff *)(queue)); \
1802 skb = skb->prev) 1799 skb = skb->prev)
1803 1800
1801#define skb_queue_reverse_walk_safe(queue, skb, tmp) \
1802 for (skb = (queue)->prev, tmp = skb->prev; \
1803 skb != (struct sk_buff *)(queue); \
1804 skb = tmp, tmp = skb->prev)
1805
1806#define skb_queue_reverse_walk_from_safe(queue, skb, tmp) \
1807 for (tmp = skb->prev; \
1808 skb != (struct sk_buff *)(queue); \
1809 skb = tmp, tmp = skb->prev)
1804 1810
1805static inline bool skb_has_frag_list(const struct sk_buff *skb) 1811static inline bool skb_has_frag_list(const struct sk_buff *skb)
1806{ 1812{
@@ -1868,7 +1874,7 @@ extern void skb_split(struct sk_buff *skb,
1868extern int skb_shift(struct sk_buff *tgt, struct sk_buff *skb, 1874extern int skb_shift(struct sk_buff *tgt, struct sk_buff *skb,
1869 int shiftlen); 1875 int shiftlen);
1870 1876
1871extern struct sk_buff *skb_segment(struct sk_buff *skb, int features); 1877extern struct sk_buff *skb_segment(struct sk_buff *skb, u32 features);
1872 1878
1873static inline void *skb_header_pointer(const struct sk_buff *skb, int offset, 1879static inline void *skb_header_pointer(const struct sk_buff *skb, int offset,
1874 int len, void *buffer) 1880 int len, void *buffer)
diff --git a/include/linux/sockios.h b/include/linux/sockios.h
index 241f179347d9..7997a506ad41 100644
--- a/include/linux/sockios.h
+++ b/include/linux/sockios.h
@@ -22,7 +22,7 @@
22 22
23/* Linux-specific socket ioctls */ 23/* Linux-specific socket ioctls */
24#define SIOCINQ FIONREAD 24#define SIOCINQ FIONREAD
25#define SIOCOUTQ TIOCOUTQ 25#define SIOCOUTQ TIOCOUTQ /* output queue size (not sent + not acked) */
26 26
27/* Routing table calls. */ 27/* Routing table calls. */
28#define SIOCADDRT 0x890B /* add routing table entry */ 28#define SIOCADDRT 0x890B /* add routing table entry */
@@ -83,6 +83,8 @@
83 83
84#define SIOCWANDEV 0x894A /* get/set netdev parameters */ 84#define SIOCWANDEV 0x894A /* get/set netdev parameters */
85 85
86#define SIOCOUTQNSD 0x894B /* output queue size (not sent only) */
87
86/* ARP cache control calls. */ 88/* ARP cache control calls. */
87 /* 0x8950 - 0x8952 * obsolete calls, don't re-use */ 89 /* 0x8950 - 0x8952 * obsolete calls, don't re-use */
88#define SIOCDARP 0x8953 /* delete ARP table entry */ 90#define SIOCDARP 0x8953 /* delete ARP table entry */
diff --git a/include/linux/ssb/ssb_regs.h b/include/linux/ssb/ssb_regs.h
index 489f7b6d61c5..402955ae48ce 100644
--- a/include/linux/ssb/ssb_regs.h
+++ b/include/linux/ssb/ssb_regs.h
@@ -85,6 +85,8 @@
85#define SSB_IMSTATE_AP_RSV 0x00000030 /* Reserved */ 85#define SSB_IMSTATE_AP_RSV 0x00000030 /* Reserved */
86#define SSB_IMSTATE_IBE 0x00020000 /* In Band Error */ 86#define SSB_IMSTATE_IBE 0x00020000 /* In Band Error */
87#define SSB_IMSTATE_TO 0x00040000 /* Timeout */ 87#define SSB_IMSTATE_TO 0x00040000 /* Timeout */
88#define SSB_IMSTATE_BUSY 0x01800000 /* Busy (Backplane rev >= 2.3 only) */
89#define SSB_IMSTATE_REJECT 0x02000000 /* Reject (Backplane rev >= 2.3 only) */
88#define SSB_INTVEC 0x0F94 /* SB Interrupt Mask */ 90#define SSB_INTVEC 0x0F94 /* SB Interrupt Mask */
89#define SSB_INTVEC_PCI 0x00000001 /* Enable interrupts for PCI */ 91#define SSB_INTVEC_PCI 0x00000001 /* Enable interrupts for PCI */
90#define SSB_INTVEC_ENET0 0x00000002 /* Enable interrupts for enet 0 */ 92#define SSB_INTVEC_ENET0 0x00000002 /* Enable interrupts for enet 0 */
@@ -97,7 +99,6 @@
97#define SSB_TMSLOW_RESET 0x00000001 /* Reset */ 99#define SSB_TMSLOW_RESET 0x00000001 /* Reset */
98#define SSB_TMSLOW_REJECT_22 0x00000002 /* Reject (Backplane rev 2.2) */ 100#define SSB_TMSLOW_REJECT_22 0x00000002 /* Reject (Backplane rev 2.2) */
99#define SSB_TMSLOW_REJECT_23 0x00000004 /* Reject (Backplane rev 2.3) */ 101#define SSB_TMSLOW_REJECT_23 0x00000004 /* Reject (Backplane rev 2.3) */
100#define SSB_TMSLOW_PHYCLK 0x00000010 /* MAC PHY Clock Control Enable */
101#define SSB_TMSLOW_CLOCK 0x00010000 /* Clock Enable */ 102#define SSB_TMSLOW_CLOCK 0x00010000 /* Clock Enable */
102#define SSB_TMSLOW_FGC 0x00020000 /* Force Gated Clocks On */ 103#define SSB_TMSLOW_FGC 0x00020000 /* Force Gated Clocks On */
103#define SSB_TMSLOW_PE 0x40000000 /* Power Management Enable */ 104#define SSB_TMSLOW_PE 0x40000000 /* Power Management Enable */
@@ -268,6 +269,8 @@
268/* SPROM Revision 4 */ 269/* SPROM Revision 4 */
269#define SSB_SPROM4_BFLLO 0x0044 /* Boardflags (low 16 bits) */ 270#define SSB_SPROM4_BFLLO 0x0044 /* Boardflags (low 16 bits) */
270#define SSB_SPROM4_BFLHI 0x0046 /* Board Flags Hi */ 271#define SSB_SPROM4_BFLHI 0x0046 /* Board Flags Hi */
272#define SSB_SPROM4_BFL2LO 0x0048 /* Board flags 2 (low 16 bits) */
273#define SSB_SPROM4_BFL2HI 0x004A /* Board flags 2 Hi */
271#define SSB_SPROM4_IL0MAC 0x004C /* 6 byte MAC address for a/b/g/n */ 274#define SSB_SPROM4_IL0MAC 0x004C /* 6 byte MAC address for a/b/g/n */
272#define SSB_SPROM4_CCODE 0x0052 /* Country Code (2 bytes) */ 275#define SSB_SPROM4_CCODE 0x0052 /* Country Code (2 bytes) */
273#define SSB_SPROM4_GPIOA 0x0056 /* Gen. Purpose IO # 0 and 1 */ 276#define SSB_SPROM4_GPIOA 0x0056 /* Gen. Purpose IO # 0 and 1 */
@@ -358,6 +361,8 @@
358#define SSB_SPROM5_CCODE 0x0044 /* Country Code (2 bytes) */ 361#define SSB_SPROM5_CCODE 0x0044 /* Country Code (2 bytes) */
359#define SSB_SPROM5_BFLLO 0x004A /* Boardflags (low 16 bits) */ 362#define SSB_SPROM5_BFLLO 0x004A /* Boardflags (low 16 bits) */
360#define SSB_SPROM5_BFLHI 0x004C /* Board Flags Hi */ 363#define SSB_SPROM5_BFLHI 0x004C /* Board Flags Hi */
364#define SSB_SPROM5_BFL2LO 0x004E /* Board flags 2 (low 16 bits) */
365#define SSB_SPROM5_BFL2HI 0x0050 /* Board flags 2 Hi */
361#define SSB_SPROM5_IL0MAC 0x0052 /* 6 byte MAC address for a/b/g/n */ 366#define SSB_SPROM5_IL0MAC 0x0052 /* 6 byte MAC address for a/b/g/n */
362#define SSB_SPROM5_GPIOA 0x0076 /* Gen. Purpose IO # 0 and 1 */ 367#define SSB_SPROM5_GPIOA 0x0076 /* Gen. Purpose IO # 0 and 1 */
363#define SSB_SPROM5_GPIOA_P0 0x00FF /* Pin 0 */ 368#define SSB_SPROM5_GPIOA_P0 0x00FF /* Pin 0 */
diff --git a/include/linux/tipc.h b/include/linux/tipc.h
index 1eefa3f6d1f4..a5b994a204d2 100644
--- a/include/linux/tipc.h
+++ b/include/linux/tipc.h
@@ -2,7 +2,7 @@
2 * include/linux/tipc.h: Include file for TIPC socket interface 2 * include/linux/tipc.h: Include file for TIPC socket interface
3 * 3 *
4 * Copyright (c) 2003-2006, Ericsson AB 4 * Copyright (c) 2003-2006, Ericsson AB
5 * Copyright (c) 2005, Wind River Systems 5 * Copyright (c) 2005, 2010-2011, Wind River Systems
6 * All rights reserved. 6 * All rights reserved.
7 * 7 *
8 * Redistribution and use in source and binary forms, with or without 8 * Redistribution and use in source and binary forms, with or without
@@ -130,12 +130,6 @@ static inline unsigned int tipc_node(__u32 addr)
130#define TIPC_SUB_PORTS 0x01 /* filter for port availability */ 130#define TIPC_SUB_PORTS 0x01 /* filter for port availability */
131#define TIPC_SUB_SERVICE 0x02 /* filter for service availability */ 131#define TIPC_SUB_SERVICE 0x02 /* filter for service availability */
132#define TIPC_SUB_CANCEL 0x04 /* cancel a subscription */ 132#define TIPC_SUB_CANCEL 0x04 /* cancel a subscription */
133#if 0
134/* The following filter options are not currently implemented */
135#define TIPC_SUB_NO_BIND_EVTS 0x04 /* filter out "publish" events */
136#define TIPC_SUB_NO_UNBIND_EVTS 0x08 /* filter out "withdraw" events */
137#define TIPC_SUB_SINGLE_EVT 0x10 /* expire after first event */
138#endif
139 133
140#define TIPC_WAIT_FOREVER (~0) /* timeout for permanent subscription */ 134#define TIPC_WAIT_FOREVER (~0) /* timeout for permanent subscription */
141 135
diff --git a/include/linux/tipc_config.h b/include/linux/tipc_config.h
index 7d42460a5e3c..0db239590b4d 100644
--- a/include/linux/tipc_config.h
+++ b/include/linux/tipc_config.h
@@ -2,7 +2,7 @@
2 * include/linux/tipc_config.h: Include file for TIPC configuration interface 2 * include/linux/tipc_config.h: Include file for TIPC configuration interface
3 * 3 *
4 * Copyright (c) 2003-2006, Ericsson AB 4 * Copyright (c) 2003-2006, Ericsson AB
5 * Copyright (c) 2005-2007, Wind River Systems 5 * Copyright (c) 2005-2007, 2010-2011, Wind River Systems
6 * All rights reserved. 6 * All rights reserved.
7 * 7 *
8 * Redistribution and use in source and binary forms, with or without 8 * Redistribution and use in source and binary forms, with or without
@@ -76,13 +76,6 @@
76#define TIPC_CMD_SHOW_LINK_STATS 0x000B /* tx link_name, rx ultra_string */ 76#define TIPC_CMD_SHOW_LINK_STATS 0x000B /* tx link_name, rx ultra_string */
77#define TIPC_CMD_SHOW_STATS 0x000F /* tx unsigned, rx ultra_string */ 77#define TIPC_CMD_SHOW_STATS 0x000F /* tx unsigned, rx ultra_string */
78 78
79#if 0
80#define TIPC_CMD_SHOW_PORT_STATS 0x0008 /* tx port_ref, rx ultra_string */
81#define TIPC_CMD_RESET_PORT_STATS 0x0009 /* tx port_ref, rx none */
82#define TIPC_CMD_GET_ROUTES 0x000A /* tx ?, rx ? */
83#define TIPC_CMD_GET_LINK_PEER 0x000D /* tx link_name, rx ? */
84#endif
85
86/* 79/*
87 * Protected commands: 80 * Protected commands:
88 * May only be issued by "network administration capable" process. 81 * May only be issued by "network administration capable" process.
@@ -96,7 +89,7 @@
96#define TIPC_CMD_GET_MAX_SUBSCR 0x4006 /* tx none, rx unsigned */ 89#define TIPC_CMD_GET_MAX_SUBSCR 0x4006 /* tx none, rx unsigned */
97#define TIPC_CMD_GET_MAX_ZONES 0x4007 /* obsoleted */ 90#define TIPC_CMD_GET_MAX_ZONES 0x4007 /* obsoleted */
98#define TIPC_CMD_GET_MAX_CLUSTERS 0x4008 /* obsoleted */ 91#define TIPC_CMD_GET_MAX_CLUSTERS 0x4008 /* obsoleted */
99#define TIPC_CMD_GET_MAX_NODES 0x4009 /* tx none, rx unsigned */ 92#define TIPC_CMD_GET_MAX_NODES 0x4009 /* obsoleted */
100#define TIPC_CMD_GET_MAX_SLAVES 0x400A /* obsoleted */ 93#define TIPC_CMD_GET_MAX_SLAVES 0x400A /* obsoleted */
101#define TIPC_CMD_GET_NETID 0x400B /* tx none, rx unsigned */ 94#define TIPC_CMD_GET_NETID 0x400B /* tx none, rx unsigned */
102 95
@@ -109,13 +102,6 @@
109#define TIPC_CMD_DUMP_LOG 0x410B /* tx none, rx ultra_string */ 102#define TIPC_CMD_DUMP_LOG 0x410B /* tx none, rx ultra_string */
110#define TIPC_CMD_RESET_LINK_STATS 0x410C /* tx link_name, rx none */ 103#define TIPC_CMD_RESET_LINK_STATS 0x410C /* tx link_name, rx none */
111 104
112#if 0
113#define TIPC_CMD_CREATE_LINK 0x4103 /* tx link_create, rx none */
114#define TIPC_CMD_REMOVE_LINK 0x4104 /* tx link_name, rx none */
115#define TIPC_CMD_BLOCK_LINK 0x4105 /* tx link_name, rx none */
116#define TIPC_CMD_UNBLOCK_LINK 0x4106 /* tx link_name, rx none */
117#endif
118
119/* 105/*
120 * Private commands: 106 * Private commands:
121 * May only be issued by "network administration capable" process. 107 * May only be issued by "network administration capable" process.
@@ -123,16 +109,13 @@
123 */ 109 */
124 110
125#define TIPC_CMD_SET_NODE_ADDR 0x8001 /* tx net_addr, rx none */ 111#define TIPC_CMD_SET_NODE_ADDR 0x8001 /* tx net_addr, rx none */
126#if 0
127#define TIPC_CMD_SET_ZONE_MASTER 0x8002 /* tx none, rx none */
128#endif
129#define TIPC_CMD_SET_REMOTE_MNG 0x8003 /* tx unsigned, rx none */ 112#define TIPC_CMD_SET_REMOTE_MNG 0x8003 /* tx unsigned, rx none */
130#define TIPC_CMD_SET_MAX_PORTS 0x8004 /* tx unsigned, rx none */ 113#define TIPC_CMD_SET_MAX_PORTS 0x8004 /* tx unsigned, rx none */
131#define TIPC_CMD_SET_MAX_PUBL 0x8005 /* tx unsigned, rx none */ 114#define TIPC_CMD_SET_MAX_PUBL 0x8005 /* tx unsigned, rx none */
132#define TIPC_CMD_SET_MAX_SUBSCR 0x8006 /* tx unsigned, rx none */ 115#define TIPC_CMD_SET_MAX_SUBSCR 0x8006 /* tx unsigned, rx none */
133#define TIPC_CMD_SET_MAX_ZONES 0x8007 /* obsoleted */ 116#define TIPC_CMD_SET_MAX_ZONES 0x8007 /* obsoleted */
134#define TIPC_CMD_SET_MAX_CLUSTERS 0x8008 /* obsoleted */ 117#define TIPC_CMD_SET_MAX_CLUSTERS 0x8008 /* obsoleted */
135#define TIPC_CMD_SET_MAX_NODES 0x8009 /* tx unsigned, rx none */ 118#define TIPC_CMD_SET_MAX_NODES 0x8009 /* obsoleted */
136#define TIPC_CMD_SET_MAX_SLAVES 0x800A /* obsoleted */ 119#define TIPC_CMD_SET_MAX_SLAVES 0x800A /* obsoleted */
137#define TIPC_CMD_SET_NETID 0x800B /* tx unsigned, rx none */ 120#define TIPC_CMD_SET_NETID 0x800B /* tx unsigned, rx none */
138 121
@@ -193,6 +176,10 @@
193#define TIPC_DEF_LINK_TOL 1500 176#define TIPC_DEF_LINK_TOL 1500
194#define TIPC_MAX_LINK_TOL 30000 177#define TIPC_MAX_LINK_TOL 30000
195 178
179#if (TIPC_MIN_LINK_TOL < 16)
180#error "TIPC_MIN_LINK_TOL is too small (abort limit may be NaN)"
181#endif
182
196/* 183/*
197 * Link window limits (min, default, max), in packets 184 * Link window limits (min, default, max), in packets
198 */ 185 */
@@ -215,7 +202,7 @@ struct tipc_link_info {
215 202
216struct tipc_bearer_config { 203struct tipc_bearer_config {
217 __be32 priority; /* Range [1,31]. Override per link */ 204 __be32 priority; /* Range [1,31]. Override per link */
218 __be32 detect_scope; 205 __be32 disc_domain; /* <Z.C.N> describing desired nodes */
219 char name[TIPC_MAX_BEARER_NAME]; 206 char name[TIPC_MAX_BEARER_NAME];
220}; 207};
221 208
@@ -247,15 +234,6 @@ struct tipc_name_table_query {
247#define TIPC_CFG_NOT_SUPPORTED "\x84" /* request is not supported by TIPC */ 234#define TIPC_CFG_NOT_SUPPORTED "\x84" /* request is not supported by TIPC */
248#define TIPC_CFG_INVALID_VALUE "\x85" /* request has invalid argument value */ 235#define TIPC_CFG_INVALID_VALUE "\x85" /* request has invalid argument value */
249 236
250#if 0
251/* prototypes TLV structures for proposed commands */
252struct tipc_link_create {
253 __u32 domain;
254 struct tipc_media_addr peer_addr;
255 char bearer_name[TIPC_MAX_BEARER_NAME];
256};
257#endif
258
259/* 237/*
260 * A TLV consists of a descriptor, followed by the TLV value. 238 * A TLV consists of a descriptor, followed by the TLV value.
261 * TLV descriptor fields are stored in network byte order; 239 * TLV descriptor fields are stored in network byte order;
diff --git a/include/linux/xfrm.h b/include/linux/xfrm.h
index 930fdd2de79c..22e61fdf75a2 100644
--- a/include/linux/xfrm.h
+++ b/include/linux/xfrm.h
@@ -84,6 +84,16 @@ struct xfrm_replay_state {
84 __u32 bitmap; 84 __u32 bitmap;
85}; 85};
86 86
87struct xfrm_replay_state_esn {
88 unsigned int bmp_len;
89 __u32 oseq;
90 __u32 seq;
91 __u32 oseq_hi;
92 __u32 seq_hi;
93 __u32 replay_window;
94 __u32 bmp[0];
95};
96
87struct xfrm_algo { 97struct xfrm_algo {
88 char alg_name[64]; 98 char alg_name[64];
89 unsigned int alg_key_len; /* in bits */ 99 unsigned int alg_key_len; /* in bits */
@@ -284,6 +294,7 @@ enum xfrm_attr_type_t {
284 XFRMA_ALG_AUTH_TRUNC, /* struct xfrm_algo_auth */ 294 XFRMA_ALG_AUTH_TRUNC, /* struct xfrm_algo_auth */
285 XFRMA_MARK, /* struct xfrm_mark */ 295 XFRMA_MARK, /* struct xfrm_mark */
286 XFRMA_TFCPAD, /* __u32 */ 296 XFRMA_TFCPAD, /* __u32 */
297 XFRMA_REPLAY_ESN_VAL, /* struct xfrm_replay_esn */
287 __XFRMA_MAX 298 __XFRMA_MAX
288 299
289#define XFRMA_MAX (__XFRMA_MAX - 1) 300#define XFRMA_MAX (__XFRMA_MAX - 1)
@@ -350,6 +361,8 @@ struct xfrm_usersa_info {
350#define XFRM_STATE_WILDRECV 8 361#define XFRM_STATE_WILDRECV 8
351#define XFRM_STATE_ICMP 16 362#define XFRM_STATE_ICMP 16
352#define XFRM_STATE_AF_UNSPEC 32 363#define XFRM_STATE_AF_UNSPEC 32
364#define XFRM_STATE_ALIGN4 64
365#define XFRM_STATE_ESN 128
353}; 366};
354 367
355struct xfrm_usersa_id { 368struct xfrm_usersa_id {
diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h
index 0c5e72503b77..43750439c521 100644
--- a/include/net/bluetooth/bluetooth.h
+++ b/include/net/bluetooth/bluetooth.h
@@ -64,6 +64,11 @@ struct bt_security {
64 64
65#define BT_DEFER_SETUP 7 65#define BT_DEFER_SETUP 7
66 66
67#define BT_FLUSHABLE 8
68
69#define BT_FLUSHABLE_OFF 0
70#define BT_FLUSHABLE_ON 1
71
67#define BT_INFO(fmt, arg...) printk(KERN_INFO "Bluetooth: " fmt "\n" , ## arg) 72#define BT_INFO(fmt, arg...) printk(KERN_INFO "Bluetooth: " fmt "\n" , ## arg)
68#define BT_ERR(fmt, arg...) printk(KERN_ERR "%s: " fmt "\n" , __func__ , ## arg) 73#define BT_ERR(fmt, arg...) printk(KERN_ERR "%s: " fmt "\n" , __func__ , ## arg)
69#define BT_DBG(fmt, arg...) pr_debug("%s: " fmt "\n" , __func__ , ## arg) 74#define BT_DBG(fmt, arg...) pr_debug("%s: " fmt "\n" , __func__ , ## arg)
@@ -200,4 +205,32 @@ extern void bt_sysfs_cleanup(void);
200 205
201extern struct dentry *bt_debugfs; 206extern struct dentry *bt_debugfs;
202 207
208#ifdef CONFIG_BT_L2CAP
209int l2cap_init(void);
210void l2cap_exit(void);
211#else
212static inline int l2cap_init(void)
213{
214 return 0;
215}
216
217static inline void l2cap_exit(void)
218{
219}
220#endif
221
222#ifdef CONFIG_BT_SCO
223int sco_init(void);
224void sco_exit(void);
225#else
226static inline int sco_init(void)
227{
228 return 0;
229}
230
231static inline void sco_exit(void)
232{
233}
234#endif
235
203#endif /* __BLUETOOTH_H */ 236#endif /* __BLUETOOTH_H */
diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h
index 29a7a8ca0438..ec6acf2f1c0b 100644
--- a/include/net/bluetooth/hci.h
+++ b/include/net/bluetooth/hci.h
@@ -76,6 +76,14 @@ enum {
76 HCI_INQUIRY, 76 HCI_INQUIRY,
77 77
78 HCI_RAW, 78 HCI_RAW,
79
80 HCI_SETUP,
81 HCI_AUTO_OFF,
82 HCI_MGMT,
83 HCI_PAIRABLE,
84 HCI_SERVICE_CACHE,
85 HCI_LINK_KEYS,
86 HCI_DEBUG_KEYS,
79}; 87};
80 88
81/* HCI ioctl defines */ 89/* HCI ioctl defines */
@@ -111,6 +119,7 @@ enum {
111#define HCI_PAIRING_TIMEOUT (60000) /* 60 seconds */ 119#define HCI_PAIRING_TIMEOUT (60000) /* 60 seconds */
112#define HCI_IDLE_TIMEOUT (6000) /* 6 seconds */ 120#define HCI_IDLE_TIMEOUT (6000) /* 6 seconds */
113#define HCI_INIT_TIMEOUT (10000) /* 10 seconds */ 121#define HCI_INIT_TIMEOUT (10000) /* 10 seconds */
122#define HCI_CMD_TIMEOUT (1000) /* 1 seconds */
114 123
115/* HCI data types */ 124/* HCI data types */
116#define HCI_COMMAND_PKT 0x01 125#define HCI_COMMAND_PKT 0x01
@@ -150,6 +159,7 @@ enum {
150#define EDR_ESCO_MASK (ESCO_2EV3 | ESCO_3EV3 | ESCO_2EV5 | ESCO_3EV5) 159#define EDR_ESCO_MASK (ESCO_2EV3 | ESCO_3EV3 | ESCO_2EV5 | ESCO_3EV5)
151 160
152/* ACL flags */ 161/* ACL flags */
162#define ACL_START_NO_FLUSH 0x00
153#define ACL_CONT 0x01 163#define ACL_CONT 0x01
154#define ACL_START 0x02 164#define ACL_START 0x02
155#define ACL_ACTIVE_BCAST 0x04 165#define ACL_ACTIVE_BCAST 0x04
@@ -159,6 +169,8 @@ enum {
159#define SCO_LINK 0x00 169#define SCO_LINK 0x00
160#define ACL_LINK 0x01 170#define ACL_LINK 0x01
161#define ESCO_LINK 0x02 171#define ESCO_LINK 0x02
172/* Low Energy links do not have defined link type. Use invented one */
173#define LE_LINK 0x80
162 174
163/* LMP features */ 175/* LMP features */
164#define LMP_3SLOT 0x01 176#define LMP_3SLOT 0x01
@@ -183,17 +195,25 @@ enum {
183#define LMP_PSCHEME 0x02 195#define LMP_PSCHEME 0x02
184#define LMP_PCONTROL 0x04 196#define LMP_PCONTROL 0x04
185 197
198#define LMP_RSSI_INQ 0x40
186#define LMP_ESCO 0x80 199#define LMP_ESCO 0x80
187 200
188#define LMP_EV4 0x01 201#define LMP_EV4 0x01
189#define LMP_EV5 0x02 202#define LMP_EV5 0x02
203#define LMP_LE 0x40
190 204
191#define LMP_SNIFF_SUBR 0x02 205#define LMP_SNIFF_SUBR 0x02
206#define LMP_PAUSE_ENC 0x04
192#define LMP_EDR_ESCO_2M 0x20 207#define LMP_EDR_ESCO_2M 0x20
193#define LMP_EDR_ESCO_3M 0x40 208#define LMP_EDR_ESCO_3M 0x40
194#define LMP_EDR_3S_ESCO 0x80 209#define LMP_EDR_3S_ESCO 0x80
195 210
211#define LMP_EXT_INQ 0x01
196#define LMP_SIMPLE_PAIR 0x08 212#define LMP_SIMPLE_PAIR 0x08
213#define LMP_NO_FLUSH 0x40
214
215#define LMP_LSTO 0x01
216#define LMP_INQ_TX_PWR 0x02
197 217
198/* Connection modes */ 218/* Connection modes */
199#define HCI_CM_ACTIVE 0x0000 219#define HCI_CM_ACTIVE 0x0000
@@ -225,6 +245,8 @@ enum {
225#define HCI_AT_GENERAL_BONDING_MITM 0x05 245#define HCI_AT_GENERAL_BONDING_MITM 0x05
226 246
227/* ----- HCI Commands ---- */ 247/* ----- HCI Commands ---- */
248#define HCI_OP_NOP 0x0000
249
228#define HCI_OP_INQUIRY 0x0401 250#define HCI_OP_INQUIRY 0x0401
229struct hci_cp_inquiry { 251struct hci_cp_inquiry {
230 __u8 lap[3]; 252 __u8 lap[3];
@@ -292,11 +314,19 @@ struct hci_cp_pin_code_reply {
292 __u8 pin_len; 314 __u8 pin_len;
293 __u8 pin_code[16]; 315 __u8 pin_code[16];
294} __packed; 316} __packed;
317struct hci_rp_pin_code_reply {
318 __u8 status;
319 bdaddr_t bdaddr;
320} __packed;
295 321
296#define HCI_OP_PIN_CODE_NEG_REPLY 0x040e 322#define HCI_OP_PIN_CODE_NEG_REPLY 0x040e
297struct hci_cp_pin_code_neg_reply { 323struct hci_cp_pin_code_neg_reply {
298 bdaddr_t bdaddr; 324 bdaddr_t bdaddr;
299} __packed; 325} __packed;
326struct hci_rp_pin_code_neg_reply {
327 __u8 status;
328 bdaddr_t bdaddr;
329} __packed;
300 330
301#define HCI_OP_CHANGE_CONN_PTYPE 0x040f 331#define HCI_OP_CHANGE_CONN_PTYPE 0x040f
302struct hci_cp_change_conn_ptype { 332struct hci_cp_change_conn_ptype {
@@ -377,6 +407,31 @@ struct hci_cp_reject_sync_conn_req {
377 __u8 reason; 407 __u8 reason;
378} __packed; 408} __packed;
379 409
410#define HCI_OP_IO_CAPABILITY_REPLY 0x042b
411struct hci_cp_io_capability_reply {
412 bdaddr_t bdaddr;
413 __u8 capability;
414 __u8 oob_data;
415 __u8 authentication;
416} __packed;
417
418#define HCI_OP_USER_CONFIRM_REPLY 0x042c
419struct hci_cp_user_confirm_reply {
420 bdaddr_t bdaddr;
421} __packed;
422struct hci_rp_user_confirm_reply {
423 __u8 status;
424 bdaddr_t bdaddr;
425} __packed;
426
427#define HCI_OP_USER_CONFIRM_NEG_REPLY 0x042d
428
429#define HCI_OP_IO_CAPABILITY_NEG_REPLY 0x0434
430struct hci_cp_io_capability_neg_reply {
431 bdaddr_t bdaddr;
432 __u8 reason;
433} __packed;
434
380#define HCI_OP_SNIFF_MODE 0x0803 435#define HCI_OP_SNIFF_MODE 0x0803
381struct hci_cp_sniff_mode { 436struct hci_cp_sniff_mode {
382 __le16 handle; 437 __le16 handle;
@@ -474,6 +529,12 @@ struct hci_cp_set_event_flt {
474#define HCI_CONN_SETUP_AUTO_OFF 0x01 529#define HCI_CONN_SETUP_AUTO_OFF 0x01
475#define HCI_CONN_SETUP_AUTO_ON 0x02 530#define HCI_CONN_SETUP_AUTO_ON 0x02
476 531
532#define HCI_OP_DELETE_STORED_LINK_KEY 0x0c12
533struct hci_cp_delete_stored_link_key {
534 bdaddr_t bdaddr;
535 __u8 delete_all;
536} __packed;
537
477#define HCI_OP_WRITE_LOCAL_NAME 0x0c13 538#define HCI_OP_WRITE_LOCAL_NAME 0x0c13
478struct hci_cp_write_local_name { 539struct hci_cp_write_local_name {
479 __u8 name[248]; 540 __u8 name[248];
@@ -537,6 +598,8 @@ struct hci_cp_host_buffer_size {
537 __le16 sco_max_pkt; 598 __le16 sco_max_pkt;
538} __packed; 599} __packed;
539 600
601#define HCI_OP_WRITE_INQUIRY_MODE 0x0c45
602
540#define HCI_OP_READ_SSP_MODE 0x0c55 603#define HCI_OP_READ_SSP_MODE 0x0c55
541struct hci_rp_read_ssp_mode { 604struct hci_rp_read_ssp_mode {
542 __u8 status; 605 __u8 status;
@@ -548,6 +611,8 @@ struct hci_cp_write_ssp_mode {
548 __u8 mode; 611 __u8 mode;
549} __packed; 612} __packed;
550 613
614#define HCI_OP_READ_INQ_RSP_TX_POWER 0x0c58
615
551#define HCI_OP_READ_LOCAL_VERSION 0x1001 616#define HCI_OP_READ_LOCAL_VERSION 0x1001
552struct hci_rp_read_local_version { 617struct hci_rp_read_local_version {
553 __u8 status; 618 __u8 status;
@@ -593,6 +658,47 @@ struct hci_rp_read_bd_addr {
593 bdaddr_t bdaddr; 658 bdaddr_t bdaddr;
594} __packed; 659} __packed;
595 660
661#define HCI_OP_LE_SET_EVENT_MASK 0x2001
662struct hci_cp_le_set_event_mask {
663 __u8 mask[8];
664} __packed;
665
666#define HCI_OP_LE_READ_BUFFER_SIZE 0x2002
667struct hci_rp_le_read_buffer_size {
668 __u8 status;
669 __le16 le_mtu;
670 __u8 le_max_pkt;
671} __packed;
672
673#define HCI_OP_LE_CREATE_CONN 0x200d
674struct hci_cp_le_create_conn {
675 __le16 scan_interval;
676 __le16 scan_window;
677 __u8 filter_policy;
678 __u8 peer_addr_type;
679 bdaddr_t peer_addr;
680 __u8 own_address_type;
681 __le16 conn_interval_min;
682 __le16 conn_interval_max;
683 __le16 conn_latency;
684 __le16 supervision_timeout;
685 __le16 min_ce_len;
686 __le16 max_ce_len;
687} __packed;
688
689#define HCI_OP_LE_CREATE_CONN_CANCEL 0x200e
690
691#define HCI_OP_LE_CONN_UPDATE 0x2013
692struct hci_cp_le_conn_update {
693 __le16 handle;
694 __le16 conn_interval_min;
695 __le16 conn_interval_max;
696 __le16 conn_latency;
697 __le16 supervision_timeout;
698 __le16 min_ce_len;
699 __le16 max_ce_len;
700} __packed;
701
596/* ---- HCI Events ---- */ 702/* ---- HCI Events ---- */
597#define HCI_EV_INQUIRY_COMPLETE 0x01 703#define HCI_EV_INQUIRY_COMPLETE 0x01
598 704
@@ -833,6 +939,20 @@ struct hci_ev_io_capa_request {
833 bdaddr_t bdaddr; 939 bdaddr_t bdaddr;
834} __packed; 940} __packed;
835 941
942#define HCI_EV_IO_CAPA_REPLY 0x32
943struct hci_ev_io_capa_reply {
944 bdaddr_t bdaddr;
945 __u8 capability;
946 __u8 oob_data;
947 __u8 authentication;
948} __packed;
949
950#define HCI_EV_USER_CONFIRM_REQUEST 0x33
951struct hci_ev_user_confirm_req {
952 bdaddr_t bdaddr;
953 __le32 passkey;
954} __packed;
955
836#define HCI_EV_SIMPLE_PAIR_COMPLETE 0x36 956#define HCI_EV_SIMPLE_PAIR_COMPLETE 0x36
837struct hci_ev_simple_pair_complete { 957struct hci_ev_simple_pair_complete {
838 __u8 status; 958 __u8 status;
@@ -845,6 +965,25 @@ struct hci_ev_remote_host_features {
845 __u8 features[8]; 965 __u8 features[8];
846} __packed; 966} __packed;
847 967
968#define HCI_EV_LE_META 0x3e
969struct hci_ev_le_meta {
970 __u8 subevent;
971} __packed;
972
973/* Low energy meta events */
974#define HCI_EV_LE_CONN_COMPLETE 0x01
975struct hci_ev_le_conn_complete {
976 __u8 status;
977 __le16 handle;
978 __u8 role;
979 __u8 bdaddr_type;
980 bdaddr_t bdaddr;
981 __le16 interval;
982 __le16 latency;
983 __le16 supervision_timeout;
984 __u8 clk_accurancy;
985} __packed;
986
848/* Internal events generated by Bluetooth stack */ 987/* Internal events generated by Bluetooth stack */
849#define HCI_EV_STACK_INTERNAL 0xfd 988#define HCI_EV_STACK_INTERNAL 0xfd
850struct hci_ev_stack_internal { 989struct hci_ev_stack_internal {
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
index d2cf88407690..441dadbf6a89 100644
--- a/include/net/bluetooth/hci_core.h
+++ b/include/net/bluetooth/hci_core.h
@@ -60,12 +60,28 @@ struct hci_conn_hash {
60 spinlock_t lock; 60 spinlock_t lock;
61 unsigned int acl_num; 61 unsigned int acl_num;
62 unsigned int sco_num; 62 unsigned int sco_num;
63 unsigned int le_num;
63}; 64};
64 65
65struct bdaddr_list { 66struct bdaddr_list {
66 struct list_head list; 67 struct list_head list;
67 bdaddr_t bdaddr; 68 bdaddr_t bdaddr;
68}; 69};
70
71struct bt_uuid {
72 struct list_head list;
73 u8 uuid[16];
74 u8 svc_hint;
75};
76
77struct link_key {
78 struct list_head list;
79 bdaddr_t bdaddr;
80 u8 type;
81 u8 val[16];
82 u8 pin_len;
83};
84
69#define NUM_REASSEMBLY 4 85#define NUM_REASSEMBLY 4
70struct hci_dev { 86struct hci_dev {
71 struct list_head list; 87 struct list_head list;
@@ -80,13 +96,18 @@ struct hci_dev {
80 bdaddr_t bdaddr; 96 bdaddr_t bdaddr;
81 __u8 dev_name[248]; 97 __u8 dev_name[248];
82 __u8 dev_class[3]; 98 __u8 dev_class[3];
99 __u8 major_class;
100 __u8 minor_class;
83 __u8 features[8]; 101 __u8 features[8];
84 __u8 commands[64]; 102 __u8 commands[64];
85 __u8 ssp_mode; 103 __u8 ssp_mode;
86 __u8 hci_ver; 104 __u8 hci_ver;
87 __u16 hci_rev; 105 __u16 hci_rev;
106 __u8 lmp_ver;
88 __u16 manufacturer; 107 __u16 manufacturer;
108 __le16 lmp_subver;
89 __u16 voice_setting; 109 __u16 voice_setting;
110 __u8 io_capability;
90 111
91 __u16 pkt_type; 112 __u16 pkt_type;
92 __u16 esco_type; 113 __u16 esco_type;
@@ -102,18 +123,26 @@ struct hci_dev {
102 atomic_t cmd_cnt; 123 atomic_t cmd_cnt;
103 unsigned int acl_cnt; 124 unsigned int acl_cnt;
104 unsigned int sco_cnt; 125 unsigned int sco_cnt;
126 unsigned int le_cnt;
105 127
106 unsigned int acl_mtu; 128 unsigned int acl_mtu;
107 unsigned int sco_mtu; 129 unsigned int sco_mtu;
130 unsigned int le_mtu;
108 unsigned int acl_pkts; 131 unsigned int acl_pkts;
109 unsigned int sco_pkts; 132 unsigned int sco_pkts;
133 unsigned int le_pkts;
110 134
111 unsigned long cmd_last_tx;
112 unsigned long acl_last_tx; 135 unsigned long acl_last_tx;
113 unsigned long sco_last_tx; 136 unsigned long sco_last_tx;
137 unsigned long le_last_tx;
114 138
115 struct workqueue_struct *workqueue; 139 struct workqueue_struct *workqueue;
116 140
141 struct work_struct power_on;
142 struct work_struct power_off;
143 struct timer_list off_timer;
144
145 struct timer_list cmd_timer;
117 struct tasklet_struct cmd_task; 146 struct tasklet_struct cmd_task;
118 struct tasklet_struct rx_task; 147 struct tasklet_struct rx_task;
119 struct tasklet_struct tx_task; 148 struct tasklet_struct tx_task;
@@ -129,12 +158,17 @@ struct hci_dev {
129 wait_queue_head_t req_wait_q; 158 wait_queue_head_t req_wait_q;
130 __u32 req_status; 159 __u32 req_status;
131 __u32 req_result; 160 __u32 req_result;
132 __u16 req_last_cmd; 161
162 __u16 init_last_cmd;
133 163
134 struct inquiry_cache inq_cache; 164 struct inquiry_cache inq_cache;
135 struct hci_conn_hash conn_hash; 165 struct hci_conn_hash conn_hash;
136 struct list_head blacklist; 166 struct list_head blacklist;
137 167
168 struct list_head uuids;
169
170 struct list_head link_keys;
171
138 struct hci_dev_stats stat; 172 struct hci_dev_stats stat;
139 173
140 struct sk_buff_head driver_init; 174 struct sk_buff_head driver_init;
@@ -165,31 +199,37 @@ struct hci_dev {
165struct hci_conn { 199struct hci_conn {
166 struct list_head list; 200 struct list_head list;
167 201
168 atomic_t refcnt; 202 atomic_t refcnt;
169 spinlock_t lock; 203 spinlock_t lock;
170 204
171 bdaddr_t dst; 205 bdaddr_t dst;
172 __u16 handle; 206 __u16 handle;
173 __u16 state; 207 __u16 state;
174 __u8 mode; 208 __u8 mode;
175 __u8 type; 209 __u8 type;
176 __u8 out; 210 __u8 out;
177 __u8 attempt; 211 __u8 attempt;
178 __u8 dev_class[3]; 212 __u8 dev_class[3];
179 __u8 features[8]; 213 __u8 features[8];
180 __u8 ssp_mode; 214 __u8 ssp_mode;
181 __u16 interval; 215 __u16 interval;
182 __u16 pkt_type; 216 __u16 pkt_type;
183 __u16 link_policy; 217 __u16 link_policy;
184 __u32 link_mode; 218 __u32 link_mode;
185 __u8 auth_type; 219 __u8 auth_type;
186 __u8 sec_level; 220 __u8 sec_level;
187 __u8 pending_sec_level; 221 __u8 pending_sec_level;
188 __u8 power_save; 222 __u8 pin_length;
189 __u16 disc_timeout; 223 __u8 io_capability;
190 unsigned long pend; 224 __u8 power_save;
191 225 __u16 disc_timeout;
192 unsigned int sent; 226 unsigned long pend;
227
228 __u8 remote_cap;
229 __u8 remote_oob;
230 __u8 remote_auth;
231
232 unsigned int sent;
193 233
194 struct sk_buff_head data_q; 234 struct sk_buff_head data_q;
195 235
@@ -208,6 +248,10 @@ struct hci_conn {
208 void *priv; 248 void *priv;
209 249
210 struct hci_conn *link; 250 struct hci_conn *link;
251
252 void (*connect_cfm_cb) (struct hci_conn *conn, u8 status);
253 void (*security_cfm_cb) (struct hci_conn *conn, u8 status);
254 void (*disconn_cfm_cb) (struct hci_conn *conn, u8 reason);
211}; 255};
212 256
213extern struct hci_proto *hci_proto[]; 257extern struct hci_proto *hci_proto[];
@@ -274,24 +318,40 @@ static inline void hci_conn_hash_add(struct hci_dev *hdev, struct hci_conn *c)
274{ 318{
275 struct hci_conn_hash *h = &hdev->conn_hash; 319 struct hci_conn_hash *h = &hdev->conn_hash;
276 list_add(&c->list, &h->list); 320 list_add(&c->list, &h->list);
277 if (c->type == ACL_LINK) 321 switch (c->type) {
322 case ACL_LINK:
278 h->acl_num++; 323 h->acl_num++;
279 else 324 break;
325 case LE_LINK:
326 h->le_num++;
327 break;
328 case SCO_LINK:
329 case ESCO_LINK:
280 h->sco_num++; 330 h->sco_num++;
331 break;
332 }
281} 333}
282 334
283static inline void hci_conn_hash_del(struct hci_dev *hdev, struct hci_conn *c) 335static inline void hci_conn_hash_del(struct hci_dev *hdev, struct hci_conn *c)
284{ 336{
285 struct hci_conn_hash *h = &hdev->conn_hash; 337 struct hci_conn_hash *h = &hdev->conn_hash;
286 list_del(&c->list); 338 list_del(&c->list);
287 if (c->type == ACL_LINK) 339 switch (c->type) {
340 case ACL_LINK:
288 h->acl_num--; 341 h->acl_num--;
289 else 342 break;
343 case LE_LINK:
344 h->le_num--;
345 break;
346 case SCO_LINK:
347 case ESCO_LINK:
290 h->sco_num--; 348 h->sco_num--;
349 break;
350 }
291} 351}
292 352
293static inline struct hci_conn *hci_conn_hash_lookup_handle(struct hci_dev *hdev, 353static inline struct hci_conn *hci_conn_hash_lookup_handle(struct hci_dev *hdev,
294 __u16 handle) 354 __u16 handle)
295{ 355{
296 struct hci_conn_hash *h = &hdev->conn_hash; 356 struct hci_conn_hash *h = &hdev->conn_hash;
297 struct list_head *p; 357 struct list_head *p;
@@ -306,7 +366,7 @@ static inline struct hci_conn *hci_conn_hash_lookup_handle(struct hci_dev *hdev,
306} 366}
307 367
308static inline struct hci_conn *hci_conn_hash_lookup_ba(struct hci_dev *hdev, 368static inline struct hci_conn *hci_conn_hash_lookup_ba(struct hci_dev *hdev,
309 __u8 type, bdaddr_t *ba) 369 __u8 type, bdaddr_t *ba)
310{ 370{
311 struct hci_conn_hash *h = &hdev->conn_hash; 371 struct hci_conn_hash *h = &hdev->conn_hash;
312 struct list_head *p; 372 struct list_head *p;
@@ -321,7 +381,7 @@ static inline struct hci_conn *hci_conn_hash_lookup_ba(struct hci_dev *hdev,
321} 381}
322 382
323static inline struct hci_conn *hci_conn_hash_lookup_state(struct hci_dev *hdev, 383static inline struct hci_conn *hci_conn_hash_lookup_state(struct hci_dev *hdev,
324 __u8 type, __u16 state) 384 __u8 type, __u16 state)
325{ 385{
326 struct hci_conn_hash *h = &hdev->conn_hash; 386 struct hci_conn_hash *h = &hdev->conn_hash;
327 struct list_head *p; 387 struct list_head *p;
@@ -437,6 +497,16 @@ int hci_inquiry(void __user *arg);
437struct bdaddr_list *hci_blacklist_lookup(struct hci_dev *hdev, bdaddr_t *bdaddr); 497struct bdaddr_list *hci_blacklist_lookup(struct hci_dev *hdev, bdaddr_t *bdaddr);
438int hci_blacklist_clear(struct hci_dev *hdev); 498int hci_blacklist_clear(struct hci_dev *hdev);
439 499
500int hci_uuids_clear(struct hci_dev *hdev);
501
502int hci_link_keys_clear(struct hci_dev *hdev);
503struct link_key *hci_find_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr);
504int hci_add_link_key(struct hci_dev *hdev, int new_key, bdaddr_t *bdaddr,
505 u8 *key, u8 type, u8 pin_len);
506int hci_remove_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr);
507
508void hci_del_off_timer(struct hci_dev *hdev);
509
440void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb); 510void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb);
441 511
442int hci_recv_frame(struct sk_buff *skb); 512int hci_recv_frame(struct sk_buff *skb);
@@ -458,6 +528,8 @@ void hci_conn_del_sysfs(struct hci_conn *conn);
458#define lmp_sniffsubr_capable(dev) ((dev)->features[5] & LMP_SNIFF_SUBR) 528#define lmp_sniffsubr_capable(dev) ((dev)->features[5] & LMP_SNIFF_SUBR)
459#define lmp_esco_capable(dev) ((dev)->features[3] & LMP_ESCO) 529#define lmp_esco_capable(dev) ((dev)->features[3] & LMP_ESCO)
460#define lmp_ssp_capable(dev) ((dev)->features[6] & LMP_SIMPLE_PAIR) 530#define lmp_ssp_capable(dev) ((dev)->features[6] & LMP_SIMPLE_PAIR)
531#define lmp_no_flush_capable(dev) ((dev)->features[6] & LMP_NO_FLUSH)
532#define lmp_le_capable(dev) ((dev)->features[4] & LMP_LE)
461 533
462/* ----- HCI protocols ----- */ 534/* ----- HCI protocols ----- */
463struct hci_proto { 535struct hci_proto {
@@ -503,6 +575,9 @@ static inline void hci_proto_connect_cfm(struct hci_conn *conn, __u8 status)
503 hp = hci_proto[HCI_PROTO_SCO]; 575 hp = hci_proto[HCI_PROTO_SCO];
504 if (hp && hp->connect_cfm) 576 if (hp && hp->connect_cfm)
505 hp->connect_cfm(conn, status); 577 hp->connect_cfm(conn, status);
578
579 if (conn->connect_cfm_cb)
580 conn->connect_cfm_cb(conn, status);
506} 581}
507 582
508static inline int hci_proto_disconn_ind(struct hci_conn *conn) 583static inline int hci_proto_disconn_ind(struct hci_conn *conn)
@@ -532,6 +607,9 @@ static inline void hci_proto_disconn_cfm(struct hci_conn *conn, __u8 reason)
532 hp = hci_proto[HCI_PROTO_SCO]; 607 hp = hci_proto[HCI_PROTO_SCO];
533 if (hp && hp->disconn_cfm) 608 if (hp && hp->disconn_cfm)
534 hp->disconn_cfm(conn, reason); 609 hp->disconn_cfm(conn, reason);
610
611 if (conn->disconn_cfm_cb)
612 conn->disconn_cfm_cb(conn, reason);
535} 613}
536 614
537static inline void hci_proto_auth_cfm(struct hci_conn *conn, __u8 status) 615static inline void hci_proto_auth_cfm(struct hci_conn *conn, __u8 status)
@@ -551,6 +629,9 @@ static inline void hci_proto_auth_cfm(struct hci_conn *conn, __u8 status)
551 hp = hci_proto[HCI_PROTO_SCO]; 629 hp = hci_proto[HCI_PROTO_SCO];
552 if (hp && hp->security_cfm) 630 if (hp && hp->security_cfm)
553 hp->security_cfm(conn, status, encrypt); 631 hp->security_cfm(conn, status, encrypt);
632
633 if (conn->security_cfm_cb)
634 conn->security_cfm_cb(conn, status);
554} 635}
555 636
556static inline void hci_proto_encrypt_cfm(struct hci_conn *conn, __u8 status, __u8 encrypt) 637static inline void hci_proto_encrypt_cfm(struct hci_conn *conn, __u8 status, __u8 encrypt)
@@ -564,6 +645,9 @@ static inline void hci_proto_encrypt_cfm(struct hci_conn *conn, __u8 status, __u
564 hp = hci_proto[HCI_PROTO_SCO]; 645 hp = hci_proto[HCI_PROTO_SCO];
565 if (hp && hp->security_cfm) 646 if (hp && hp->security_cfm)
566 hp->security_cfm(conn, status, encrypt); 647 hp->security_cfm(conn, status, encrypt);
648
649 if (conn->security_cfm_cb)
650 conn->security_cfm_cb(conn, status);
567} 651}
568 652
569int hci_register_proto(struct hci_proto *hproto); 653int hci_register_proto(struct hci_proto *hproto);
@@ -660,12 +744,29 @@ void *hci_sent_cmd_data(struct hci_dev *hdev, __u16 opcode);
660void hci_si_event(struct hci_dev *hdev, int type, int dlen, void *data); 744void hci_si_event(struct hci_dev *hdev, int type, int dlen, void *data);
661 745
662/* ----- HCI Sockets ----- */ 746/* ----- HCI Sockets ----- */
663void hci_send_to_sock(struct hci_dev *hdev, struct sk_buff *skb); 747void hci_send_to_sock(struct hci_dev *hdev, struct sk_buff *skb,
748 struct sock *skip_sk);
664 749
665/* Management interface */ 750/* Management interface */
666int mgmt_control(struct sock *sk, struct msghdr *msg, size_t len); 751int mgmt_control(struct sock *sk, struct msghdr *msg, size_t len);
667int mgmt_index_added(u16 index); 752int mgmt_index_added(u16 index);
668int mgmt_index_removed(u16 index); 753int mgmt_index_removed(u16 index);
754int mgmt_powered(u16 index, u8 powered);
755int mgmt_discoverable(u16 index, u8 discoverable);
756int mgmt_connectable(u16 index, u8 connectable);
757int mgmt_new_key(u16 index, struct link_key *key, u8 old_key_type);
758int mgmt_connected(u16 index, bdaddr_t *bdaddr);
759int mgmt_disconnected(u16 index, bdaddr_t *bdaddr);
760int mgmt_disconnect_failed(u16 index);
761int mgmt_connect_failed(u16 index, bdaddr_t *bdaddr, u8 status);
762int mgmt_pin_code_request(u16 index, bdaddr_t *bdaddr);
763int mgmt_pin_code_reply_complete(u16 index, bdaddr_t *bdaddr, u8 status);
764int mgmt_pin_code_neg_reply_complete(u16 index, bdaddr_t *bdaddr, u8 status);
765int mgmt_user_confirm_request(u16 index, bdaddr_t *bdaddr, __le32 value);
766int mgmt_user_confirm_reply_complete(u16 index, bdaddr_t *bdaddr, u8 status);
767int mgmt_user_confirm_neg_reply_complete(u16 index, bdaddr_t *bdaddr,
768 u8 status);
769int mgmt_auth_failed(u16 index, bdaddr_t *bdaddr, u8 status);
669 770
670/* HCI info for socket */ 771/* HCI info for socket */
671#define hci_pi(sk) ((struct hci_pinfo *) sk) 772#define hci_pi(sk) ((struct hci_pinfo *) sk)
@@ -697,4 +798,6 @@ struct hci_sec_filter {
697 798
698void hci_req_complete(struct hci_dev *hdev, __u16 cmd, int result); 799void hci_req_complete(struct hci_dev *hdev, __u16 cmd, int result);
699 800
801void hci_le_conn_update(struct hci_conn *conn, u16 min, u16 max,
802 u16 latency, u16 to_multiplier);
700#endif /* __HCI_CORE_H */ 803#endif /* __HCI_CORE_H */
diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h
index 7ad25ca60ec0..4f4bff1eaed6 100644
--- a/include/net/bluetooth/l2cap.h
+++ b/include/net/bluetooth/l2cap.h
@@ -38,6 +38,7 @@
38#define L2CAP_DEFAULT_MAX_PDU_SIZE 1009 /* Sized for 3-DH5 packet */ 38#define L2CAP_DEFAULT_MAX_PDU_SIZE 1009 /* Sized for 3-DH5 packet */
39#define L2CAP_DEFAULT_ACK_TO 200 39#define L2CAP_DEFAULT_ACK_TO 200
40#define L2CAP_LOCAL_BUSY_TRIES 12 40#define L2CAP_LOCAL_BUSY_TRIES 12
41#define L2CAP_LE_DEFAULT_MTU 23
41 42
42#define L2CAP_CONN_TIMEOUT (40000) /* 40 seconds */ 43#define L2CAP_CONN_TIMEOUT (40000) /* 40 seconds */
43#define L2CAP_INFO_TIMEOUT (4000) /* 4 seconds */ 44#define L2CAP_INFO_TIMEOUT (4000) /* 4 seconds */
@@ -88,6 +89,8 @@ struct l2cap_conninfo {
88#define L2CAP_ECHO_RSP 0x09 89#define L2CAP_ECHO_RSP 0x09
89#define L2CAP_INFO_REQ 0x0a 90#define L2CAP_INFO_REQ 0x0a
90#define L2CAP_INFO_RSP 0x0b 91#define L2CAP_INFO_RSP 0x0b
92#define L2CAP_CONN_PARAM_UPDATE_REQ 0x12
93#define L2CAP_CONN_PARAM_UPDATE_RSP 0x13
91 94
92/* L2CAP feature mask */ 95/* L2CAP feature mask */
93#define L2CAP_FEAT_FLOWCTL 0x00000001 96#define L2CAP_FEAT_FLOWCTL 0x00000001
@@ -160,6 +163,9 @@ struct l2cap_conn_rsp {
160/* channel indentifier */ 163/* channel indentifier */
161#define L2CAP_CID_SIGNALING 0x0001 164#define L2CAP_CID_SIGNALING 0x0001
162#define L2CAP_CID_CONN_LESS 0x0002 165#define L2CAP_CID_CONN_LESS 0x0002
166#define L2CAP_CID_LE_DATA 0x0004
167#define L2CAP_CID_LE_SIGNALING 0x0005
168#define L2CAP_CID_SMP 0x0006
163#define L2CAP_CID_DYN_START 0x0040 169#define L2CAP_CID_DYN_START 0x0040
164#define L2CAP_CID_DYN_END 0xffff 170#define L2CAP_CID_DYN_END 0xffff
165 171
@@ -255,6 +261,21 @@ struct l2cap_info_rsp {
255#define L2CAP_IR_SUCCESS 0x0000 261#define L2CAP_IR_SUCCESS 0x0000
256#define L2CAP_IR_NOTSUPP 0x0001 262#define L2CAP_IR_NOTSUPP 0x0001
257 263
264struct l2cap_conn_param_update_req {
265 __le16 min;
266 __le16 max;
267 __le16 latency;
268 __le16 to_multiplier;
269} __packed;
270
271struct l2cap_conn_param_update_rsp {
272 __le16 result;
273} __packed;
274
275/* Connection Parameters result */
276#define L2CAP_CONN_PARAM_ACCEPTED 0x0000
277#define L2CAP_CONN_PARAM_REJECTED 0x0001
278
258/* ----- L2CAP connections ----- */ 279/* ----- L2CAP connections ----- */
259struct l2cap_chan_list { 280struct l2cap_chan_list {
260 struct sock *head; 281 struct sock *head;
@@ -327,6 +348,7 @@ struct l2cap_pinfo {
327 __u8 sec_level; 348 __u8 sec_level;
328 __u8 role_switch; 349 __u8 role_switch;
329 __u8 force_reliable; 350 __u8 force_reliable;
351 __u8 flushable;
330 352
331 __u8 conf_req[64]; 353 __u8 conf_req[64];
332 __u8 conf_len; 354 __u8 conf_len;
@@ -423,6 +445,35 @@ static inline int l2cap_tx_window_full(struct sock *sk)
423#define __is_sframe(ctrl) ((ctrl) & L2CAP_CTRL_FRAME_TYPE) 445#define __is_sframe(ctrl) ((ctrl) & L2CAP_CTRL_FRAME_TYPE)
424#define __is_sar_start(ctrl) (((ctrl) & L2CAP_CTRL_SAR) == L2CAP_SDU_START) 446#define __is_sar_start(ctrl) (((ctrl) & L2CAP_CTRL_SAR) == L2CAP_SDU_START)
425 447
426void l2cap_load(void); 448extern int disable_ertm;
449extern const struct proto_ops l2cap_sock_ops;
450extern struct bt_sock_list l2cap_sk_list;
451
452int l2cap_init_sockets(void);
453void l2cap_cleanup_sockets(void);
454
455u8 l2cap_get_ident(struct l2cap_conn *conn);
456void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len, void *data);
457int l2cap_build_conf_req(struct sock *sk, void *data);
458int __l2cap_wait_ack(struct sock *sk);
459
460struct sk_buff *l2cap_create_connless_pdu(struct sock *sk, struct msghdr *msg, size_t len);
461struct sk_buff *l2cap_create_basic_pdu(struct sock *sk, struct msghdr *msg, size_t len);
462struct sk_buff *l2cap_create_iframe_pdu(struct sock *sk, struct msghdr *msg, size_t len, u16 control, u16 sdulen);
463int l2cap_sar_segment_sdu(struct sock *sk, struct msghdr *msg, size_t len);
464void l2cap_do_send(struct sock *sk, struct sk_buff *skb);
465void l2cap_streaming_send(struct sock *sk);
466int l2cap_ertm_send(struct sock *sk);
467
468void l2cap_sock_set_timer(struct sock *sk, long timeout);
469void l2cap_sock_clear_timer(struct sock *sk);
470void __l2cap_sock_close(struct sock *sk, int reason);
471void l2cap_sock_kill(struct sock *sk);
472void l2cap_sock_init(struct sock *sk, struct sock *parent);
473struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock,
474 int proto, gfp_t prio);
475void l2cap_send_disconn_req(struct l2cap_conn *conn, struct sock *sk, int err);
476void l2cap_chan_del(struct sock *sk, int err);
477int l2cap_do_connect(struct sock *sk);
427 478
428#endif /* __L2CAP_H */ 479#endif /* __L2CAP_H */
diff --git a/include/net/bluetooth/mgmt.h b/include/net/bluetooth/mgmt.h
index ca29c1367ffd..5fabfa886b3e 100644
--- a/include/net/bluetooth/mgmt.h
+++ b/include/net/bluetooth/mgmt.h
@@ -21,11 +21,13 @@
21 SOFTWARE IS DISCLAIMED. 21 SOFTWARE IS DISCLAIMED.
22*/ 22*/
23 23
24#define MGMT_INDEX_NONE 0xFFFF
25
24struct mgmt_hdr { 26struct mgmt_hdr {
25 __le16 opcode; 27 __le16 opcode;
28 __le16 index;
26 __le16 len; 29 __le16 len;
27} __packed; 30} __packed;
28#define MGMT_HDR_SIZE 4
29 31
30#define MGMT_OP_READ_VERSION 0x0001 32#define MGMT_OP_READ_VERSION 0x0001
31struct mgmt_rp_read_version { 33struct mgmt_rp_read_version {
@@ -40,13 +42,10 @@ struct mgmt_rp_read_index_list {
40} __packed; 42} __packed;
41 43
42#define MGMT_OP_READ_INFO 0x0004 44#define MGMT_OP_READ_INFO 0x0004
43struct mgmt_cp_read_info {
44 __le16 index;
45} __packed;
46struct mgmt_rp_read_info { 45struct mgmt_rp_read_info {
47 __le16 index;
48 __u8 type; 46 __u8 type;
49 __u8 powered; 47 __u8 powered;
48 __u8 connectable;
50 __u8 discoverable; 49 __u8 discoverable;
51 __u8 pairable; 50 __u8 pairable;
52 __u8 sec_mode; 51 __u8 sec_mode;
@@ -58,6 +57,116 @@ struct mgmt_rp_read_info {
58 __u16 hci_rev; 57 __u16 hci_rev;
59} __packed; 58} __packed;
60 59
60struct mgmt_mode {
61 __u8 val;
62} __packed;
63
64#define MGMT_OP_SET_POWERED 0x0005
65
66#define MGMT_OP_SET_DISCOVERABLE 0x0006
67
68#define MGMT_OP_SET_CONNECTABLE 0x0007
69
70#define MGMT_OP_SET_PAIRABLE 0x0008
71
72#define MGMT_OP_ADD_UUID 0x0009
73struct mgmt_cp_add_uuid {
74 __u8 uuid[16];
75 __u8 svc_hint;
76} __packed;
77
78#define MGMT_OP_REMOVE_UUID 0x000A
79struct mgmt_cp_remove_uuid {
80 __u8 uuid[16];
81} __packed;
82
83#define MGMT_OP_SET_DEV_CLASS 0x000B
84struct mgmt_cp_set_dev_class {
85 __u8 major;
86 __u8 minor;
87} __packed;
88
89#define MGMT_OP_SET_SERVICE_CACHE 0x000C
90struct mgmt_cp_set_service_cache {
91 __u8 enable;
92} __packed;
93
94struct mgmt_key_info {
95 bdaddr_t bdaddr;
96 u8 type;
97 u8 val[16];
98 u8 pin_len;
99} __packed;
100
101#define MGMT_OP_LOAD_KEYS 0x000D
102struct mgmt_cp_load_keys {
103 __u8 debug_keys;
104 __le16 key_count;
105 struct mgmt_key_info keys[0];
106} __packed;
107
108#define MGMT_OP_REMOVE_KEY 0x000E
109struct mgmt_cp_remove_key {
110 bdaddr_t bdaddr;
111 __u8 disconnect;
112} __packed;
113
114#define MGMT_OP_DISCONNECT 0x000F
115struct mgmt_cp_disconnect {
116 bdaddr_t bdaddr;
117} __packed;
118struct mgmt_rp_disconnect {
119 bdaddr_t bdaddr;
120} __packed;
121
122#define MGMT_OP_GET_CONNECTIONS 0x0010
123struct mgmt_rp_get_connections {
124 __le16 conn_count;
125 bdaddr_t conn[0];
126} __packed;
127
128#define MGMT_OP_PIN_CODE_REPLY 0x0011
129struct mgmt_cp_pin_code_reply {
130 bdaddr_t bdaddr;
131 __u8 pin_len;
132 __u8 pin_code[16];
133} __packed;
134struct mgmt_rp_pin_code_reply {
135 bdaddr_t bdaddr;
136 uint8_t status;
137} __packed;
138
139#define MGMT_OP_PIN_CODE_NEG_REPLY 0x0012
140struct mgmt_cp_pin_code_neg_reply {
141 bdaddr_t bdaddr;
142} __packed;
143
144#define MGMT_OP_SET_IO_CAPABILITY 0x0013
145struct mgmt_cp_set_io_capability {
146 __u8 io_capability;
147} __packed;
148
149#define MGMT_OP_PAIR_DEVICE 0x0014
150struct mgmt_cp_pair_device {
151 bdaddr_t bdaddr;
152 __u8 io_cap;
153} __packed;
154struct mgmt_rp_pair_device {
155 bdaddr_t bdaddr;
156 __u8 status;
157} __packed;
158
159#define MGMT_OP_USER_CONFIRM_REPLY 0x0015
160struct mgmt_cp_user_confirm_reply {
161 bdaddr_t bdaddr;
162} __packed;
163struct mgmt_rp_user_confirm_reply {
164 bdaddr_t bdaddr;
165 __u8 status;
166} __packed;
167
168#define MGMT_OP_USER_CONFIRM_NEG_REPLY 0x0016
169
61#define MGMT_EV_CMD_COMPLETE 0x0001 170#define MGMT_EV_CMD_COMPLETE 0x0001
62struct mgmt_ev_cmd_complete { 171struct mgmt_ev_cmd_complete {
63 __le16 opcode; 172 __le16 opcode;
@@ -72,16 +181,56 @@ struct mgmt_ev_cmd_status {
72 181
73#define MGMT_EV_CONTROLLER_ERROR 0x0003 182#define MGMT_EV_CONTROLLER_ERROR 0x0003
74struct mgmt_ev_controller_error { 183struct mgmt_ev_controller_error {
75 __le16 index;
76 __u8 error_code; 184 __u8 error_code;
77} __packed; 185} __packed;
78 186
79#define MGMT_EV_INDEX_ADDED 0x0004 187#define MGMT_EV_INDEX_ADDED 0x0004
80struct mgmt_ev_index_added {
81 __le16 index;
82} __packed;
83 188
84#define MGMT_EV_INDEX_REMOVED 0x0005 189#define MGMT_EV_INDEX_REMOVED 0x0005
85struct mgmt_ev_index_removed { 190
86 __le16 index; 191#define MGMT_EV_POWERED 0x0006
192
193#define MGMT_EV_DISCOVERABLE 0x0007
194
195#define MGMT_EV_CONNECTABLE 0x0008
196
197#define MGMT_EV_PAIRABLE 0x0009
198
199#define MGMT_EV_NEW_KEY 0x000A
200struct mgmt_ev_new_key {
201 struct mgmt_key_info key;
202 __u8 old_key_type;
203} __packed;
204
205#define MGMT_EV_CONNECTED 0x000B
206struct mgmt_ev_connected {
207 bdaddr_t bdaddr;
208} __packed;
209
210#define MGMT_EV_DISCONNECTED 0x000C
211struct mgmt_ev_disconnected {
212 bdaddr_t bdaddr;
213} __packed;
214
215#define MGMT_EV_CONNECT_FAILED 0x000D
216struct mgmt_ev_connect_failed {
217 bdaddr_t bdaddr;
218 __u8 status;
219} __packed;
220
221#define MGMT_EV_PIN_CODE_REQUEST 0x000E
222struct mgmt_ev_pin_code_request {
223 bdaddr_t bdaddr;
224} __packed;
225
226#define MGMT_EV_USER_CONFIRM_REQUEST 0x000F
227struct mgmt_ev_user_confirm_request {
228 bdaddr_t bdaddr;
229 __le32 value;
230} __packed;
231
232#define MGMT_EV_AUTH_FAILED 0x0010
233struct mgmt_ev_auth_failed {
234 bdaddr_t bdaddr;
235 __u8 status;
87} __packed; 236} __packed;
diff --git a/include/net/bluetooth/smp.h b/include/net/bluetooth/smp.h
new file mode 100644
index 000000000000..8f2edbf979dc
--- /dev/null
+++ b/include/net/bluetooth/smp.h
@@ -0,0 +1,76 @@
1#ifndef __SMP_H
2#define __SMP_H
3
4struct smp_command_hdr {
5 __u8 code;
6} __packed;
7
8#define SMP_CMD_PAIRING_REQ 0x01
9#define SMP_CMD_PAIRING_RSP 0x02
10struct smp_cmd_pairing {
11 __u8 io_capability;
12 __u8 oob_flag;
13 __u8 auth_req;
14 __u8 max_key_size;
15 __u8 init_key_dist;
16 __u8 resp_key_dist;
17} __packed;
18
19#define SMP_CMD_PAIRING_CONFIRM 0x03
20struct smp_cmd_pairing_confirm {
21 __u8 confirm_val[16];
22} __packed;
23
24#define SMP_CMD_PAIRING_RANDOM 0x04
25struct smp_cmd_pairing_random {
26 __u8 rand_val[16];
27} __packed;
28
29#define SMP_CMD_PAIRING_FAIL 0x05
30struct smp_cmd_pairing_fail {
31 __u8 reason;
32} __packed;
33
34#define SMP_CMD_ENCRYPT_INFO 0x06
35struct smp_cmd_encrypt_info {
36 __u8 ltk[16];
37} __packed;
38
39#define SMP_CMD_MASTER_IDENT 0x07
40struct smp_cmd_master_ident {
41 __u16 ediv;
42 __u8 rand[8];
43} __packed;
44
45#define SMP_CMD_IDENT_INFO 0x08
46struct smp_cmd_ident_info {
47 __u8 irk[16];
48} __packed;
49
50#define SMP_CMD_IDENT_ADDR_INFO 0x09
51struct smp_cmd_ident_addr_info {
52 __u8 addr_type;
53 bdaddr_t bdaddr;
54} __packed;
55
56#define SMP_CMD_SIGN_INFO 0x0a
57struct smp_cmd_sign_info {
58 __u8 csrk[16];
59} __packed;
60
61#define SMP_CMD_SECURITY_REQ 0x0b
62struct smp_cmd_security_req {
63 __u8 auth_req;
64} __packed;
65
66#define SMP_PASSKEY_ENTRY_FAILED 0x01
67#define SMP_OOB_NOT_AVAIL 0x02
68#define SMP_AUTH_REQUIREMENTS 0x03
69#define SMP_CONFIRM_FAILED 0x04
70#define SMP_PAIRING_NOTSUPP 0x05
71#define SMP_ENC_KEY_SIZE 0x06
72#define SMP_CMD_NOTSUPP 0x07
73#define SMP_UNSPECIFIED 0x08
74#define SMP_REPEATED_ATTEMPTS 0x09
75
76#endif /* __SMP_H */
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index 1322695beb52..60f7876b6da8 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -413,7 +413,7 @@ struct station_parameters {
413 * @STATION_INFO_PLID: @plid filled 413 * @STATION_INFO_PLID: @plid filled
414 * @STATION_INFO_PLINK_STATE: @plink_state filled 414 * @STATION_INFO_PLINK_STATE: @plink_state filled
415 * @STATION_INFO_SIGNAL: @signal filled 415 * @STATION_INFO_SIGNAL: @signal filled
416 * @STATION_INFO_TX_BITRATE: @tx_bitrate fields are filled 416 * @STATION_INFO_TX_BITRATE: @txrate fields are filled
417 * (tx_bitrate, tx_bitrate_flags and tx_bitrate_mcs) 417 * (tx_bitrate, tx_bitrate_flags and tx_bitrate_mcs)
418 * @STATION_INFO_RX_PACKETS: @rx_packets filled 418 * @STATION_INFO_RX_PACKETS: @rx_packets filled
419 * @STATION_INFO_TX_PACKETS: @tx_packets filled 419 * @STATION_INFO_TX_PACKETS: @tx_packets filled
@@ -421,6 +421,7 @@ struct station_parameters {
421 * @STATION_INFO_TX_FAILED: @tx_failed filled 421 * @STATION_INFO_TX_FAILED: @tx_failed filled
422 * @STATION_INFO_RX_DROP_MISC: @rx_dropped_misc filled 422 * @STATION_INFO_RX_DROP_MISC: @rx_dropped_misc filled
423 * @STATION_INFO_SIGNAL_AVG: @signal_avg filled 423 * @STATION_INFO_SIGNAL_AVG: @signal_avg filled
424 * @STATION_INFO_RX_BITRATE: @rxrate fields are filled
424 */ 425 */
425enum station_info_flags { 426enum station_info_flags {
426 STATION_INFO_INACTIVE_TIME = 1<<0, 427 STATION_INFO_INACTIVE_TIME = 1<<0,
@@ -437,6 +438,7 @@ enum station_info_flags {
437 STATION_INFO_TX_FAILED = 1<<11, 438 STATION_INFO_TX_FAILED = 1<<11,
438 STATION_INFO_RX_DROP_MISC = 1<<12, 439 STATION_INFO_RX_DROP_MISC = 1<<12,
439 STATION_INFO_SIGNAL_AVG = 1<<13, 440 STATION_INFO_SIGNAL_AVG = 1<<13,
441 STATION_INFO_RX_BITRATE = 1<<14,
440}; 442};
441 443
442/** 444/**
@@ -506,6 +508,7 @@ struct station_info {
506 s8 signal; 508 s8 signal;
507 s8 signal_avg; 509 s8 signal_avg;
508 struct rate_info txrate; 510 struct rate_info txrate;
511 struct rate_info rxrate;
509 u32 rx_packets; 512 u32 rx_packets;
510 u32 tx_packets; 513 u32 tx_packets;
511 u32 tx_retries; 514 u32 tx_retries;
@@ -1194,6 +1197,10 @@ struct cfg80211_pmksa {
1194 * (also see nl80211.h @NL80211_ATTR_WIPHY_ANTENNA_TX). 1197 * (also see nl80211.h @NL80211_ATTR_WIPHY_ANTENNA_TX).
1195 * 1198 *
1196 * @get_antenna: Get current antenna configuration from device (tx_ant, rx_ant). 1199 * @get_antenna: Get current antenna configuration from device (tx_ant, rx_ant).
1200 *
1201 * @set_ringparam: Set tx and rx ring sizes.
1202 *
1203 * @get_ringparam: Get tx and rx ring current and maximum sizes.
1197 */ 1204 */
1198struct cfg80211_ops { 1205struct cfg80211_ops {
1199 int (*suspend)(struct wiphy *wiphy); 1206 int (*suspend)(struct wiphy *wiphy);
@@ -1361,6 +1368,10 @@ struct cfg80211_ops {
1361 1368
1362 int (*set_antenna)(struct wiphy *wiphy, u32 tx_ant, u32 rx_ant); 1369 int (*set_antenna)(struct wiphy *wiphy, u32 tx_ant, u32 rx_ant);
1363 int (*get_antenna)(struct wiphy *wiphy, u32 *tx_ant, u32 *rx_ant); 1370 int (*get_antenna)(struct wiphy *wiphy, u32 *tx_ant, u32 *rx_ant);
1371
1372 int (*set_ringparam)(struct wiphy *wiphy, u32 tx, u32 rx);
1373 void (*get_ringparam)(struct wiphy *wiphy,
1374 u32 *tx, u32 *tx_max, u32 *rx, u32 *rx_max);
1364}; 1375};
1365 1376
1366/* 1377/*
@@ -1790,8 +1801,9 @@ static inline void *wdev_priv(struct wireless_dev *wdev)
1790/** 1801/**
1791 * ieee80211_channel_to_frequency - convert channel number to frequency 1802 * ieee80211_channel_to_frequency - convert channel number to frequency
1792 * @chan: channel number 1803 * @chan: channel number
1804 * @band: band, necessary due to channel number overlap
1793 */ 1805 */
1794extern int ieee80211_channel_to_frequency(int chan); 1806extern int ieee80211_channel_to_frequency(int chan, enum ieee80211_band band);
1795 1807
1796/** 1808/**
1797 * ieee80211_frequency_to_channel - convert frequency to channel number 1809 * ieee80211_frequency_to_channel - convert frequency to channel number
diff --git a/include/net/dcbnl.h b/include/net/dcbnl.h
index a8e7852b10ab..e5983c9053dc 100644
--- a/include/net/dcbnl.h
+++ b/include/net/dcbnl.h
@@ -43,6 +43,8 @@ struct dcbnl_rtnl_ops {
43 int (*ieee_setpfc) (struct net_device *, struct ieee_pfc *); 43 int (*ieee_setpfc) (struct net_device *, struct ieee_pfc *);
44 int (*ieee_getapp) (struct net_device *, struct dcb_app *); 44 int (*ieee_getapp) (struct net_device *, struct dcb_app *);
45 int (*ieee_setapp) (struct net_device *, struct dcb_app *); 45 int (*ieee_setapp) (struct net_device *, struct dcb_app *);
46 int (*ieee_peer_getets) (struct net_device *, struct ieee_ets *);
47 int (*ieee_peer_getpfc) (struct net_device *, struct ieee_pfc *);
46 48
47 /* CEE std */ 49 /* CEE std */
48 u8 (*getstate)(struct net_device *); 50 u8 (*getstate)(struct net_device *);
@@ -77,7 +79,14 @@ struct dcbnl_rtnl_ops {
77 u8 (*getdcbx)(struct net_device *); 79 u8 (*getdcbx)(struct net_device *);
78 u8 (*setdcbx)(struct net_device *, u8); 80 u8 (*setdcbx)(struct net_device *, u8);
79 81
82 /* peer apps */
83 int (*peer_getappinfo)(struct net_device *, struct dcb_peer_app_info *,
84 u16 *);
85 int (*peer_getapptable)(struct net_device *, struct dcb_app *);
80 86
87 /* CEE peer */
88 int (*cee_peer_getpg) (struct net_device *, struct cee_pg *);
89 int (*cee_peer_getpfc) (struct net_device *, struct cee_pfc *);
81}; 90};
82 91
83#endif /* __NET_DCBNL_H__ */ 92#endif /* __NET_DCBNL_H__ */
diff --git a/include/net/dn.h b/include/net/dn.h
index a514a3cf4573..298521e0d8a2 100644
--- a/include/net/dn.h
+++ b/include/net/dn.h
@@ -192,10 +192,10 @@ static inline void dn_dn2eth(unsigned char *ethaddr, __le16 addr)
192 ethaddr[5] = (__u8)(a >> 8); 192 ethaddr[5] = (__u8)(a >> 8);
193} 193}
194 194
195static inline void dn_sk_ports_copy(struct flowi *fl, struct dn_scp *scp) 195static inline void dn_sk_ports_copy(struct flowidn *fld, struct dn_scp *scp)
196{ 196{
197 fl->uli_u.dnports.sport = scp->addrloc; 197 fld->fld_sport = scp->addrloc;
198 fl->uli_u.dnports.dport = scp->addrrem; 198 fld->fld_dport = scp->addrrem;
199} 199}
200 200
201extern unsigned dn_mss_from_pmtu(struct net_device *dev, int mtu); 201extern unsigned dn_mss_from_pmtu(struct net_device *dev, int mtu);
diff --git a/include/net/dn_fib.h b/include/net/dn_fib.h
index bbcde3238e58..782ef7cb4930 100644
--- a/include/net/dn_fib.h
+++ b/include/net/dn_fib.h
@@ -98,7 +98,7 @@ struct dn_fib_table {
98 int (*delete)(struct dn_fib_table *t, struct rtmsg *r, 98 int (*delete)(struct dn_fib_table *t, struct rtmsg *r,
99 struct dn_kern_rta *rta, struct nlmsghdr *n, 99 struct dn_kern_rta *rta, struct nlmsghdr *n,
100 struct netlink_skb_parms *req); 100 struct netlink_skb_parms *req);
101 int (*lookup)(struct dn_fib_table *t, const struct flowi *fl, 101 int (*lookup)(struct dn_fib_table *t, const struct flowidn *fld,
102 struct dn_fib_res *res); 102 struct dn_fib_res *res);
103 int (*flush)(struct dn_fib_table *t); 103 int (*flush)(struct dn_fib_table *t);
104 int (*dump)(struct dn_fib_table *t, struct sk_buff *skb, struct netlink_callback *cb); 104 int (*dump)(struct dn_fib_table *t, struct sk_buff *skb, struct netlink_callback *cb);
@@ -119,12 +119,12 @@ extern struct dn_fib_info *dn_fib_create_info(const struct rtmsg *r,
119 struct dn_kern_rta *rta, 119 struct dn_kern_rta *rta,
120 const struct nlmsghdr *nlh, int *errp); 120 const struct nlmsghdr *nlh, int *errp);
121extern int dn_fib_semantic_match(int type, struct dn_fib_info *fi, 121extern int dn_fib_semantic_match(int type, struct dn_fib_info *fi,
122 const struct flowi *fl, 122 const struct flowidn *fld,
123 struct dn_fib_res *res); 123 struct dn_fib_res *res);
124extern void dn_fib_release_info(struct dn_fib_info *fi); 124extern void dn_fib_release_info(struct dn_fib_info *fi);
125extern __le16 dn_fib_get_attr16(struct rtattr *attr, int attrlen, int type); 125extern __le16 dn_fib_get_attr16(struct rtattr *attr, int attrlen, int type);
126extern void dn_fib_flush(void); 126extern void dn_fib_flush(void);
127extern void dn_fib_select_multipath(const struct flowi *fl, 127extern void dn_fib_select_multipath(const struct flowidn *fld,
128 struct dn_fib_res *res); 128 struct dn_fib_res *res);
129 129
130/* 130/*
@@ -141,7 +141,7 @@ extern void dn_fib_table_cleanup(void);
141extern void dn_fib_rules_init(void); 141extern void dn_fib_rules_init(void);
142extern void dn_fib_rules_cleanup(void); 142extern void dn_fib_rules_cleanup(void);
143extern unsigned dnet_addr_type(__le16 addr); 143extern unsigned dnet_addr_type(__le16 addr);
144extern int dn_fib_lookup(struct flowi *fl, struct dn_fib_res *res); 144extern int dn_fib_lookup(struct flowidn *fld, struct dn_fib_res *res);
145 145
146extern int dn_fib_dump(struct sk_buff *skb, struct netlink_callback *cb); 146extern int dn_fib_dump(struct sk_buff *skb, struct netlink_callback *cb);
147 147
diff --git a/include/net/dn_route.h b/include/net/dn_route.h
index 9b185df265fb..81712cfa1ddf 100644
--- a/include/net/dn_route.h
+++ b/include/net/dn_route.h
@@ -16,7 +16,7 @@
16*******************************************************************************/ 16*******************************************************************************/
17 17
18extern struct sk_buff *dn_alloc_skb(struct sock *sk, int size, gfp_t pri); 18extern struct sk_buff *dn_alloc_skb(struct sock *sk, int size, gfp_t pri);
19extern int dn_route_output_sock(struct dst_entry **pprt, struct flowi *, struct sock *sk, int flags); 19extern int dn_route_output_sock(struct dst_entry **pprt, struct flowidn *, struct sock *sk, int flags);
20extern int dn_cache_dump(struct sk_buff *skb, struct netlink_callback *cb); 20extern int dn_cache_dump(struct sk_buff *skb, struct netlink_callback *cb);
21extern void dn_rt_cache_flush(int delay); 21extern void dn_rt_cache_flush(int delay);
22 22
@@ -67,7 +67,7 @@ extern void dn_rt_cache_flush(int delay);
67struct dn_route { 67struct dn_route {
68 struct dst_entry dst; 68 struct dst_entry dst;
69 69
70 struct flowi fl; 70 struct flowidn fld;
71 71
72 __le16 rt_saddr; 72 __le16 rt_saddr;
73 __le16 rt_daddr; 73 __le16 rt_daddr;
@@ -82,12 +82,12 @@ struct dn_route {
82 82
83static inline bool dn_is_input_route(struct dn_route *rt) 83static inline bool dn_is_input_route(struct dn_route *rt)
84{ 84{
85 return rt->fl.iif != 0; 85 return rt->fld.flowidn_iif != 0;
86} 86}
87 87
88static inline bool dn_is_output_route(struct dn_route *rt) 88static inline bool dn_is_output_route(struct dn_route *rt)
89{ 89{
90 return rt->fl.iif == 0; 90 return rt->fld.flowidn_iif == 0;
91} 91}
92 92
93extern void dn_route_init(void); 93extern void dn_route_init(void);
diff --git a/include/net/dst.h b/include/net/dst.h
index 93b0310317be..2a46cbaef92d 100644
--- a/include/net/dst.h
+++ b/include/net/dst.h
@@ -40,24 +40,10 @@ struct dst_entry {
40 struct rcu_head rcu_head; 40 struct rcu_head rcu_head;
41 struct dst_entry *child; 41 struct dst_entry *child;
42 struct net_device *dev; 42 struct net_device *dev;
43 short error; 43 struct dst_ops *ops;
44 short obsolete; 44 unsigned long _metrics;
45 int flags;
46#define DST_HOST 0x0001
47#define DST_NOXFRM 0x0002
48#define DST_NOPOLICY 0x0004
49#define DST_NOHASH 0x0008
50#define DST_NOCACHE 0x0010
51 unsigned long expires; 45 unsigned long expires;
52
53 unsigned short header_len; /* more space at head required */
54 unsigned short trailer_len; /* space to reserve at tail */
55
56 unsigned int rate_tokens;
57 unsigned long rate_last; /* rate limiting for ICMP */
58
59 struct dst_entry *path; 46 struct dst_entry *path;
60
61 struct neighbour *neighbour; 47 struct neighbour *neighbour;
62 struct hh_cache *hh; 48 struct hh_cache *hh;
63#ifdef CONFIG_XFRM 49#ifdef CONFIG_XFRM
@@ -68,17 +54,16 @@ struct dst_entry {
68 int (*input)(struct sk_buff*); 54 int (*input)(struct sk_buff*);
69 int (*output)(struct sk_buff*); 55 int (*output)(struct sk_buff*);
70 56
71 struct dst_ops *ops; 57 short error;
72 58 short obsolete;
73 u32 _metrics[RTAX_MAX]; 59 unsigned short header_len; /* more space at head required */
74 60 unsigned short trailer_len; /* space to reserve at tail */
75#ifdef CONFIG_NET_CLS_ROUTE 61#ifdef CONFIG_IP_ROUTE_CLASSID
76 __u32 tclassid; 62 __u32 tclassid;
77#else 63#else
78 __u32 __pad2; 64 __u32 __pad2;
79#endif 65#endif
80 66
81
82 /* 67 /*
83 * Align __refcnt to a 64 bytes alignment 68 * Align __refcnt to a 64 bytes alignment
84 * (L1_CACHE_SIZE would be too much) 69 * (L1_CACHE_SIZE would be too much)
@@ -93,6 +78,12 @@ struct dst_entry {
93 atomic_t __refcnt; /* client references */ 78 atomic_t __refcnt; /* client references */
94 int __use; 79 int __use;
95 unsigned long lastuse; 80 unsigned long lastuse;
81 int flags;
82#define DST_HOST 0x0001
83#define DST_NOXFRM 0x0002
84#define DST_NOPOLICY 0x0004
85#define DST_NOHASH 0x0008
86#define DST_NOCACHE 0x0010
96 union { 87 union {
97 struct dst_entry *next; 88 struct dst_entry *next;
98 struct rtable __rcu *rt_next; 89 struct rtable __rcu *rt_next;
@@ -103,10 +94,70 @@ struct dst_entry {
103 94
104#ifdef __KERNEL__ 95#ifdef __KERNEL__
105 96
97extern u32 *dst_cow_metrics_generic(struct dst_entry *dst, unsigned long old);
98extern const u32 dst_default_metrics[RTAX_MAX];
99
100#define DST_METRICS_READ_ONLY 0x1UL
101#define __DST_METRICS_PTR(Y) \
102 ((u32 *)((Y) & ~DST_METRICS_READ_ONLY))
103#define DST_METRICS_PTR(X) __DST_METRICS_PTR((X)->_metrics)
104
105static inline bool dst_metrics_read_only(const struct dst_entry *dst)
106{
107 return dst->_metrics & DST_METRICS_READ_ONLY;
108}
109
110extern void __dst_destroy_metrics_generic(struct dst_entry *dst, unsigned long old);
111
112static inline void dst_destroy_metrics_generic(struct dst_entry *dst)
113{
114 unsigned long val = dst->_metrics;
115 if (!(val & DST_METRICS_READ_ONLY))
116 __dst_destroy_metrics_generic(dst, val);
117}
118
119static inline u32 *dst_metrics_write_ptr(struct dst_entry *dst)
120{
121 unsigned long p = dst->_metrics;
122
123 if (p & DST_METRICS_READ_ONLY)
124 return dst->ops->cow_metrics(dst, p);
125 return __DST_METRICS_PTR(p);
126}
127
128/* This may only be invoked before the entry has reached global
129 * visibility.
130 */
131static inline void dst_init_metrics(struct dst_entry *dst,
132 const u32 *src_metrics,
133 bool read_only)
134{
135 dst->_metrics = ((unsigned long) src_metrics) |
136 (read_only ? DST_METRICS_READ_ONLY : 0);
137}
138
139static inline void dst_copy_metrics(struct dst_entry *dest, const struct dst_entry *src)
140{
141 u32 *dst_metrics = dst_metrics_write_ptr(dest);
142
143 if (dst_metrics) {
144 u32 *src_metrics = DST_METRICS_PTR(src);
145
146 memcpy(dst_metrics, src_metrics, RTAX_MAX * sizeof(u32));
147 }
148}
149
150static inline u32 *dst_metrics_ptr(struct dst_entry *dst)
151{
152 return DST_METRICS_PTR(dst);
153}
154
106static inline u32 155static inline u32
107dst_metric_raw(const struct dst_entry *dst, const int metric) 156dst_metric_raw(const struct dst_entry *dst, const int metric)
108{ 157{
109 return dst->_metrics[metric-1]; 158 u32 *p = DST_METRICS_PTR(dst);
159
160 return p[metric-1];
110} 161}
111 162
112static inline u32 163static inline u32
@@ -131,22 +182,10 @@ dst_metric_advmss(const struct dst_entry *dst)
131 182
132static inline void dst_metric_set(struct dst_entry *dst, int metric, u32 val) 183static inline void dst_metric_set(struct dst_entry *dst, int metric, u32 val)
133{ 184{
134 dst->_metrics[metric-1] = val; 185 u32 *p = dst_metrics_write_ptr(dst);
135}
136 186
137static inline void dst_import_metrics(struct dst_entry *dst, const u32 *src_metrics) 187 if (p)
138{ 188 p[metric-1] = val;
139 memcpy(dst->_metrics, src_metrics, RTAX_MAX * sizeof(u32));
140}
141
142static inline void dst_copy_metrics(struct dst_entry *dest, const struct dst_entry *src)
143{
144 dst_import_metrics(dest, src->_metrics);
145}
146
147static inline u32 *dst_metrics_ptr(struct dst_entry *dst)
148{
149 return dst->_metrics;
150} 189}
151 190
152static inline u32 191static inline u32
@@ -181,8 +220,6 @@ static inline u32
181dst_allfrag(const struct dst_entry *dst) 220dst_allfrag(const struct dst_entry *dst)
182{ 221{
183 int ret = dst_feature(dst, RTAX_FEATURE_ALLFRAG); 222 int ret = dst_feature(dst, RTAX_FEATURE_ALLFRAG);
184 /* Yes, _exactly_. This is paranoia. */
185 barrier();
186 return ret; 223 return ret;
187} 224}
188 225
@@ -315,7 +352,7 @@ static inline struct dst_entry *skb_dst_pop(struct sk_buff *skb)
315} 352}
316 353
317extern int dst_discard(struct sk_buff *skb); 354extern int dst_discard(struct sk_buff *skb);
318extern void * dst_alloc(struct dst_ops * ops); 355extern void *dst_alloc(struct dst_ops * ops, int initial_ref);
319extern void __dst_free(struct dst_entry * dst); 356extern void __dst_free(struct dst_entry * dst);
320extern struct dst_entry *dst_destroy(struct dst_entry * dst); 357extern struct dst_entry *dst_destroy(struct dst_entry * dst);
321 358
@@ -384,27 +421,22 @@ extern void dst_init(void);
384 421
385/* Flags for xfrm_lookup flags argument. */ 422/* Flags for xfrm_lookup flags argument. */
386enum { 423enum {
387 XFRM_LOOKUP_WAIT = 1 << 0, 424 XFRM_LOOKUP_ICMP = 1 << 0,
388 XFRM_LOOKUP_ICMP = 1 << 1,
389}; 425};
390 426
391struct flowi; 427struct flowi;
392#ifndef CONFIG_XFRM 428#ifndef CONFIG_XFRM
393static inline int xfrm_lookup(struct net *net, struct dst_entry **dst_p, 429static inline struct dst_entry *xfrm_lookup(struct net *net,
394 struct flowi *fl, struct sock *sk, int flags) 430 struct dst_entry *dst_orig,
431 const struct flowi *fl, struct sock *sk,
432 int flags)
395{ 433{
396 return 0; 434 return dst_orig;
397} 435}
398static inline int __xfrm_lookup(struct net *net, struct dst_entry **dst_p,
399 struct flowi *fl, struct sock *sk, int flags)
400{
401 return 0;
402}
403#else 436#else
404extern int xfrm_lookup(struct net *net, struct dst_entry **dst_p, 437extern struct dst_entry *xfrm_lookup(struct net *net, struct dst_entry *dst_orig,
405 struct flowi *fl, struct sock *sk, int flags); 438 const struct flowi *fl, struct sock *sk,
406extern int __xfrm_lookup(struct net *net, struct dst_entry **dst_p, 439 int flags);
407 struct flowi *fl, struct sock *sk, int flags);
408#endif 440#endif
409#endif 441#endif
410 442
diff --git a/include/net/dst_ops.h b/include/net/dst_ops.h
index 21a320b8708e..dc0746328947 100644
--- a/include/net/dst_ops.h
+++ b/include/net/dst_ops.h
@@ -18,6 +18,7 @@ struct dst_ops {
18 struct dst_entry * (*check)(struct dst_entry *, __u32 cookie); 18 struct dst_entry * (*check)(struct dst_entry *, __u32 cookie);
19 unsigned int (*default_advmss)(const struct dst_entry *); 19 unsigned int (*default_advmss)(const struct dst_entry *);
20 unsigned int (*default_mtu)(const struct dst_entry *); 20 unsigned int (*default_mtu)(const struct dst_entry *);
21 u32 * (*cow_metrics)(struct dst_entry *, unsigned long);
21 void (*destroy)(struct dst_entry *); 22 void (*destroy)(struct dst_entry *);
22 void (*ifdown)(struct dst_entry *, 23 void (*ifdown)(struct dst_entry *,
23 struct net_device *dev, int how); 24 struct net_device *dev, int how);
diff --git a/include/net/flow.h b/include/net/flow.h
index 240b7f356c71..7fe5a0f9483a 100644
--- a/include/net/flow.h
+++ b/include/net/flow.h
@@ -10,78 +10,136 @@
10#include <linux/in6.h> 10#include <linux/in6.h>
11#include <asm/atomic.h> 11#include <asm/atomic.h>
12 12
13struct flowi { 13struct flowi_common {
14 int oif; 14 int flowic_oif;
15 int iif; 15 int flowic_iif;
16 __u32 mark; 16 __u32 flowic_mark;
17 __u8 flowic_tos;
18 __u8 flowic_scope;
19 __u8 flowic_proto;
20 __u8 flowic_flags;
21#define FLOWI_FLAG_ANYSRC 0x01
22#define FLOWI_FLAG_PRECOW_METRICS 0x02
23#define FLOWI_FLAG_CAN_SLEEP 0x04
24 __u32 flowic_secid;
25};
17 26
27union flowi_uli {
28 struct {
29 __be16 sport;
30 __be16 dport;
31 } ports;
32
33 struct {
34 __u8 type;
35 __u8 code;
36 } icmpt;
37
38 struct {
39 __le16 sport;
40 __le16 dport;
41 } dnports;
42
43 __be32 spi;
44 __be32 gre_key;
45
46 struct {
47 __u8 type;
48 } mht;
49};
50
51struct flowi4 {
52 struct flowi_common __fl_common;
53#define flowi4_oif __fl_common.flowic_oif
54#define flowi4_iif __fl_common.flowic_iif
55#define flowi4_mark __fl_common.flowic_mark
56#define flowi4_tos __fl_common.flowic_tos
57#define flowi4_scope __fl_common.flowic_scope
58#define flowi4_proto __fl_common.flowic_proto
59#define flowi4_flags __fl_common.flowic_flags
60#define flowi4_secid __fl_common.flowic_secid
61 __be32 daddr;
62 __be32 saddr;
63 union flowi_uli uli;
64#define fl4_sport uli.ports.sport
65#define fl4_dport uli.ports.dport
66#define fl4_icmp_type uli.icmpt.type
67#define fl4_icmp_code uli.icmpt.code
68#define fl4_ipsec_spi uli.spi
69#define fl4_mh_type uli.mht.type
70#define fl4_gre_key uli.gre_key
71};
72
73struct flowi6 {
74 struct flowi_common __fl_common;
75#define flowi6_oif __fl_common.flowic_oif
76#define flowi6_iif __fl_common.flowic_iif
77#define flowi6_mark __fl_common.flowic_mark
78#define flowi6_tos __fl_common.flowic_tos
79#define flowi6_scope __fl_common.flowic_scope
80#define flowi6_proto __fl_common.flowic_proto
81#define flowi6_flags __fl_common.flowic_flags
82#define flowi6_secid __fl_common.flowic_secid
83 struct in6_addr daddr;
84 struct in6_addr saddr;
85 __be32 flowlabel;
86 union flowi_uli uli;
87#define fl6_sport uli.ports.sport
88#define fl6_dport uli.ports.dport
89#define fl6_icmp_type uli.icmpt.type
90#define fl6_icmp_code uli.icmpt.code
91#define fl6_ipsec_spi uli.spi
92#define fl6_mh_type uli.mht.type
93#define fl6_gre_key uli.gre_key
94};
95
96struct flowidn {
97 struct flowi_common __fl_common;
98#define flowidn_oif __fl_common.flowic_oif
99#define flowidn_iif __fl_common.flowic_iif
100#define flowidn_mark __fl_common.flowic_mark
101#define flowidn_scope __fl_common.flowic_scope
102#define flowidn_proto __fl_common.flowic_proto
103#define flowidn_flags __fl_common.flowic_flags
104 __le16 daddr;
105 __le16 saddr;
106 union flowi_uli uli;
107#define fld_sport uli.ports.sport
108#define fld_dport uli.ports.dport
109};
110
111struct flowi {
18 union { 112 union {
19 struct { 113 struct flowi_common __fl_common;
20 __be32 daddr; 114 struct flowi4 ip4;
21 __be32 saddr; 115 struct flowi6 ip6;
22 __u8 tos; 116 struct flowidn dn;
23 __u8 scope; 117 } u;
24 } ip4_u; 118#define flowi_oif u.__fl_common.flowic_oif
25 119#define flowi_iif u.__fl_common.flowic_iif
26 struct { 120#define flowi_mark u.__fl_common.flowic_mark
27 struct in6_addr daddr; 121#define flowi_tos u.__fl_common.flowic_tos
28 struct in6_addr saddr; 122#define flowi_scope u.__fl_common.flowic_scope
29 __be32 flowlabel; 123#define flowi_proto u.__fl_common.flowic_proto
30 } ip6_u; 124#define flowi_flags u.__fl_common.flowic_flags
31 125#define flowi_secid u.__fl_common.flowic_secid
32 struct {
33 __le16 daddr;
34 __le16 saddr;
35 __u8 scope;
36 } dn_u;
37 } nl_u;
38#define fld_dst nl_u.dn_u.daddr
39#define fld_src nl_u.dn_u.saddr
40#define fld_scope nl_u.dn_u.scope
41#define fl6_dst nl_u.ip6_u.daddr
42#define fl6_src nl_u.ip6_u.saddr
43#define fl6_flowlabel nl_u.ip6_u.flowlabel
44#define fl4_dst nl_u.ip4_u.daddr
45#define fl4_src nl_u.ip4_u.saddr
46#define fl4_tos nl_u.ip4_u.tos
47#define fl4_scope nl_u.ip4_u.scope
48
49 __u8 proto;
50 __u8 flags;
51#define FLOWI_FLAG_ANYSRC 0x01
52 union {
53 struct {
54 __be16 sport;
55 __be16 dport;
56 } ports;
57
58 struct {
59 __u8 type;
60 __u8 code;
61 } icmpt;
62
63 struct {
64 __le16 sport;
65 __le16 dport;
66 } dnports;
67
68 __be32 spi;
69 __be32 gre_key;
70
71 struct {
72 __u8 type;
73 } mht;
74 } uli_u;
75#define fl_ip_sport uli_u.ports.sport
76#define fl_ip_dport uli_u.ports.dport
77#define fl_icmp_type uli_u.icmpt.type
78#define fl_icmp_code uli_u.icmpt.code
79#define fl_ipsec_spi uli_u.spi
80#define fl_mh_type uli_u.mht.type
81#define fl_gre_key uli_u.gre_key
82 __u32 secid; /* used by xfrm; see secid.txt */
83} __attribute__((__aligned__(BITS_PER_LONG/8))); 126} __attribute__((__aligned__(BITS_PER_LONG/8)));
84 127
128static inline struct flowi *flowi4_to_flowi(struct flowi4 *fl4)
129{
130 return container_of(fl4, struct flowi, u.ip4);
131}
132
133static inline struct flowi *flowi6_to_flowi(struct flowi6 *fl6)
134{
135 return container_of(fl6, struct flowi, u.ip6);
136}
137
138static inline struct flowi *flowidn_to_flowi(struct flowidn *fldn)
139{
140 return container_of(fldn, struct flowi, u.dn);
141}
142
85#define FLOW_DIR_IN 0 143#define FLOW_DIR_IN 0
86#define FLOW_DIR_OUT 1 144#define FLOW_DIR_OUT 1
87#define FLOW_DIR_FWD 2 145#define FLOW_DIR_FWD 2
@@ -101,20 +159,14 @@ struct flow_cache_ops {
101}; 159};
102 160
103typedef struct flow_cache_object *(*flow_resolve_t)( 161typedef struct flow_cache_object *(*flow_resolve_t)(
104 struct net *net, struct flowi *key, u16 family, 162 struct net *net, const struct flowi *key, u16 family,
105 u8 dir, struct flow_cache_object *oldobj, void *ctx); 163 u8 dir, struct flow_cache_object *oldobj, void *ctx);
106 164
107extern struct flow_cache_object *flow_cache_lookup( 165extern struct flow_cache_object *flow_cache_lookup(
108 struct net *net, struct flowi *key, u16 family, 166 struct net *net, const struct flowi *key, u16 family,
109 u8 dir, flow_resolve_t resolver, void *ctx); 167 u8 dir, flow_resolve_t resolver, void *ctx);
110 168
111extern void flow_cache_flush(void); 169extern void flow_cache_flush(void);
112extern atomic_t flow_cache_genid; 170extern atomic_t flow_cache_genid;
113 171
114static inline int flow_cache_uli_match(struct flowi *fl1, struct flowi *fl2)
115{
116 return (fl1->proto == fl2->proto &&
117 !memcmp(&fl1->uli_u, &fl2->uli_u, sizeof(fl1->uli_u)));
118}
119
120#endif 172#endif
diff --git a/include/net/icmp.h b/include/net/icmp.h
index 6e991e0d0d6f..f0698b955b73 100644
--- a/include/net/icmp.h
+++ b/include/net/icmp.h
@@ -45,7 +45,4 @@ extern int icmp_ioctl(struct sock *sk, int cmd, unsigned long arg);
45extern int icmp_init(void); 45extern int icmp_init(void);
46extern void icmp_out_count(struct net *net, unsigned char type); 46extern void icmp_out_count(struct net *net, unsigned char type);
47 47
48/* Move into dst.h ? */
49extern int xrlim_allow(struct dst_entry *dst, int timeout);
50
51#endif /* _ICMP_H */ 48#endif /* _ICMP_H */
diff --git a/include/net/ieee80211_radiotap.h b/include/net/ieee80211_radiotap.h
index af49f8ab7f81..b0be5fb9de19 100644
--- a/include/net/ieee80211_radiotap.h
+++ b/include/net/ieee80211_radiotap.h
@@ -178,6 +178,11 @@ struct ieee80211_radiotap_header {
178 * 178 *
179 * Number of unicast retries a transmitted frame used. 179 * Number of unicast retries a transmitted frame used.
180 * 180 *
181 * IEEE80211_RADIOTAP_MCS u8, u8, u8 unitless
182 *
183 * Contains a bitmap of known fields/flags, the flags, and
184 * the MCS index.
185 *
181 */ 186 */
182enum ieee80211_radiotap_type { 187enum ieee80211_radiotap_type {
183 IEEE80211_RADIOTAP_TSFT = 0, 188 IEEE80211_RADIOTAP_TSFT = 0,
@@ -199,6 +204,8 @@ enum ieee80211_radiotap_type {
199 IEEE80211_RADIOTAP_RTS_RETRIES = 16, 204 IEEE80211_RADIOTAP_RTS_RETRIES = 16,
200 IEEE80211_RADIOTAP_DATA_RETRIES = 17, 205 IEEE80211_RADIOTAP_DATA_RETRIES = 17,
201 206
207 IEEE80211_RADIOTAP_MCS = 19,
208
202 /* valid in every it_present bitmap, even vendor namespaces */ 209 /* valid in every it_present bitmap, even vendor namespaces */
203 IEEE80211_RADIOTAP_RADIOTAP_NAMESPACE = 29, 210 IEEE80211_RADIOTAP_RADIOTAP_NAMESPACE = 29,
204 IEEE80211_RADIOTAP_VENDOR_NAMESPACE = 30, 211 IEEE80211_RADIOTAP_VENDOR_NAMESPACE = 30,
@@ -245,6 +252,24 @@ enum ieee80211_radiotap_type {
245#define IEEE80211_RADIOTAP_F_TX_CTS 0x0002 /* used cts 'protection' */ 252#define IEEE80211_RADIOTAP_F_TX_CTS 0x0002 /* used cts 'protection' */
246#define IEEE80211_RADIOTAP_F_TX_RTS 0x0004 /* used rts/cts handshake */ 253#define IEEE80211_RADIOTAP_F_TX_RTS 0x0004 /* used rts/cts handshake */
247 254
255
256/* For IEEE80211_RADIOTAP_MCS */
257#define IEEE80211_RADIOTAP_MCS_HAVE_BW 0x01
258#define IEEE80211_RADIOTAP_MCS_HAVE_MCS 0x02
259#define IEEE80211_RADIOTAP_MCS_HAVE_GI 0x04
260#define IEEE80211_RADIOTAP_MCS_HAVE_FMT 0x08
261#define IEEE80211_RADIOTAP_MCS_HAVE_FEC 0x10
262
263#define IEEE80211_RADIOTAP_MCS_BW_MASK 0x03
264#define IEEE80211_RADIOTAP_MCS_BW_20 0
265#define IEEE80211_RADIOTAP_MCS_BW_40 1
266#define IEEE80211_RADIOTAP_MCS_BW_20L 2
267#define IEEE80211_RADIOTAP_MCS_BW_20U 3
268#define IEEE80211_RADIOTAP_MCS_SGI 0x04
269#define IEEE80211_RADIOTAP_MCS_FMT_GF 0x08
270#define IEEE80211_RADIOTAP_MCS_FEC_LDPC 0x10
271
272
248/* Ugly macro to convert literal channel numbers into their mhz equivalents 273/* Ugly macro to convert literal channel numbers into their mhz equivalents
249 * There are certianly some conditions that will break this (like feeding it '30') 274 * There are certianly some conditions that will break this (like feeding it '30')
250 * but they shouldn't arise since nothing talks on channel 30. */ 275 * but they shouldn't arise since nothing talks on channel 30. */
diff --git a/include/net/inet_sock.h b/include/net/inet_sock.h
index 8181498fa96c..7a37369f8ea3 100644
--- a/include/net/inet_sock.h
+++ b/include/net/inet_sock.h
@@ -86,6 +86,19 @@ static inline struct inet_request_sock *inet_rsk(const struct request_sock *sk)
86 return (struct inet_request_sock *)sk; 86 return (struct inet_request_sock *)sk;
87} 87}
88 88
89struct inet_cork {
90 unsigned int flags;
91 unsigned int fragsize;
92 struct ip_options *opt;
93 struct dst_entry *dst;
94 int length; /* Total length of all frames */
95 __be32 addr;
96 struct flowi fl;
97 struct page *page;
98 u32 off;
99 u8 tx_flags;
100};
101
89struct ip_mc_socklist; 102struct ip_mc_socklist;
90struct ipv6_pinfo; 103struct ipv6_pinfo;
91struct rtable; 104struct rtable;
@@ -143,15 +156,7 @@ struct inet_sock {
143 int mc_index; 156 int mc_index;
144 __be32 mc_addr; 157 __be32 mc_addr;
145 struct ip_mc_socklist __rcu *mc_list; 158 struct ip_mc_socklist __rcu *mc_list;
146 struct { 159 struct inet_cork cork;
147 unsigned int flags;
148 unsigned int fragsize;
149 struct ip_options *opt;
150 struct dst_entry *dst;
151 int length; /* Total length of all frames */
152 __be32 addr;
153 struct flowi fl;
154 } cork;
155}; 160};
156 161
157#define IPCORK_OPT 1 /* ip-options has been held in ipcork.opt */ 162#define IPCORK_OPT 1 /* ip-options has been held in ipcork.opt */
@@ -219,7 +224,13 @@ static inline struct request_sock *inet_reqsk_alloc(struct request_sock_ops *ops
219 224
220static inline __u8 inet_sk_flowi_flags(const struct sock *sk) 225static inline __u8 inet_sk_flowi_flags(const struct sock *sk)
221{ 226{
222 return inet_sk(sk)->transparent ? FLOWI_FLAG_ANYSRC : 0; 227 __u8 flags = 0;
228
229 if (inet_sk(sk)->transparent)
230 flags |= FLOWI_FLAG_ANYSRC;
231 if (sk->sk_protocol == IPPROTO_TCP)
232 flags |= FLOWI_FLAG_PRECOW_METRICS;
233 return flags;
223} 234}
224 235
225#endif /* _INET_SOCK_H */ 236#endif /* _INET_SOCK_H */
diff --git a/include/net/inetpeer.h b/include/net/inetpeer.h
index 599d96e74114..e6dd8da6b2ad 100644
--- a/include/net/inetpeer.h
+++ b/include/net/inetpeer.h
@@ -11,15 +11,20 @@
11#include <linux/init.h> 11#include <linux/init.h>
12#include <linux/jiffies.h> 12#include <linux/jiffies.h>
13#include <linux/spinlock.h> 13#include <linux/spinlock.h>
14#include <linux/rtnetlink.h>
14#include <net/ipv6.h> 15#include <net/ipv6.h>
15#include <asm/atomic.h> 16#include <asm/atomic.h>
16 17
17struct inetpeer_addr { 18struct inetpeer_addr_base {
18 union { 19 union {
19 __be32 a4; 20 __be32 a4;
20 __be32 a6[4]; 21 __be32 a6[4];
21 }; 22 };
22 __u16 family; 23};
24
25struct inetpeer_addr {
26 struct inetpeer_addr_base addr;
27 __u16 family;
23}; 28};
24 29
25struct inet_peer { 30struct inet_peer {
@@ -33,15 +38,22 @@ struct inet_peer {
33 atomic_t refcnt; 38 atomic_t refcnt;
34 /* 39 /*
35 * Once inet_peer is queued for deletion (refcnt == -1), following fields 40 * Once inet_peer is queued for deletion (refcnt == -1), following fields
36 * are not available: rid, ip_id_count, tcp_ts, tcp_ts_stamp 41 * are not available: rid, ip_id_count, tcp_ts, tcp_ts_stamp, metrics
37 * We can share memory with rcu_head to keep inet_peer small 42 * We can share memory with rcu_head to help keep inet_peer small.
38 */ 43 */
39 union { 44 union {
40 struct { 45 struct {
41 atomic_t rid; /* Frag reception counter */ 46 atomic_t rid; /* Frag reception counter */
42 atomic_t ip_id_count; /* IP ID for the next packet */ 47 atomic_t ip_id_count; /* IP ID for the next packet */
43 __u32 tcp_ts; 48 __u32 tcp_ts;
44 __u32 tcp_ts_stamp; 49 __u32 tcp_ts_stamp;
50 u32 metrics[RTAX_MAX];
51 u32 rate_tokens; /* rate limiting for ICMP */
52 unsigned long rate_last;
53 unsigned long pmtu_expires;
54 u32 pmtu_orig;
55 u32 pmtu_learned;
56 struct inetpeer_addr_base redirect_learned;
45 }; 57 };
46 struct rcu_head rcu; 58 struct rcu_head rcu;
47 }; 59 };
@@ -49,6 +61,13 @@ struct inet_peer {
49 61
50void inet_initpeers(void) __init; 62void inet_initpeers(void) __init;
51 63
64#define INETPEER_METRICS_NEW (~(u32) 0)
65
66static inline bool inet_metrics_new(const struct inet_peer *p)
67{
68 return p->metrics[RTAX_LOCK-1] == INETPEER_METRICS_NEW;
69}
70
52/* can be called with or without local BH being disabled */ 71/* can be called with or without local BH being disabled */
53struct inet_peer *inet_getpeer(struct inetpeer_addr *daddr, int create); 72struct inet_peer *inet_getpeer(struct inetpeer_addr *daddr, int create);
54 73
@@ -56,7 +75,7 @@ static inline struct inet_peer *inet_getpeer_v4(__be32 v4daddr, int create)
56{ 75{
57 struct inetpeer_addr daddr; 76 struct inetpeer_addr daddr;
58 77
59 daddr.a4 = v4daddr; 78 daddr.addr.a4 = v4daddr;
60 daddr.family = AF_INET; 79 daddr.family = AF_INET;
61 return inet_getpeer(&daddr, create); 80 return inet_getpeer(&daddr, create);
62} 81}
@@ -65,13 +84,14 @@ static inline struct inet_peer *inet_getpeer_v6(struct in6_addr *v6daddr, int cr
65{ 84{
66 struct inetpeer_addr daddr; 85 struct inetpeer_addr daddr;
67 86
68 ipv6_addr_copy((struct in6_addr *)daddr.a6, v6daddr); 87 ipv6_addr_copy((struct in6_addr *)daddr.addr.a6, v6daddr);
69 daddr.family = AF_INET6; 88 daddr.family = AF_INET6;
70 return inet_getpeer(&daddr, create); 89 return inet_getpeer(&daddr, create);
71} 90}
72 91
73/* can be called from BH context or outside */ 92/* can be called from BH context or outside */
74extern void inet_putpeer(struct inet_peer *p); 93extern void inet_putpeer(struct inet_peer *p);
94extern bool inet_peer_xrlim_allow(struct inet_peer *peer, int timeout);
75 95
76/* 96/*
77 * temporary check to make sure we dont access rid, ip_id_count, tcp_ts, 97 * temporary check to make sure we dont access rid, ip_id_count, tcp_ts,
diff --git a/include/net/ip.h b/include/net/ip.h
index 67fac78a186b..a4f631108c54 100644
--- a/include/net/ip.h
+++ b/include/net/ip.h
@@ -116,8 +116,24 @@ extern int ip_append_data(struct sock *sk,
116extern int ip_generic_getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb); 116extern int ip_generic_getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb);
117extern ssize_t ip_append_page(struct sock *sk, struct page *page, 117extern ssize_t ip_append_page(struct sock *sk, struct page *page,
118 int offset, size_t size, int flags); 118 int offset, size_t size, int flags);
119extern struct sk_buff *__ip_make_skb(struct sock *sk,
120 struct sk_buff_head *queue,
121 struct inet_cork *cork);
122extern int ip_send_skb(struct sk_buff *skb);
119extern int ip_push_pending_frames(struct sock *sk); 123extern int ip_push_pending_frames(struct sock *sk);
120extern void ip_flush_pending_frames(struct sock *sk); 124extern void ip_flush_pending_frames(struct sock *sk);
125extern struct sk_buff *ip_make_skb(struct sock *sk,
126 int getfrag(void *from, char *to, int offset, int len,
127 int odd, struct sk_buff *skb),
128 void *from, int length, int transhdrlen,
129 struct ipcm_cookie *ipc,
130 struct rtable **rtp,
131 unsigned int flags);
132
133static inline struct sk_buff *ip_finish_skb(struct sock *sk)
134{
135 return __ip_make_skb(sk, &sk->sk_write_queue, &inet_sk(sk)->cork);
136}
121 137
122/* datagram.c */ 138/* datagram.c */
123extern int ip4_datagram_connect(struct sock *sk, 139extern int ip4_datagram_connect(struct sock *sk,
diff --git a/include/net/ip6_fib.h b/include/net/ip6_fib.h
index 708ff7cb8806..bc3cde0a810c 100644
--- a/include/net/ip6_fib.h
+++ b/include/net/ip6_fib.h
@@ -108,6 +108,7 @@ struct rt6_info {
108 u32 rt6i_flags; 108 u32 rt6i_flags;
109 struct rt6key rt6i_src; 109 struct rt6key rt6i_src;
110 u32 rt6i_metric; 110 u32 rt6i_metric;
111 u32 rt6i_peer_genid;
111 112
112 struct inet6_dev *rt6i_idev; 113 struct inet6_dev *rt6i_idev;
113 struct inet_peer *rt6i_peer; 114 struct inet_peer *rt6i_peer;
@@ -182,7 +183,7 @@ struct fib6_table {
182 183
183typedef struct rt6_info *(*pol_lookup_t)(struct net *, 184typedef struct rt6_info *(*pol_lookup_t)(struct net *,
184 struct fib6_table *, 185 struct fib6_table *,
185 struct flowi *, int); 186 struct flowi6 *, int);
186 187
187/* 188/*
188 * exported functions 189 * exported functions
@@ -191,7 +192,7 @@ typedef struct rt6_info *(*pol_lookup_t)(struct net *,
191extern struct fib6_table *fib6_get_table(struct net *net, u32 id); 192extern struct fib6_table *fib6_get_table(struct net *net, u32 id);
192extern struct fib6_table *fib6_new_table(struct net *net, u32 id); 193extern struct fib6_table *fib6_new_table(struct net *net, u32 id);
193extern struct dst_entry *fib6_rule_lookup(struct net *net, 194extern struct dst_entry *fib6_rule_lookup(struct net *net,
194 struct flowi *fl, int flags, 195 struct flowi6 *fl6, int flags,
195 pol_lookup_t lookup); 196 pol_lookup_t lookup);
196 197
197extern struct fib6_node *fib6_lookup(struct fib6_node *root, 198extern struct fib6_node *fib6_lookup(struct fib6_node *root,
diff --git a/include/net/ip6_route.h b/include/net/ip6_route.h
index 8552f0a2e854..642a80bb42cf 100644
--- a/include/net/ip6_route.h
+++ b/include/net/ip6_route.h
@@ -71,7 +71,7 @@ extern void ip6_route_input(struct sk_buff *skb);
71 71
72extern struct dst_entry * ip6_route_output(struct net *net, 72extern struct dst_entry * ip6_route_output(struct net *net,
73 struct sock *sk, 73 struct sock *sk,
74 struct flowi *fl); 74 struct flowi6 *fl6);
75 75
76extern int ip6_route_init(void); 76extern int ip6_route_init(void);
77extern void ip6_route_cleanup(void); 77extern void ip6_route_cleanup(void);
diff --git a/include/net/ip_fib.h b/include/net/ip_fib.h
index 07bdb5e9e8ac..a1a858035913 100644
--- a/include/net/ip_fib.h
+++ b/include/net/ip_fib.h
@@ -51,15 +51,17 @@ struct fib_nh {
51 struct fib_info *nh_parent; 51 struct fib_info *nh_parent;
52 unsigned nh_flags; 52 unsigned nh_flags;
53 unsigned char nh_scope; 53 unsigned char nh_scope;
54 unsigned char nh_cfg_scope;
54#ifdef CONFIG_IP_ROUTE_MULTIPATH 55#ifdef CONFIG_IP_ROUTE_MULTIPATH
55 int nh_weight; 56 int nh_weight;
56 int nh_power; 57 int nh_power;
57#endif 58#endif
58#ifdef CONFIG_NET_CLS_ROUTE 59#ifdef CONFIG_IP_ROUTE_CLASSID
59 __u32 nh_tclassid; 60 __u32 nh_tclassid;
60#endif 61#endif
61 int nh_oif; 62 int nh_oif;
62 __be32 nh_gw; 63 __be32 nh_gw;
64 __be32 nh_saddr;
63}; 65};
64 66
65/* 67/*
@@ -77,7 +79,7 @@ struct fib_info {
77 int fib_protocol; 79 int fib_protocol;
78 __be32 fib_prefsrc; 80 __be32 fib_prefsrc;
79 u32 fib_priority; 81 u32 fib_priority;
80 u32 fib_metrics[RTAX_MAX]; 82 u32 *fib_metrics;
81#define fib_mtu fib_metrics[RTAX_MTU-1] 83#define fib_mtu fib_metrics[RTAX_MTU-1]
82#define fib_window fib_metrics[RTAX_WINDOW-1] 84#define fib_window fib_metrics[RTAX_WINDOW-1]
83#define fib_rtt fib_metrics[RTAX_RTT-1] 85#define fib_rtt fib_metrics[RTAX_RTT-1]
@@ -96,12 +98,15 @@ struct fib_info {
96struct fib_rule; 98struct fib_rule;
97#endif 99#endif
98 100
101struct fib_table;
99struct fib_result { 102struct fib_result {
100 unsigned char prefixlen; 103 unsigned char prefixlen;
101 unsigned char nh_sel; 104 unsigned char nh_sel;
102 unsigned char type; 105 unsigned char type;
103 unsigned char scope; 106 unsigned char scope;
104 struct fib_info *fi; 107 struct fib_info *fi;
108 struct fib_table *table;
109 struct list_head *fa_head;
105#ifdef CONFIG_IP_MULTIPLE_TABLES 110#ifdef CONFIG_IP_MULTIPLE_TABLES
106 struct fib_rule *r; 111 struct fib_rule *r;
107#endif 112#endif
@@ -136,11 +141,13 @@ struct fib_result_nl {
136 141
137#endif /* CONFIG_IP_ROUTE_MULTIPATH */ 142#endif /* CONFIG_IP_ROUTE_MULTIPATH */
138 143
139#define FIB_RES_PREFSRC(res) ((res).fi->fib_prefsrc ? : __fib_res_prefsrc(&res)) 144#define FIB_RES_SADDR(res) (FIB_RES_NH(res).nh_saddr)
140#define FIB_RES_GW(res) (FIB_RES_NH(res).nh_gw) 145#define FIB_RES_GW(res) (FIB_RES_NH(res).nh_gw)
141#define FIB_RES_DEV(res) (FIB_RES_NH(res).nh_dev) 146#define FIB_RES_DEV(res) (FIB_RES_NH(res).nh_dev)
142#define FIB_RES_OIF(res) (FIB_RES_NH(res).nh_oif) 147#define FIB_RES_OIF(res) (FIB_RES_NH(res).nh_oif)
143 148
149#define FIB_RES_PREFSRC(res) ((res).fi->fib_prefsrc ? : FIB_RES_SADDR(res))
150
144struct fib_table { 151struct fib_table {
145 struct hlist_node tb_hlist; 152 struct hlist_node tb_hlist;
146 u32 tb_id; 153 u32 tb_id;
@@ -148,16 +155,13 @@ struct fib_table {
148 unsigned char tb_data[0]; 155 unsigned char tb_data[0];
149}; 156};
150 157
151extern int fib_table_lookup(struct fib_table *tb, const struct flowi *flp, 158extern int fib_table_lookup(struct fib_table *tb, const struct flowi4 *flp,
152 struct fib_result *res, int fib_flags); 159 struct fib_result *res, int fib_flags);
153extern int fib_table_insert(struct fib_table *, struct fib_config *); 160extern int fib_table_insert(struct fib_table *, struct fib_config *);
154extern int fib_table_delete(struct fib_table *, struct fib_config *); 161extern int fib_table_delete(struct fib_table *, struct fib_config *);
155extern int fib_table_dump(struct fib_table *table, struct sk_buff *skb, 162extern int fib_table_dump(struct fib_table *table, struct sk_buff *skb,
156 struct netlink_callback *cb); 163 struct netlink_callback *cb);
157extern int fib_table_flush(struct fib_table *table); 164extern int fib_table_flush(struct fib_table *table);
158extern void fib_table_select_default(struct fib_table *table,
159 const struct flowi *flp,
160 struct fib_result *res);
161extern void fib_free_table(struct fib_table *tb); 165extern void fib_free_table(struct fib_table *tb);
162 166
163 167
@@ -182,7 +186,7 @@ static inline struct fib_table *fib_new_table(struct net *net, u32 id)
182 return fib_get_table(net, id); 186 return fib_get_table(net, id);
183} 187}
184 188
185static inline int fib_lookup(struct net *net, const struct flowi *flp, 189static inline int fib_lookup(struct net *net, const struct flowi4 *flp,
186 struct fib_result *res) 190 struct fib_result *res)
187{ 191{
188 struct fib_table *table; 192 struct fib_table *table;
@@ -201,11 +205,11 @@ static inline int fib_lookup(struct net *net, const struct flowi *flp,
201extern int __net_init fib4_rules_init(struct net *net); 205extern int __net_init fib4_rules_init(struct net *net);
202extern void __net_exit fib4_rules_exit(struct net *net); 206extern void __net_exit fib4_rules_exit(struct net *net);
203 207
204#ifdef CONFIG_NET_CLS_ROUTE 208#ifdef CONFIG_IP_ROUTE_CLASSID
205extern u32 fib_rules_tclass(struct fib_result *res); 209extern u32 fib_rules_tclass(const struct fib_result *res);
206#endif 210#endif
207 211
208extern int fib_lookup(struct net *n, struct flowi *flp, struct fib_result *res); 212extern int fib_lookup(struct net *n, struct flowi4 *flp, struct fib_result *res);
209 213
210extern struct fib_table *fib_new_table(struct net *net, u32 id); 214extern struct fib_table *fib_new_table(struct net *net, u32 id);
211extern struct fib_table *fib_get_table(struct net *net, u32 id); 215extern struct fib_table *fib_get_table(struct net *net, u32 id);
@@ -218,24 +222,23 @@ extern void ip_fib_init(void);
218extern int fib_validate_source(__be32 src, __be32 dst, u8 tos, int oif, 222extern int fib_validate_source(__be32 src, __be32 dst, u8 tos, int oif,
219 struct net_device *dev, __be32 *spec_dst, 223 struct net_device *dev, __be32 *spec_dst,
220 u32 *itag, u32 mark); 224 u32 *itag, u32 mark);
221extern void fib_select_default(struct net *net, const struct flowi *flp, 225extern void fib_select_default(struct fib_result *res);
222 struct fib_result *res);
223 226
224/* Exported by fib_semantics.c */ 227/* Exported by fib_semantics.c */
225extern int ip_fib_check_default(__be32 gw, struct net_device *dev); 228extern int ip_fib_check_default(__be32 gw, struct net_device *dev);
226extern int fib_sync_down_dev(struct net_device *dev, int force); 229extern int fib_sync_down_dev(struct net_device *dev, int force);
227extern int fib_sync_down_addr(struct net *net, __be32 local); 230extern int fib_sync_down_addr(struct net *net, __be32 local);
231extern void fib_update_nh_saddrs(struct net_device *dev);
228extern int fib_sync_up(struct net_device *dev); 232extern int fib_sync_up(struct net_device *dev);
229extern __be32 __fib_res_prefsrc(struct fib_result *res); 233extern void fib_select_multipath(struct fib_result *res);
230extern void fib_select_multipath(const struct flowi *flp, struct fib_result *res);
231 234
232/* Exported by fib_{hash|trie}.c */ 235/* Exported by fib_trie.c */
233extern void fib_hash_init(void); 236extern void fib_trie_init(void);
234extern struct fib_table *fib_hash_table(u32 id); 237extern struct fib_table *fib_trie_table(u32 id);
235 238
236static inline void fib_combine_itag(u32 *itag, struct fib_result *res) 239static inline void fib_combine_itag(u32 *itag, const struct fib_result *res)
237{ 240{
238#ifdef CONFIG_NET_CLS_ROUTE 241#ifdef CONFIG_IP_ROUTE_CLASSID
239#ifdef CONFIG_IP_MULTIPLE_TABLES 242#ifdef CONFIG_IP_MULTIPLE_TABLES
240 u32 rtag; 243 u32 rtag;
241#endif 244#endif
diff --git a/include/net/ip_vs.h b/include/net/ip_vs.h
index b7bbd6c28cfa..272f59336b73 100644
--- a/include/net/ip_vs.h
+++ b/include/net/ip_vs.h
@@ -28,6 +28,80 @@
28#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) 28#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
29#include <net/netfilter/nf_conntrack.h> 29#include <net/netfilter/nf_conntrack.h>
30#endif 30#endif
31#include <net/net_namespace.h> /* Netw namespace */
32
33/*
34 * Generic access of ipvs struct
35 */
36static inline struct netns_ipvs *net_ipvs(struct net* net)
37{
38 return net->ipvs;
39}
40/*
41 * Get net ptr from skb in traffic cases
42 * use skb_sknet when call is from userland (ioctl or netlink)
43 */
44static inline struct net *skb_net(const struct sk_buff *skb)
45{
46#ifdef CONFIG_NET_NS
47#ifdef CONFIG_IP_VS_DEBUG
48 /*
49 * This is used for debug only.
50 * Start with the most likely hit
51 * End with BUG
52 */
53 if (likely(skb->dev && skb->dev->nd_net))
54 return dev_net(skb->dev);
55 if (skb_dst(skb)->dev)
56 return dev_net(skb_dst(skb)->dev);
57 WARN(skb->sk, "Maybe skb_sknet should be used in %s() at line:%d\n",
58 __func__, __LINE__);
59 if (likely(skb->sk && skb->sk->sk_net))
60 return sock_net(skb->sk);
61 pr_err("There is no net ptr to find in the skb in %s() line:%d\n",
62 __func__, __LINE__);
63 BUG();
64#else
65 return dev_net(skb->dev ? : skb_dst(skb)->dev);
66#endif
67#else
68 return &init_net;
69#endif
70}
71
72static inline struct net *skb_sknet(const struct sk_buff *skb)
73{
74#ifdef CONFIG_NET_NS
75#ifdef CONFIG_IP_VS_DEBUG
76 /* Start with the most likely hit */
77 if (likely(skb->sk && skb->sk->sk_net))
78 return sock_net(skb->sk);
79 WARN(skb->dev, "Maybe skb_net should be used instead in %s() line:%d\n",
80 __func__, __LINE__);
81 if (likely(skb->dev && skb->dev->nd_net))
82 return dev_net(skb->dev);
83 pr_err("There is no net ptr to find in the skb in %s() line:%d\n",
84 __func__, __LINE__);
85 BUG();
86#else
87 return sock_net(skb->sk);
88#endif
89#else
90 return &init_net;
91#endif
92}
93/*
94 * This one needed for single_open_net since net is stored directly in
95 * private not as a struct i.e. seq_file_net cant be used.
96 */
97static inline struct net *seq_file_single_net(struct seq_file *seq)
98{
99#ifdef CONFIG_NET_NS
100 return (struct net *)seq->private;
101#else
102 return &init_net;
103#endif
104}
31 105
32/* Connections' size value needed by ip_vs_ctl.c */ 106/* Connections' size value needed by ip_vs_ctl.c */
33extern int ip_vs_conn_tab_size; 107extern int ip_vs_conn_tab_size;
@@ -258,6 +332,23 @@ struct ip_vs_seq {
258 before last resized pkt */ 332 before last resized pkt */
259}; 333};
260 334
335/*
336 * counters per cpu
337 */
338struct ip_vs_counters {
339 __u32 conns; /* connections scheduled */
340 __u32 inpkts; /* incoming packets */
341 __u32 outpkts; /* outgoing packets */
342 __u64 inbytes; /* incoming bytes */
343 __u64 outbytes; /* outgoing bytes */
344};
345/*
346 * Stats per cpu
347 */
348struct ip_vs_cpu_stats {
349 struct ip_vs_counters ustats;
350 struct u64_stats_sync syncp;
351};
261 352
262/* 353/*
263 * IPVS statistics objects 354 * IPVS statistics objects
@@ -279,10 +370,11 @@ struct ip_vs_estimator {
279}; 370};
280 371
281struct ip_vs_stats { 372struct ip_vs_stats {
282 struct ip_vs_stats_user ustats; /* statistics */ 373 struct ip_vs_stats_user ustats; /* statistics */
283 struct ip_vs_estimator est; /* estimator */ 374 struct ip_vs_estimator est; /* estimator */
284 375 struct ip_vs_cpu_stats *cpustats; /* per cpu counters */
285 spinlock_t lock; /* spin lock */ 376 spinlock_t lock; /* spin lock */
377 struct ip_vs_stats_user ustats0; /* reset values */
286}; 378};
287 379
288struct dst_entry; 380struct dst_entry;
@@ -290,6 +382,7 @@ struct iphdr;
290struct ip_vs_conn; 382struct ip_vs_conn;
291struct ip_vs_app; 383struct ip_vs_app;
292struct sk_buff; 384struct sk_buff;
385struct ip_vs_proto_data;
293 386
294struct ip_vs_protocol { 387struct ip_vs_protocol {
295 struct ip_vs_protocol *next; 388 struct ip_vs_protocol *next;
@@ -297,21 +390,22 @@ struct ip_vs_protocol {
297 u16 protocol; 390 u16 protocol;
298 u16 num_states; 391 u16 num_states;
299 int dont_defrag; 392 int dont_defrag;
300 atomic_t appcnt; /* counter of proto app incs */
301 int *timeout_table; /* protocol timeout table */
302 393
303 void (*init)(struct ip_vs_protocol *pp); 394 void (*init)(struct ip_vs_protocol *pp);
304 395
305 void (*exit)(struct ip_vs_protocol *pp); 396 void (*exit)(struct ip_vs_protocol *pp);
306 397
398 void (*init_netns)(struct net *net, struct ip_vs_proto_data *pd);
399
400 void (*exit_netns)(struct net *net, struct ip_vs_proto_data *pd);
401
307 int (*conn_schedule)(int af, struct sk_buff *skb, 402 int (*conn_schedule)(int af, struct sk_buff *skb,
308 struct ip_vs_protocol *pp, 403 struct ip_vs_proto_data *pd,
309 int *verdict, struct ip_vs_conn **cpp); 404 int *verdict, struct ip_vs_conn **cpp);
310 405
311 struct ip_vs_conn * 406 struct ip_vs_conn *
312 (*conn_in_get)(int af, 407 (*conn_in_get)(int af,
313 const struct sk_buff *skb, 408 const struct sk_buff *skb,
314 struct ip_vs_protocol *pp,
315 const struct ip_vs_iphdr *iph, 409 const struct ip_vs_iphdr *iph,
316 unsigned int proto_off, 410 unsigned int proto_off,
317 int inverse); 411 int inverse);
@@ -319,7 +413,6 @@ struct ip_vs_protocol {
319 struct ip_vs_conn * 413 struct ip_vs_conn *
320 (*conn_out_get)(int af, 414 (*conn_out_get)(int af,
321 const struct sk_buff *skb, 415 const struct sk_buff *skb,
322 struct ip_vs_protocol *pp,
323 const struct ip_vs_iphdr *iph, 416 const struct ip_vs_iphdr *iph,
324 unsigned int proto_off, 417 unsigned int proto_off,
325 int inverse); 418 int inverse);
@@ -337,11 +430,11 @@ struct ip_vs_protocol {
337 430
338 int (*state_transition)(struct ip_vs_conn *cp, int direction, 431 int (*state_transition)(struct ip_vs_conn *cp, int direction,
339 const struct sk_buff *skb, 432 const struct sk_buff *skb,
340 struct ip_vs_protocol *pp); 433 struct ip_vs_proto_data *pd);
341 434
342 int (*register_app)(struct ip_vs_app *inc); 435 int (*register_app)(struct net *net, struct ip_vs_app *inc);
343 436
344 void (*unregister_app)(struct ip_vs_app *inc); 437 void (*unregister_app)(struct net *net, struct ip_vs_app *inc);
345 438
346 int (*app_conn_bind)(struct ip_vs_conn *cp); 439 int (*app_conn_bind)(struct ip_vs_conn *cp);
347 440
@@ -350,14 +443,26 @@ struct ip_vs_protocol {
350 int offset, 443 int offset,
351 const char *msg); 444 const char *msg);
352 445
353 void (*timeout_change)(struct ip_vs_protocol *pp, int flags); 446 void (*timeout_change)(struct ip_vs_proto_data *pd, int flags);
447};
354 448
355 int (*set_state_timeout)(struct ip_vs_protocol *pp, char *sname, int to); 449/*
450 * protocol data per netns
451 */
452struct ip_vs_proto_data {
453 struct ip_vs_proto_data *next;
454 struct ip_vs_protocol *pp;
455 int *timeout_table; /* protocol timeout table */
456 atomic_t appcnt; /* counter of proto app incs. */
457 struct tcp_states_t *tcp_state_table;
356}; 458};
357 459
358extern struct ip_vs_protocol * ip_vs_proto_get(unsigned short proto); 460extern struct ip_vs_protocol *ip_vs_proto_get(unsigned short proto);
461extern struct ip_vs_proto_data *ip_vs_proto_data_get(struct net *net,
462 unsigned short proto);
359 463
360struct ip_vs_conn_param { 464struct ip_vs_conn_param {
465 struct net *net;
361 const union nf_inet_addr *caddr; 466 const union nf_inet_addr *caddr;
362 const union nf_inet_addr *vaddr; 467 const union nf_inet_addr *vaddr;
363 __be16 cport; 468 __be16 cport;
@@ -374,17 +479,20 @@ struct ip_vs_conn_param {
374 * IP_VS structure allocated for each dynamically scheduled connection 479 * IP_VS structure allocated for each dynamically scheduled connection
375 */ 480 */
376struct ip_vs_conn { 481struct ip_vs_conn {
377 struct list_head c_list; /* hashed list heads */ 482 struct hlist_node c_list; /* hashed list heads */
378 483#ifdef CONFIG_NET_NS
484 struct net *net; /* Name space */
485#endif
379 /* Protocol, addresses and port numbers */ 486 /* Protocol, addresses and port numbers */
380 u16 af; /* address family */ 487 u16 af; /* address family */
381 union nf_inet_addr caddr; /* client address */ 488 __be16 cport;
382 union nf_inet_addr vaddr; /* virtual address */ 489 __be16 vport;
383 union nf_inet_addr daddr; /* destination address */ 490 __be16 dport;
384 volatile __u32 flags; /* status flags */ 491 __u32 fwmark; /* Fire wall mark from skb */
385 __be16 cport; 492 union nf_inet_addr caddr; /* client address */
386 __be16 vport; 493 union nf_inet_addr vaddr; /* virtual address */
387 __be16 dport; 494 union nf_inet_addr daddr; /* destination address */
495 volatile __u32 flags; /* status flags */
388 __u16 protocol; /* Which protocol (TCP/UDP) */ 496 __u16 protocol; /* Which protocol (TCP/UDP) */
389 497
390 /* counter and timer */ 498 /* counter and timer */
@@ -422,10 +530,38 @@ struct ip_vs_conn {
422 struct ip_vs_seq in_seq; /* incoming seq. struct */ 530 struct ip_vs_seq in_seq; /* incoming seq. struct */
423 struct ip_vs_seq out_seq; /* outgoing seq. struct */ 531 struct ip_vs_seq out_seq; /* outgoing seq. struct */
424 532
533 const struct ip_vs_pe *pe;
425 char *pe_data; 534 char *pe_data;
426 __u8 pe_data_len; 535 __u8 pe_data_len;
427}; 536};
428 537
538/*
539 * To save some memory in conn table when name space is disabled.
540 */
541static inline struct net *ip_vs_conn_net(const struct ip_vs_conn *cp)
542{
543#ifdef CONFIG_NET_NS
544 return cp->net;
545#else
546 return &init_net;
547#endif
548}
549static inline void ip_vs_conn_net_set(struct ip_vs_conn *cp, struct net *net)
550{
551#ifdef CONFIG_NET_NS
552 cp->net = net;
553#endif
554}
555
556static inline int ip_vs_conn_net_eq(const struct ip_vs_conn *cp,
557 struct net *net)
558{
559#ifdef CONFIG_NET_NS
560 return cp->net == net;
561#else
562 return 1;
563#endif
564}
429 565
430/* 566/*
431 * Extended internal versions of struct ip_vs_service_user and 567 * Extended internal versions of struct ip_vs_service_user and
@@ -485,6 +621,7 @@ struct ip_vs_service {
485 unsigned flags; /* service status flags */ 621 unsigned flags; /* service status flags */
486 unsigned timeout; /* persistent timeout in ticks */ 622 unsigned timeout; /* persistent timeout in ticks */
487 __be32 netmask; /* grouping granularity */ 623 __be32 netmask; /* grouping granularity */
624 struct net *net;
488 625
489 struct list_head destinations; /* real server d-linked list */ 626 struct list_head destinations; /* real server d-linked list */
490 __u32 num_dests; /* number of servers */ 627 __u32 num_dests; /* number of servers */
@@ -510,8 +647,8 @@ struct ip_vs_dest {
510 struct list_head d_list; /* for table with all the dests */ 647 struct list_head d_list; /* for table with all the dests */
511 648
512 u16 af; /* address family */ 649 u16 af; /* address family */
513 union nf_inet_addr addr; /* IP address of the server */
514 __be16 port; /* port number of the server */ 650 __be16 port; /* port number of the server */
651 union nf_inet_addr addr; /* IP address of the server */
515 volatile unsigned flags; /* dest status flags */ 652 volatile unsigned flags; /* dest status flags */
516 atomic_t conn_flags; /* flags to copy to conn */ 653 atomic_t conn_flags; /* flags to copy to conn */
517 atomic_t weight; /* server weight */ 654 atomic_t weight; /* server weight */
@@ -538,8 +675,8 @@ struct ip_vs_dest {
538 /* for virtual service */ 675 /* for virtual service */
539 struct ip_vs_service *svc; /* service it belongs to */ 676 struct ip_vs_service *svc; /* service it belongs to */
540 __u16 protocol; /* which protocol (TCP/UDP) */ 677 __u16 protocol; /* which protocol (TCP/UDP) */
541 union nf_inet_addr vaddr; /* virtual IP address */
542 __be16 vport; /* virtual port number */ 678 __be16 vport; /* virtual port number */
679 union nf_inet_addr vaddr; /* virtual IP address */
543 __u32 vfwmark; /* firewall mark of service */ 680 __u32 vfwmark; /* firewall mark of service */
544}; 681};
545 682
@@ -651,6 +788,171 @@ struct ip_vs_app {
651 void (*timeout_change)(struct ip_vs_app *app, int flags); 788 void (*timeout_change)(struct ip_vs_app *app, int flags);
652}; 789};
653 790
791/* IPVS in network namespace */
792struct netns_ipvs {
793 int gen; /* Generation */
794 /*
795 * Hash table: for real service lookups
796 */
797 #define IP_VS_RTAB_BITS 4
798 #define IP_VS_RTAB_SIZE (1 << IP_VS_RTAB_BITS)
799 #define IP_VS_RTAB_MASK (IP_VS_RTAB_SIZE - 1)
800
801 struct list_head rs_table[IP_VS_RTAB_SIZE];
802 /* ip_vs_app */
803 struct list_head app_list;
804 struct mutex app_mutex;
805 struct lock_class_key app_key; /* mutex debuging */
806
807 /* ip_vs_proto */
808 #define IP_VS_PROTO_TAB_SIZE 32 /* must be power of 2 */
809 struct ip_vs_proto_data *proto_data_table[IP_VS_PROTO_TAB_SIZE];
810 /* ip_vs_proto_tcp */
811#ifdef CONFIG_IP_VS_PROTO_TCP
812 #define TCP_APP_TAB_BITS 4
813 #define TCP_APP_TAB_SIZE (1 << TCP_APP_TAB_BITS)
814 #define TCP_APP_TAB_MASK (TCP_APP_TAB_SIZE - 1)
815 struct list_head tcp_apps[TCP_APP_TAB_SIZE];
816 spinlock_t tcp_app_lock;
817#endif
818 /* ip_vs_proto_udp */
819#ifdef CONFIG_IP_VS_PROTO_UDP
820 #define UDP_APP_TAB_BITS 4
821 #define UDP_APP_TAB_SIZE (1 << UDP_APP_TAB_BITS)
822 #define UDP_APP_TAB_MASK (UDP_APP_TAB_SIZE - 1)
823 struct list_head udp_apps[UDP_APP_TAB_SIZE];
824 spinlock_t udp_app_lock;
825#endif
826 /* ip_vs_proto_sctp */
827#ifdef CONFIG_IP_VS_PROTO_SCTP
828 #define SCTP_APP_TAB_BITS 4
829 #define SCTP_APP_TAB_SIZE (1 << SCTP_APP_TAB_BITS)
830 #define SCTP_APP_TAB_MASK (SCTP_APP_TAB_SIZE - 1)
831 /* Hash table for SCTP application incarnations */
832 struct list_head sctp_apps[SCTP_APP_TAB_SIZE];
833 spinlock_t sctp_app_lock;
834#endif
835 /* ip_vs_conn */
836 atomic_t conn_count; /* connection counter */
837
838 /* ip_vs_ctl */
839 struct ip_vs_stats tot_stats; /* Statistics & est. */
840
841 int num_services; /* no of virtual services */
842
843 rwlock_t rs_lock; /* real services table */
844 /* semaphore for IPVS sockopts. And, [gs]etsockopt may sleep. */
845 struct lock_class_key ctl_key; /* ctl_mutex debuging */
846 /* Trash for destinations */
847 struct list_head dest_trash;
848 /* Service counters */
849 atomic_t ftpsvc_counter;
850 atomic_t nullsvc_counter;
851
852#ifdef CONFIG_SYSCTL
853 /* 1/rate drop and drop-entry variables */
854 struct delayed_work defense_work; /* Work handler */
855 int drop_rate;
856 int drop_counter;
857 atomic_t dropentry;
858 /* locks in ctl.c */
859 spinlock_t dropentry_lock; /* drop entry handling */
860 spinlock_t droppacket_lock; /* drop packet handling */
861 spinlock_t securetcp_lock; /* state and timeout tables */
862
863 /* sys-ctl struct */
864 struct ctl_table_header *sysctl_hdr;
865 struct ctl_table *sysctl_tbl;
866#endif
867
868 /* sysctl variables */
869 int sysctl_amemthresh;
870 int sysctl_am_droprate;
871 int sysctl_drop_entry;
872 int sysctl_drop_packet;
873 int sysctl_secure_tcp;
874#ifdef CONFIG_IP_VS_NFCT
875 int sysctl_conntrack;
876#endif
877 int sysctl_snat_reroute;
878 int sysctl_sync_ver;
879 int sysctl_cache_bypass;
880 int sysctl_expire_nodest_conn;
881 int sysctl_expire_quiescent_template;
882 int sysctl_sync_threshold[2];
883 int sysctl_nat_icmp_send;
884
885 /* ip_vs_lblc */
886 int sysctl_lblc_expiration;
887 struct ctl_table_header *lblc_ctl_header;
888 struct ctl_table *lblc_ctl_table;
889 /* ip_vs_lblcr */
890 int sysctl_lblcr_expiration;
891 struct ctl_table_header *lblcr_ctl_header;
892 struct ctl_table *lblcr_ctl_table;
893 /* ip_vs_est */
894 struct list_head est_list; /* estimator list */
895 spinlock_t est_lock;
896 struct timer_list est_timer; /* Estimation timer */
897 /* ip_vs_sync */
898 struct list_head sync_queue;
899 spinlock_t sync_lock;
900 struct ip_vs_sync_buff *sync_buff;
901 spinlock_t sync_buff_lock;
902 struct sockaddr_in sync_mcast_addr;
903 struct task_struct *master_thread;
904 struct task_struct *backup_thread;
905 int send_mesg_maxlen;
906 int recv_mesg_maxlen;
907 volatile int sync_state;
908 volatile int master_syncid;
909 volatile int backup_syncid;
910 /* multicast interface name */
911 char master_mcast_ifn[IP_VS_IFNAME_MAXLEN];
912 char backup_mcast_ifn[IP_VS_IFNAME_MAXLEN];
913 /* net name space ptr */
914 struct net *net; /* Needed by timer routines */
915};
916
917#define DEFAULT_SYNC_THRESHOLD 3
918#define DEFAULT_SYNC_PERIOD 50
919#define DEFAULT_SYNC_VER 1
920
921#ifdef CONFIG_SYSCTL
922
923static inline int sysctl_sync_threshold(struct netns_ipvs *ipvs)
924{
925 return ipvs->sysctl_sync_threshold[0];
926}
927
928static inline int sysctl_sync_period(struct netns_ipvs *ipvs)
929{
930 return ipvs->sysctl_sync_threshold[1];
931}
932
933static inline int sysctl_sync_ver(struct netns_ipvs *ipvs)
934{
935 return ipvs->sysctl_sync_ver;
936}
937
938#else
939
940static inline int sysctl_sync_threshold(struct netns_ipvs *ipvs)
941{
942 return DEFAULT_SYNC_THRESHOLD;
943}
944
945static inline int sysctl_sync_period(struct netns_ipvs *ipvs)
946{
947 return DEFAULT_SYNC_PERIOD;
948}
949
950static inline int sysctl_sync_ver(struct netns_ipvs *ipvs)
951{
952 return DEFAULT_SYNC_VER;
953}
954
955#endif
654 956
655/* 957/*
656 * IPVS core functions 958 * IPVS core functions
@@ -674,13 +976,14 @@ enum {
674 IP_VS_DIR_LAST, 976 IP_VS_DIR_LAST,
675}; 977};
676 978
677static inline void ip_vs_conn_fill_param(int af, int protocol, 979static inline void ip_vs_conn_fill_param(struct net *net, int af, int protocol,
678 const union nf_inet_addr *caddr, 980 const union nf_inet_addr *caddr,
679 __be16 cport, 981 __be16 cport,
680 const union nf_inet_addr *vaddr, 982 const union nf_inet_addr *vaddr,
681 __be16 vport, 983 __be16 vport,
682 struct ip_vs_conn_param *p) 984 struct ip_vs_conn_param *p)
683{ 985{
986 p->net = net;
684 p->af = af; 987 p->af = af;
685 p->protocol = protocol; 988 p->protocol = protocol;
686 p->caddr = caddr; 989 p->caddr = caddr;
@@ -695,7 +998,6 @@ struct ip_vs_conn *ip_vs_conn_in_get(const struct ip_vs_conn_param *p);
695struct ip_vs_conn *ip_vs_ct_in_get(const struct ip_vs_conn_param *p); 998struct ip_vs_conn *ip_vs_ct_in_get(const struct ip_vs_conn_param *p);
696 999
697struct ip_vs_conn * ip_vs_conn_in_get_proto(int af, const struct sk_buff *skb, 1000struct ip_vs_conn * ip_vs_conn_in_get_proto(int af, const struct sk_buff *skb,
698 struct ip_vs_protocol *pp,
699 const struct ip_vs_iphdr *iph, 1001 const struct ip_vs_iphdr *iph,
700 unsigned int proto_off, 1002 unsigned int proto_off,
701 int inverse); 1003 int inverse);
@@ -703,7 +1005,6 @@ struct ip_vs_conn * ip_vs_conn_in_get_proto(int af, const struct sk_buff *skb,
703struct ip_vs_conn *ip_vs_conn_out_get(const struct ip_vs_conn_param *p); 1005struct ip_vs_conn *ip_vs_conn_out_get(const struct ip_vs_conn_param *p);
704 1006
705struct ip_vs_conn * ip_vs_conn_out_get_proto(int af, const struct sk_buff *skb, 1007struct ip_vs_conn * ip_vs_conn_out_get_proto(int af, const struct sk_buff *skb,
706 struct ip_vs_protocol *pp,
707 const struct ip_vs_iphdr *iph, 1008 const struct ip_vs_iphdr *iph,
708 unsigned int proto_off, 1009 unsigned int proto_off,
709 int inverse); 1010 int inverse);
@@ -719,14 +1020,14 @@ extern void ip_vs_conn_fill_cport(struct ip_vs_conn *cp, __be16 cport);
719struct ip_vs_conn *ip_vs_conn_new(const struct ip_vs_conn_param *p, 1020struct ip_vs_conn *ip_vs_conn_new(const struct ip_vs_conn_param *p,
720 const union nf_inet_addr *daddr, 1021 const union nf_inet_addr *daddr,
721 __be16 dport, unsigned flags, 1022 __be16 dport, unsigned flags,
722 struct ip_vs_dest *dest); 1023 struct ip_vs_dest *dest, __u32 fwmark);
723extern void ip_vs_conn_expire_now(struct ip_vs_conn *cp); 1024extern void ip_vs_conn_expire_now(struct ip_vs_conn *cp);
724 1025
725extern const char * ip_vs_state_name(__u16 proto, int state); 1026extern const char * ip_vs_state_name(__u16 proto, int state);
726 1027
727extern void ip_vs_tcp_conn_listen(struct ip_vs_conn *cp); 1028extern void ip_vs_tcp_conn_listen(struct net *net, struct ip_vs_conn *cp);
728extern int ip_vs_check_template(struct ip_vs_conn *ct); 1029extern int ip_vs_check_template(struct ip_vs_conn *ct);
729extern void ip_vs_random_dropentry(void); 1030extern void ip_vs_random_dropentry(struct net *net);
730extern int ip_vs_conn_init(void); 1031extern int ip_vs_conn_init(void);
731extern void ip_vs_conn_cleanup(void); 1032extern void ip_vs_conn_cleanup(void);
732 1033
@@ -796,12 +1097,12 @@ ip_vs_control_add(struct ip_vs_conn *cp, struct ip_vs_conn *ctl_cp)
796 * (from ip_vs_app.c) 1097 * (from ip_vs_app.c)
797 */ 1098 */
798#define IP_VS_APP_MAX_PORTS 8 1099#define IP_VS_APP_MAX_PORTS 8
799extern int register_ip_vs_app(struct ip_vs_app *app); 1100extern int register_ip_vs_app(struct net *net, struct ip_vs_app *app);
800extern void unregister_ip_vs_app(struct ip_vs_app *app); 1101extern void unregister_ip_vs_app(struct net *net, struct ip_vs_app *app);
801extern int ip_vs_bind_app(struct ip_vs_conn *cp, struct ip_vs_protocol *pp); 1102extern int ip_vs_bind_app(struct ip_vs_conn *cp, struct ip_vs_protocol *pp);
802extern void ip_vs_unbind_app(struct ip_vs_conn *cp); 1103extern void ip_vs_unbind_app(struct ip_vs_conn *cp);
803extern int 1104extern int register_ip_vs_app_inc(struct net *net, struct ip_vs_app *app,
804register_ip_vs_app_inc(struct ip_vs_app *app, __u16 proto, __u16 port); 1105 __u16 proto, __u16 port);
805extern int ip_vs_app_inc_get(struct ip_vs_app *inc); 1106extern int ip_vs_app_inc_get(struct ip_vs_app *inc);
806extern void ip_vs_app_inc_put(struct ip_vs_app *inc); 1107extern void ip_vs_app_inc_put(struct ip_vs_app *inc);
807 1108
@@ -814,15 +1115,27 @@ void ip_vs_bind_pe(struct ip_vs_service *svc, struct ip_vs_pe *pe);
814void ip_vs_unbind_pe(struct ip_vs_service *svc); 1115void ip_vs_unbind_pe(struct ip_vs_service *svc);
815int register_ip_vs_pe(struct ip_vs_pe *pe); 1116int register_ip_vs_pe(struct ip_vs_pe *pe);
816int unregister_ip_vs_pe(struct ip_vs_pe *pe); 1117int unregister_ip_vs_pe(struct ip_vs_pe *pe);
817extern struct ip_vs_pe *ip_vs_pe_get(const char *name); 1118struct ip_vs_pe *ip_vs_pe_getbyname(const char *name);
818extern void ip_vs_pe_put(struct ip_vs_pe *pe); 1119struct ip_vs_pe *__ip_vs_pe_getbyname(const char *pe_name);
1120
1121static inline void ip_vs_pe_get(const struct ip_vs_pe *pe)
1122{
1123 if (pe && pe->module)
1124 __module_get(pe->module);
1125}
1126
1127static inline void ip_vs_pe_put(const struct ip_vs_pe *pe)
1128{
1129 if (pe && pe->module)
1130 module_put(pe->module);
1131}
819 1132
820/* 1133/*
821 * IPVS protocol functions (from ip_vs_proto.c) 1134 * IPVS protocol functions (from ip_vs_proto.c)
822 */ 1135 */
823extern int ip_vs_protocol_init(void); 1136extern int ip_vs_protocol_init(void);
824extern void ip_vs_protocol_cleanup(void); 1137extern void ip_vs_protocol_cleanup(void);
825extern void ip_vs_protocol_timeout_change(int flags); 1138extern void ip_vs_protocol_timeout_change(struct netns_ipvs *ipvs, int flags);
826extern int *ip_vs_create_timeout_table(int *table, int size); 1139extern int *ip_vs_create_timeout_table(int *table, int size);
827extern int 1140extern int
828ip_vs_set_state_timeout(int *table, int num, const char *const *names, 1141ip_vs_set_state_timeout(int *table, int num, const char *const *names,
@@ -852,26 +1165,23 @@ extern struct ip_vs_scheduler *ip_vs_scheduler_get(const char *sched_name);
852extern void ip_vs_scheduler_put(struct ip_vs_scheduler *scheduler); 1165extern void ip_vs_scheduler_put(struct ip_vs_scheduler *scheduler);
853extern struct ip_vs_conn * 1166extern struct ip_vs_conn *
854ip_vs_schedule(struct ip_vs_service *svc, struct sk_buff *skb, 1167ip_vs_schedule(struct ip_vs_service *svc, struct sk_buff *skb,
855 struct ip_vs_protocol *pp, int *ignored); 1168 struct ip_vs_proto_data *pd, int *ignored);
856extern int ip_vs_leave(struct ip_vs_service *svc, struct sk_buff *skb, 1169extern int ip_vs_leave(struct ip_vs_service *svc, struct sk_buff *skb,
857 struct ip_vs_protocol *pp); 1170 struct ip_vs_proto_data *pd);
1171
1172extern void ip_vs_scheduler_err(struct ip_vs_service *svc, const char *msg);
858 1173
859 1174
860/* 1175/*
861 * IPVS control data and functions (from ip_vs_ctl.c) 1176 * IPVS control data and functions (from ip_vs_ctl.c)
862 */ 1177 */
863extern int sysctl_ip_vs_cache_bypass;
864extern int sysctl_ip_vs_expire_nodest_conn;
865extern int sysctl_ip_vs_expire_quiescent_template;
866extern int sysctl_ip_vs_sync_threshold[2];
867extern int sysctl_ip_vs_nat_icmp_send;
868extern int sysctl_ip_vs_conntrack;
869extern int sysctl_ip_vs_snat_reroute;
870extern struct ip_vs_stats ip_vs_stats; 1178extern struct ip_vs_stats ip_vs_stats;
871extern const struct ctl_path net_vs_ctl_path[]; 1179extern const struct ctl_path net_vs_ctl_path[];
1180extern int sysctl_ip_vs_sync_ver;
872 1181
1182extern void ip_vs_sync_switch_mode(struct net *net, int mode);
873extern struct ip_vs_service * 1183extern struct ip_vs_service *
874ip_vs_service_get(int af, __u32 fwmark, __u16 protocol, 1184ip_vs_service_get(struct net *net, int af, __u32 fwmark, __u16 protocol,
875 const union nf_inet_addr *vaddr, __be16 vport); 1185 const union nf_inet_addr *vaddr, __be16 vport);
876 1186
877static inline void ip_vs_service_put(struct ip_vs_service *svc) 1187static inline void ip_vs_service_put(struct ip_vs_service *svc)
@@ -880,7 +1190,7 @@ static inline void ip_vs_service_put(struct ip_vs_service *svc)
880} 1190}
881 1191
882extern struct ip_vs_dest * 1192extern struct ip_vs_dest *
883ip_vs_lookup_real_service(int af, __u16 protocol, 1193ip_vs_lookup_real_service(struct net *net, int af, __u16 protocol,
884 const union nf_inet_addr *daddr, __be16 dport); 1194 const union nf_inet_addr *daddr, __be16 dport);
885 1195
886extern int ip_vs_use_count_inc(void); 1196extern int ip_vs_use_count_inc(void);
@@ -888,8 +1198,9 @@ extern void ip_vs_use_count_dec(void);
888extern int ip_vs_control_init(void); 1198extern int ip_vs_control_init(void);
889extern void ip_vs_control_cleanup(void); 1199extern void ip_vs_control_cleanup(void);
890extern struct ip_vs_dest * 1200extern struct ip_vs_dest *
891ip_vs_find_dest(int af, const union nf_inet_addr *daddr, __be16 dport, 1201ip_vs_find_dest(struct net *net, int af, const union nf_inet_addr *daddr,
892 const union nf_inet_addr *vaddr, __be16 vport, __u16 protocol); 1202 __be16 dport, const union nf_inet_addr *vaddr, __be16 vport,
1203 __u16 protocol, __u32 fwmark);
893extern struct ip_vs_dest *ip_vs_try_bind_dest(struct ip_vs_conn *cp); 1204extern struct ip_vs_dest *ip_vs_try_bind_dest(struct ip_vs_conn *cp);
894 1205
895 1206
@@ -897,14 +1208,12 @@ extern struct ip_vs_dest *ip_vs_try_bind_dest(struct ip_vs_conn *cp);
897 * IPVS sync daemon data and function prototypes 1208 * IPVS sync daemon data and function prototypes
898 * (from ip_vs_sync.c) 1209 * (from ip_vs_sync.c)
899 */ 1210 */
900extern volatile int ip_vs_sync_state; 1211extern int start_sync_thread(struct net *net, int state, char *mcast_ifn,
901extern volatile int ip_vs_master_syncid; 1212 __u8 syncid);
902extern volatile int ip_vs_backup_syncid; 1213extern int stop_sync_thread(struct net *net, int state);
903extern char ip_vs_master_mcast_ifn[IP_VS_IFNAME_MAXLEN]; 1214extern void ip_vs_sync_conn(struct net *net, struct ip_vs_conn *cp);
904extern char ip_vs_backup_mcast_ifn[IP_VS_IFNAME_MAXLEN]; 1215extern int ip_vs_sync_init(void);
905extern int start_sync_thread(int state, char *mcast_ifn, __u8 syncid); 1216extern void ip_vs_sync_cleanup(void);
906extern int stop_sync_thread(int state);
907extern void ip_vs_sync_conn(struct ip_vs_conn *cp);
908 1217
909 1218
910/* 1219/*
@@ -912,9 +1221,11 @@ extern void ip_vs_sync_conn(struct ip_vs_conn *cp);
912 */ 1221 */
913extern int ip_vs_estimator_init(void); 1222extern int ip_vs_estimator_init(void);
914extern void ip_vs_estimator_cleanup(void); 1223extern void ip_vs_estimator_cleanup(void);
915extern void ip_vs_new_estimator(struct ip_vs_stats *stats); 1224extern void ip_vs_start_estimator(struct net *net, struct ip_vs_stats *stats);
916extern void ip_vs_kill_estimator(struct ip_vs_stats *stats); 1225extern void ip_vs_stop_estimator(struct net *net, struct ip_vs_stats *stats);
917extern void ip_vs_zero_estimator(struct ip_vs_stats *stats); 1226extern void ip_vs_zero_estimator(struct ip_vs_stats *stats);
1227extern void ip_vs_read_estimator(struct ip_vs_stats_user *dst,
1228 struct ip_vs_stats *stats);
918 1229
919/* 1230/*
920 * Various IPVS packet transmitters (from ip_vs_xmit.c) 1231 * Various IPVS packet transmitters (from ip_vs_xmit.c)
@@ -947,21 +1258,25 @@ extern int ip_vs_icmp_xmit_v6
947 int offset); 1258 int offset);
948#endif 1259#endif
949 1260
1261#ifdef CONFIG_SYSCTL
950/* 1262/*
951 * This is a simple mechanism to ignore packets when 1263 * This is a simple mechanism to ignore packets when
952 * we are loaded. Just set ip_vs_drop_rate to 'n' and 1264 * we are loaded. Just set ip_vs_drop_rate to 'n' and
953 * we start to drop 1/rate of the packets 1265 * we start to drop 1/rate of the packets
954 */ 1266 */
955extern int ip_vs_drop_rate;
956extern int ip_vs_drop_counter;
957 1267
958static __inline__ int ip_vs_todrop(void) 1268static inline int ip_vs_todrop(struct netns_ipvs *ipvs)
959{ 1269{
960 if (!ip_vs_drop_rate) return 0; 1270 if (!ipvs->drop_rate)
961 if (--ip_vs_drop_counter > 0) return 0; 1271 return 0;
962 ip_vs_drop_counter = ip_vs_drop_rate; 1272 if (--ipvs->drop_counter > 0)
1273 return 0;
1274 ipvs->drop_counter = ipvs->drop_rate;
963 return 1; 1275 return 1;
964} 1276}
1277#else
1278static inline int ip_vs_todrop(struct netns_ipvs *ipvs) { return 0; }
1279#endif
965 1280
966/* 1281/*
967 * ip_vs_fwd_tag returns the forwarding tag of the connection 1282 * ip_vs_fwd_tag returns the forwarding tag of the connection
@@ -1031,7 +1346,7 @@ static inline void ip_vs_notrack(struct sk_buff *skb)
1031{ 1346{
1032#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) 1347#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
1033 enum ip_conntrack_info ctinfo; 1348 enum ip_conntrack_info ctinfo;
1034 struct nf_conn *ct = ct = nf_ct_get(skb, &ctinfo); 1349 struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
1035 1350
1036 if (!ct || !nf_ct_is_untracked(ct)) { 1351 if (!ct || !nf_ct_is_untracked(ct)) {
1037 nf_reset(skb); 1352 nf_reset(skb);
@@ -1047,9 +1362,13 @@ static inline void ip_vs_notrack(struct sk_buff *skb)
1047 * Netfilter connection tracking 1362 * Netfilter connection tracking
1048 * (from ip_vs_nfct.c) 1363 * (from ip_vs_nfct.c)
1049 */ 1364 */
1050static inline int ip_vs_conntrack_enabled(void) 1365static inline int ip_vs_conntrack_enabled(struct netns_ipvs *ipvs)
1051{ 1366{
1052 return sysctl_ip_vs_conntrack; 1367#ifdef CONFIG_SYSCTL
1368 return ipvs->sysctl_conntrack;
1369#else
1370 return 0;
1371#endif
1053} 1372}
1054 1373
1055extern void ip_vs_update_conntrack(struct sk_buff *skb, struct ip_vs_conn *cp, 1374extern void ip_vs_update_conntrack(struct sk_buff *skb, struct ip_vs_conn *cp,
@@ -1062,7 +1381,7 @@ extern void ip_vs_conn_drop_conntrack(struct ip_vs_conn *cp);
1062 1381
1063#else 1382#else
1064 1383
1065static inline int ip_vs_conntrack_enabled(void) 1384static inline int ip_vs_conntrack_enabled(struct netns_ipvs *ipvs)
1066{ 1385{
1067 return 0; 1386 return 0;
1068} 1387}
@@ -1084,6 +1403,20 @@ static inline void ip_vs_conn_drop_conntrack(struct ip_vs_conn *cp)
1084/* CONFIG_IP_VS_NFCT */ 1403/* CONFIG_IP_VS_NFCT */
1085#endif 1404#endif
1086 1405
1406static inline unsigned int
1407ip_vs_dest_conn_overhead(struct ip_vs_dest *dest)
1408{
1409 /*
1410 * We think the overhead of processing active connections is 256
1411 * times higher than that of inactive connections in average. (This
1412 * 256 times might not be accurate, we will change it later) We
1413 * use the following formula to estimate the overhead now:
1414 * dest->activeconns*256 + dest->inactconns
1415 */
1416 return (atomic_read(&dest->activeconns) << 8) +
1417 atomic_read(&dest->inactconns);
1418}
1419
1087#endif /* __KERNEL__ */ 1420#endif /* __KERNEL__ */
1088 1421
1089#endif /* _NET_IP_VS_H */ 1422#endif /* _NET_IP_VS_H */
diff --git a/include/net/ipv6.h b/include/net/ipv6.h
index 96e50e0ce3ca..34200f9e6805 100644
--- a/include/net/ipv6.h
+++ b/include/net/ipv6.h
@@ -492,7 +492,7 @@ extern int ip6_rcv_finish(struct sk_buff *skb);
492 */ 492 */
493extern int ip6_xmit(struct sock *sk, 493extern int ip6_xmit(struct sock *sk,
494 struct sk_buff *skb, 494 struct sk_buff *skb,
495 struct flowi *fl, 495 struct flowi6 *fl6,
496 struct ipv6_txoptions *opt); 496 struct ipv6_txoptions *opt);
497 497
498extern int ip6_nd_hdr(struct sock *sk, 498extern int ip6_nd_hdr(struct sock *sk,
@@ -512,7 +512,7 @@ extern int ip6_append_data(struct sock *sk,
512 int hlimit, 512 int hlimit,
513 int tclass, 513 int tclass,
514 struct ipv6_txoptions *opt, 514 struct ipv6_txoptions *opt,
515 struct flowi *fl, 515 struct flowi6 *fl6,
516 struct rt6_info *rt, 516 struct rt6_info *rt,
517 unsigned int flags, 517 unsigned int flags,
518 int dontfrag); 518 int dontfrag);
@@ -523,13 +523,17 @@ extern void ip6_flush_pending_frames(struct sock *sk);
523 523
524extern int ip6_dst_lookup(struct sock *sk, 524extern int ip6_dst_lookup(struct sock *sk,
525 struct dst_entry **dst, 525 struct dst_entry **dst,
526 struct flowi *fl); 526 struct flowi6 *fl6);
527extern int ip6_dst_blackhole(struct sock *sk, 527extern struct dst_entry * ip6_dst_lookup_flow(struct sock *sk,
528 struct dst_entry **dst, 528 struct flowi6 *fl6,
529 struct flowi *fl); 529 const struct in6_addr *final_dst,
530extern int ip6_sk_dst_lookup(struct sock *sk, 530 bool can_sleep);
531 struct dst_entry **dst, 531extern struct dst_entry * ip6_sk_dst_lookup_flow(struct sock *sk,
532 struct flowi *fl); 532 struct flowi6 *fl6,
533 const struct in6_addr *final_dst,
534 bool can_sleep);
535extern struct dst_entry * ip6_blackhole_route(struct net *net,
536 struct dst_entry *orig_dst);
533 537
534/* 538/*
535 * skb processing functions 539 * skb processing functions
@@ -562,7 +566,7 @@ extern int ipv6_ext_hdr(u8 nexthdr);
562 566
563extern int ipv6_find_tlv(struct sk_buff *skb, int offset, int type); 567extern int ipv6_find_tlv(struct sk_buff *skb, int offset, int type);
564 568
565extern struct in6_addr *fl6_update_dst(struct flowi *fl, 569extern struct in6_addr *fl6_update_dst(struct flowi6 *fl6,
566 const struct ipv6_txoptions *opt, 570 const struct ipv6_txoptions *opt,
567 struct in6_addr *orig); 571 struct in6_addr *orig);
568 572
@@ -596,8 +600,8 @@ extern int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len);
596extern int ipv6_recv_rxpmtu(struct sock *sk, struct msghdr *msg, int len); 600extern int ipv6_recv_rxpmtu(struct sock *sk, struct msghdr *msg, int len);
597extern void ipv6_icmp_error(struct sock *sk, struct sk_buff *skb, int err, __be16 port, 601extern void ipv6_icmp_error(struct sock *sk, struct sk_buff *skb, int err, __be16 port,
598 u32 info, u8 *payload); 602 u32 info, u8 *payload);
599extern void ipv6_local_error(struct sock *sk, int err, struct flowi *fl, u32 info); 603extern void ipv6_local_error(struct sock *sk, int err, struct flowi6 *fl6, u32 info);
600extern void ipv6_local_rxpmtu(struct sock *sk, struct flowi *fl, u32 mtu); 604extern void ipv6_local_rxpmtu(struct sock *sk, struct flowi6 *fl6, u32 mtu);
601 605
602extern int inet6_release(struct socket *sock); 606extern int inet6_release(struct socket *sock);
603extern int inet6_bind(struct socket *sock, struct sockaddr *uaddr, 607extern int inet6_bind(struct socket *sock, struct sockaddr *uaddr,
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index 62c0ce2d1dc8..8650e7bf2ed0 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -341,6 +341,9 @@ struct ieee80211_bss_conf {
341 * the off-channel channel when a remain-on-channel offload is done 341 * the off-channel channel when a remain-on-channel offload is done
342 * in hardware -- normal packets still flow and are expected to be 342 * in hardware -- normal packets still flow and are expected to be
343 * handled properly by the device. 343 * handled properly by the device.
344 * @IEEE80211_TX_INTFL_TKIP_MIC_FAILURE: Marks this packet to be used for TKIP
345 * testing. It will be sent out with incorrect Michael MIC key to allow
346 * TKIP countermeasures to be tested.
344 * 347 *
345 * Note: If you have to add new flags to the enumeration, then don't 348 * Note: If you have to add new flags to the enumeration, then don't
346 * forget to update %IEEE80211_TX_TEMPORARY_FLAGS when necessary. 349 * forget to update %IEEE80211_TX_TEMPORARY_FLAGS when necessary.
@@ -370,6 +373,7 @@ enum mac80211_tx_control_flags {
370 IEEE80211_TX_CTL_LDPC = BIT(22), 373 IEEE80211_TX_CTL_LDPC = BIT(22),
371 IEEE80211_TX_CTL_STBC = BIT(23) | BIT(24), 374 IEEE80211_TX_CTL_STBC = BIT(23) | BIT(24),
372 IEEE80211_TX_CTL_TX_OFFCHAN = BIT(25), 375 IEEE80211_TX_CTL_TX_OFFCHAN = BIT(25),
376 IEEE80211_TX_INTFL_TKIP_MIC_FAILURE = BIT(26),
373}; 377};
374 378
375#define IEEE80211_TX_CTL_STBC_SHIFT 23 379#define IEEE80211_TX_CTL_STBC_SHIFT 23
@@ -595,9 +599,10 @@ ieee80211_tx_info_clear_status(struct ieee80211_tx_info *info)
595 * the frame. 599 * the frame.
596 * @RX_FLAG_FAILED_PLCP_CRC: Set this flag if the PCLP check failed on 600 * @RX_FLAG_FAILED_PLCP_CRC: Set this flag if the PCLP check failed on
597 * the frame. 601 * the frame.
598 * @RX_FLAG_TSFT: The timestamp passed in the RX status (@mactime field) 602 * @RX_FLAG_MACTIME_MPDU: The timestamp passed in the RX status (@mactime
599 * is valid. This is useful in monitor mode and necessary for beacon frames 603 * field) is valid and contains the time the first symbol of the MPDU
600 * to enable IBSS merging. 604 * was received. This is useful in monitor mode and for proper IBSS
605 * merging.
601 * @RX_FLAG_SHORTPRE: Short preamble was used for this frame 606 * @RX_FLAG_SHORTPRE: Short preamble was used for this frame
602 * @RX_FLAG_HT: HT MCS was used and rate_idx is MCS index 607 * @RX_FLAG_HT: HT MCS was used and rate_idx is MCS index
603 * @RX_FLAG_40MHZ: HT40 (40 MHz) was used 608 * @RX_FLAG_40MHZ: HT40 (40 MHz) was used
@@ -610,7 +615,7 @@ enum mac80211_rx_flags {
610 RX_FLAG_IV_STRIPPED = 1<<4, 615 RX_FLAG_IV_STRIPPED = 1<<4,
611 RX_FLAG_FAILED_FCS_CRC = 1<<5, 616 RX_FLAG_FAILED_FCS_CRC = 1<<5,
612 RX_FLAG_FAILED_PLCP_CRC = 1<<6, 617 RX_FLAG_FAILED_PLCP_CRC = 1<<6,
613 RX_FLAG_TSFT = 1<<7, 618 RX_FLAG_MACTIME_MPDU = 1<<7,
614 RX_FLAG_SHORTPRE = 1<<8, 619 RX_FLAG_SHORTPRE = 1<<8,
615 RX_FLAG_HT = 1<<9, 620 RX_FLAG_HT = 1<<9,
616 RX_FLAG_40MHZ = 1<<10, 621 RX_FLAG_40MHZ = 1<<10,
@@ -1069,6 +1074,13 @@ enum ieee80211_tkip_key_type {
1069 * to decrypt group addressed frames, then IBSS RSN support is still 1074 * to decrypt group addressed frames, then IBSS RSN support is still
1070 * possible but software crypto will be used. Advertise the wiphy flag 1075 * possible but software crypto will be used. Advertise the wiphy flag
1071 * only in that case. 1076 * only in that case.
1077 *
1078 * @IEEE80211_HW_AP_LINK_PS: When operating in AP mode the device
1079 * autonomously manages the PS status of connected stations. When
1080 * this flag is set mac80211 will not trigger PS mode for connected
1081 * stations based on the PM bit of incoming frames.
1082 * Use ieee80211_start_ps()/ieee8021_end_ps() to manually configure
1083 * the PS mode of connected stations.
1072 */ 1084 */
1073enum ieee80211_hw_flags { 1085enum ieee80211_hw_flags {
1074 IEEE80211_HW_HAS_RATE_CONTROL = 1<<0, 1086 IEEE80211_HW_HAS_RATE_CONTROL = 1<<0,
@@ -1093,6 +1105,7 @@ enum ieee80211_hw_flags {
1093 IEEE80211_HW_CONNECTION_MONITOR = 1<<19, 1105 IEEE80211_HW_CONNECTION_MONITOR = 1<<19,
1094 IEEE80211_HW_SUPPORTS_CQM_RSSI = 1<<20, 1106 IEEE80211_HW_SUPPORTS_CQM_RSSI = 1<<20,
1095 IEEE80211_HW_SUPPORTS_PER_STA_GTK = 1<<21, 1107 IEEE80211_HW_SUPPORTS_PER_STA_GTK = 1<<21,
1108 IEEE80211_HW_AP_LINK_PS = 1<<22,
1096}; 1109};
1097 1110
1098/** 1111/**
@@ -1147,6 +1160,17 @@ enum ieee80211_hw_flags {
1147 * @napi_weight: weight used for NAPI polling. You must specify an 1160 * @napi_weight: weight used for NAPI polling. You must specify an
1148 * appropriate value here if a napi_poll operation is provided 1161 * appropriate value here if a napi_poll operation is provided
1149 * by your driver. 1162 * by your driver.
1163
1164 * @max_rx_aggregation_subframes: maximum buffer size (number of
1165 * sub-frames) to be used for A-MPDU block ack receiver
1166 * aggregation.
1167 * This is only relevant if the device has restrictions on the
1168 * number of subframes, if it relies on mac80211 to do reordering
1169 * it shouldn't be set.
1170 *
1171 * @max_tx_aggregation_subframes: maximum number of subframes in an
1172 * aggregate an HT driver will transmit, used by the peer as a
1173 * hint to size its reorder buffer.
1150 */ 1174 */
1151struct ieee80211_hw { 1175struct ieee80211_hw {
1152 struct ieee80211_conf conf; 1176 struct ieee80211_conf conf;
@@ -1165,6 +1189,8 @@ struct ieee80211_hw {
1165 u8 max_rates; 1189 u8 max_rates;
1166 u8 max_report_rates; 1190 u8 max_report_rates;
1167 u8 max_rate_tries; 1191 u8 max_rate_tries;
1192 u8 max_rx_aggregation_subframes;
1193 u8 max_tx_aggregation_subframes;
1168}; 1194};
1169 1195
1170/** 1196/**
@@ -1688,7 +1714,9 @@ enum ieee80211_ampdu_mlme_action {
1688 * station, AP, IBSS/WDS/mesh peer etc. This callback can sleep. 1714 * station, AP, IBSS/WDS/mesh peer etc. This callback can sleep.
1689 * 1715 *
1690 * @sta_notify: Notifies low level driver about power state transition of an 1716 * @sta_notify: Notifies low level driver about power state transition of an
1691 * associated station, AP, IBSS/WDS/mesh peer etc. Must be atomic. 1717 * associated station, AP, IBSS/WDS/mesh peer etc. For a VIF operating
1718 * in AP mode, this callback will not be called when the flag
1719 * %IEEE80211_HW_AP_LINK_PS is set. Must be atomic.
1692 * 1720 *
1693 * @conf_tx: Configure TX queue parameters (EDCF (aifs, cw_min, cw_max), 1721 * @conf_tx: Configure TX queue parameters (EDCF (aifs, cw_min, cw_max),
1694 * bursting) for a hardware TX queue. 1722 * bursting) for a hardware TX queue.
@@ -1723,6 +1751,10 @@ enum ieee80211_ampdu_mlme_action {
1723 * ieee80211_ampdu_mlme_action. Starting sequence number (@ssn) 1751 * ieee80211_ampdu_mlme_action. Starting sequence number (@ssn)
1724 * is the first frame we expect to perform the action on. Notice 1752 * is the first frame we expect to perform the action on. Notice
1725 * that TX/RX_STOP can pass NULL for this parameter. 1753 * that TX/RX_STOP can pass NULL for this parameter.
1754 * The @buf_size parameter is only valid when the action is set to
1755 * %IEEE80211_AMPDU_TX_OPERATIONAL and indicates the peer's reorder
1756 * buffer size (number of subframes) for this session -- aggregates
1757 * containing more subframes than this may not be transmitted to the peer.
1726 * Returns a negative error code on failure. 1758 * Returns a negative error code on failure.
1727 * The callback can sleep. 1759 * The callback can sleep.
1728 * 1760 *
@@ -1767,9 +1799,18 @@ enum ieee80211_ampdu_mlme_action {
1767 * ieee80211_remain_on_channel_expired(). This callback may sleep. 1799 * ieee80211_remain_on_channel_expired(). This callback may sleep.
1768 * @cancel_remain_on_channel: Requests that an ongoing off-channel period is 1800 * @cancel_remain_on_channel: Requests that an ongoing off-channel period is
1769 * aborted before it expires. This callback may sleep. 1801 * aborted before it expires. This callback may sleep.
1802 * @offchannel_tx: Transmit frame on another channel, wait for a response
1803 * and return. Reliable TX status must be reported for the frame. If the
1804 * return value is 1, then the @remain_on_channel will be used with a
1805 * regular transmission (if supported.)
1806 * @offchannel_tx_cancel_wait: cancel wait associated with offchannel TX
1807 *
1808 * @set_ringparam: Set tx and rx ring sizes.
1809 *
1810 * @get_ringparam: Get tx and rx ring current and maximum sizes.
1770 */ 1811 */
1771struct ieee80211_ops { 1812struct ieee80211_ops {
1772 int (*tx)(struct ieee80211_hw *hw, struct sk_buff *skb); 1813 void (*tx)(struct ieee80211_hw *hw, struct sk_buff *skb);
1773 int (*start)(struct ieee80211_hw *hw); 1814 int (*start)(struct ieee80211_hw *hw);
1774 void (*stop)(struct ieee80211_hw *hw); 1815 void (*stop)(struct ieee80211_hw *hw);
1775 int (*add_interface)(struct ieee80211_hw *hw, 1816 int (*add_interface)(struct ieee80211_hw *hw,
@@ -1825,7 +1866,8 @@ struct ieee80211_ops {
1825 int (*ampdu_action)(struct ieee80211_hw *hw, 1866 int (*ampdu_action)(struct ieee80211_hw *hw,
1826 struct ieee80211_vif *vif, 1867 struct ieee80211_vif *vif,
1827 enum ieee80211_ampdu_mlme_action action, 1868 enum ieee80211_ampdu_mlme_action action,
1828 struct ieee80211_sta *sta, u16 tid, u16 *ssn); 1869 struct ieee80211_sta *sta, u16 tid, u16 *ssn,
1870 u8 buf_size);
1829 int (*get_survey)(struct ieee80211_hw *hw, int idx, 1871 int (*get_survey)(struct ieee80211_hw *hw, int idx,
1830 struct survey_info *survey); 1872 struct survey_info *survey);
1831 void (*rfkill_poll)(struct ieee80211_hw *hw); 1873 void (*rfkill_poll)(struct ieee80211_hw *hw);
@@ -1845,6 +1887,14 @@ struct ieee80211_ops {
1845 enum nl80211_channel_type channel_type, 1887 enum nl80211_channel_type channel_type,
1846 int duration); 1888 int duration);
1847 int (*cancel_remain_on_channel)(struct ieee80211_hw *hw); 1889 int (*cancel_remain_on_channel)(struct ieee80211_hw *hw);
1890 int (*offchannel_tx)(struct ieee80211_hw *hw, struct sk_buff *skb,
1891 struct ieee80211_channel *chan,
1892 enum nl80211_channel_type channel_type,
1893 unsigned int wait);
1894 int (*offchannel_tx_cancel_wait)(struct ieee80211_hw *hw);
1895 int (*set_ringparam)(struct ieee80211_hw *hw, u32 tx, u32 rx);
1896 void (*get_ringparam)(struct ieee80211_hw *hw,
1897 u32 *tx, u32 *tx_max, u32 *rx, u32 *rx_max);
1848}; 1898};
1849 1899
1850/** 1900/**
@@ -2113,6 +2163,48 @@ static inline void ieee80211_rx_ni(struct ieee80211_hw *hw,
2113 local_bh_enable(); 2163 local_bh_enable();
2114} 2164}
2115 2165
2166/**
2167 * ieee80211_sta_ps_transition - PS transition for connected sta
2168 *
2169 * When operating in AP mode with the %IEEE80211_HW_AP_LINK_PS
2170 * flag set, use this function to inform mac80211 about a connected station
2171 * entering/leaving PS mode.
2172 *
2173 * This function may not be called in IRQ context or with softirqs enabled.
2174 *
2175 * Calls to this function for a single hardware must be synchronized against
2176 * each other.
2177 *
2178 * The function returns -EINVAL when the requested PS mode is already set.
2179 *
2180 * @sta: currently connected sta
2181 * @start: start or stop PS
2182 */
2183int ieee80211_sta_ps_transition(struct ieee80211_sta *sta, bool start);
2184
2185/**
2186 * ieee80211_sta_ps_transition_ni - PS transition for connected sta
2187 * (in process context)
2188 *
2189 * Like ieee80211_sta_ps_transition() but can be called in process context
2190 * (internally disables bottom halves). Concurrent call restriction still
2191 * applies.
2192 *
2193 * @sta: currently connected sta
2194 * @start: start or stop PS
2195 */
2196static inline int ieee80211_sta_ps_transition_ni(struct ieee80211_sta *sta,
2197 bool start)
2198{
2199 int ret;
2200
2201 local_bh_disable();
2202 ret = ieee80211_sta_ps_transition(sta, start);
2203 local_bh_enable();
2204
2205 return ret;
2206}
2207
2116/* 2208/*
2117 * The TX headroom reserved by mac80211 for its own tx_status functions. 2209 * The TX headroom reserved by mac80211 for its own tx_status functions.
2118 * This is enough for the radiotap header. 2210 * This is enough for the radiotap header.
diff --git a/include/net/net_namespace.h b/include/net/net_namespace.h
index 1bf812b21fb7..3ae491932bc8 100644
--- a/include/net/net_namespace.h
+++ b/include/net/net_namespace.h
@@ -27,6 +27,7 @@ struct sock;
27struct ctl_table_header; 27struct ctl_table_header;
28struct net_generic; 28struct net_generic;
29struct sock; 29struct sock;
30struct netns_ipvs;
30 31
31 32
32#define NETDEV_HASHBITS 8 33#define NETDEV_HASHBITS 8
@@ -94,6 +95,7 @@ struct net {
94#ifdef CONFIG_XFRM 95#ifdef CONFIG_XFRM
95 struct netns_xfrm xfrm; 96 struct netns_xfrm xfrm;
96#endif 97#endif
98 struct netns_ipvs *ipvs;
97}; 99};
98 100
99 101
diff --git a/include/net/netevent.h b/include/net/netevent.h
index e82b7bab3ff3..22b239c17eaa 100644
--- a/include/net/netevent.h
+++ b/include/net/netevent.h
@@ -21,7 +21,6 @@ struct netevent_redirect {
21 21
22enum netevent_notif_type { 22enum netevent_notif_type {
23 NETEVENT_NEIGH_UPDATE = 1, /* arg is struct neighbour ptr */ 23 NETEVENT_NEIGH_UPDATE = 1, /* arg is struct neighbour ptr */
24 NETEVENT_PMTU_UPDATE, /* arg is struct dst_entry ptr */
25 NETEVENT_REDIRECT, /* arg is struct netevent_redirect ptr */ 24 NETEVENT_REDIRECT, /* arg is struct netevent_redirect ptr */
26}; 25};
27 26
diff --git a/include/net/netfilter/nf_conntrack.h b/include/net/netfilter/nf_conntrack.h
index d85cff10e169..d0d13378991e 100644
--- a/include/net/netfilter/nf_conntrack.h
+++ b/include/net/netfilter/nf_conntrack.h
@@ -50,11 +50,24 @@ union nf_conntrack_expect_proto {
50/* per conntrack: application helper private data */ 50/* per conntrack: application helper private data */
51union nf_conntrack_help { 51union nf_conntrack_help {
52 /* insert conntrack helper private data (master) here */ 52 /* insert conntrack helper private data (master) here */
53#if defined(CONFIG_NF_CONNTRACK_FTP) || defined(CONFIG_NF_CONNTRACK_FTP_MODULE)
53 struct nf_ct_ftp_master ct_ftp_info; 54 struct nf_ct_ftp_master ct_ftp_info;
55#endif
56#if defined(CONFIG_NF_CONNTRACK_PPTP) || \
57 defined(CONFIG_NF_CONNTRACK_PPTP_MODULE)
54 struct nf_ct_pptp_master ct_pptp_info; 58 struct nf_ct_pptp_master ct_pptp_info;
59#endif
60#if defined(CONFIG_NF_CONNTRACK_H323) || \
61 defined(CONFIG_NF_CONNTRACK_H323_MODULE)
55 struct nf_ct_h323_master ct_h323_info; 62 struct nf_ct_h323_master ct_h323_info;
63#endif
64#if defined(CONFIG_NF_CONNTRACK_SANE) || \
65 defined(CONFIG_NF_CONNTRACK_SANE_MODULE)
56 struct nf_ct_sane_master ct_sane_info; 66 struct nf_ct_sane_master ct_sane_info;
67#endif
68#if defined(CONFIG_NF_CONNTRACK_SIP) || defined(CONFIG_NF_CONNTRACK_SIP_MODULE)
57 struct nf_ct_sip_master ct_sip_info; 69 struct nf_ct_sip_master ct_sip_info;
70#endif
58}; 71};
59 72
60#include <linux/types.h> 73#include <linux/types.h>
@@ -116,14 +129,14 @@ struct nf_conn {
116 u_int32_t secmark; 129 u_int32_t secmark;
117#endif 130#endif
118 131
119 /* Storage reserved for other modules: */
120 union nf_conntrack_proto proto;
121
122 /* Extensions */ 132 /* Extensions */
123 struct nf_ct_ext *ext; 133 struct nf_ct_ext *ext;
124#ifdef CONFIG_NET_NS 134#ifdef CONFIG_NET_NS
125 struct net *ct_net; 135 struct net *ct_net;
126#endif 136#endif
137
138 /* Storage reserved for other modules, must be the last member */
139 union nf_conntrack_proto proto;
127}; 140};
128 141
129static inline struct nf_conn * 142static inline struct nf_conn *
@@ -189,9 +202,9 @@ extern void nf_ct_l3proto_module_put(unsigned short l3proto);
189 * Allocate a hashtable of hlist_head (if nulls == 0), 202 * Allocate a hashtable of hlist_head (if nulls == 0),
190 * or hlist_nulls_head (if nulls == 1) 203 * or hlist_nulls_head (if nulls == 1)
191 */ 204 */
192extern void *nf_ct_alloc_hashtable(unsigned int *sizep, int *vmalloced, int nulls); 205extern void *nf_ct_alloc_hashtable(unsigned int *sizep, int nulls);
193 206
194extern void nf_ct_free_hashtable(void *hash, int vmalloced, unsigned int size); 207extern void nf_ct_free_hashtable(void *hash, unsigned int size);
195 208
196extern struct nf_conntrack_tuple_hash * 209extern struct nf_conntrack_tuple_hash *
197__nf_conntrack_find(struct net *net, u16 zone, 210__nf_conntrack_find(struct net *net, u16 zone,
diff --git a/include/net/netfilter/nf_conntrack_ecache.h b/include/net/netfilter/nf_conntrack_ecache.h
index 349cefedc9f3..4283508b3e18 100644
--- a/include/net/netfilter/nf_conntrack_ecache.h
+++ b/include/net/netfilter/nf_conntrack_ecache.h
@@ -23,12 +23,17 @@ struct nf_conntrack_ecache {
23static inline struct nf_conntrack_ecache * 23static inline struct nf_conntrack_ecache *
24nf_ct_ecache_find(const struct nf_conn *ct) 24nf_ct_ecache_find(const struct nf_conn *ct)
25{ 25{
26#ifdef CONFIG_NF_CONNTRACK_EVENTS
26 return nf_ct_ext_find(ct, NF_CT_EXT_ECACHE); 27 return nf_ct_ext_find(ct, NF_CT_EXT_ECACHE);
28#else
29 return NULL;
30#endif
27} 31}
28 32
29static inline struct nf_conntrack_ecache * 33static inline struct nf_conntrack_ecache *
30nf_ct_ecache_ext_add(struct nf_conn *ct, u16 ctmask, u16 expmask, gfp_t gfp) 34nf_ct_ecache_ext_add(struct nf_conn *ct, u16 ctmask, u16 expmask, gfp_t gfp)
31{ 35{
36#ifdef CONFIG_NF_CONNTRACK_EVENTS
32 struct net *net = nf_ct_net(ct); 37 struct net *net = nf_ct_net(ct);
33 struct nf_conntrack_ecache *e; 38 struct nf_conntrack_ecache *e;
34 39
@@ -45,6 +50,9 @@ nf_ct_ecache_ext_add(struct nf_conn *ct, u16 ctmask, u16 expmask, gfp_t gfp)
45 e->expmask = expmask; 50 e->expmask = expmask;
46 } 51 }
47 return e; 52 return e;
53#else
54 return NULL;
55#endif
48}; 56};
49 57
50#ifdef CONFIG_NF_CONNTRACK_EVENTS 58#ifdef CONFIG_NF_CONNTRACK_EVENTS
@@ -59,7 +67,7 @@ struct nf_ct_event_notifier {
59 int (*fcn)(unsigned int events, struct nf_ct_event *item); 67 int (*fcn)(unsigned int events, struct nf_ct_event *item);
60}; 68};
61 69
62extern struct nf_ct_event_notifier *nf_conntrack_event_cb; 70extern struct nf_ct_event_notifier __rcu *nf_conntrack_event_cb;
63extern int nf_conntrack_register_notifier(struct nf_ct_event_notifier *nb); 71extern int nf_conntrack_register_notifier(struct nf_ct_event_notifier *nb);
64extern void nf_conntrack_unregister_notifier(struct nf_ct_event_notifier *nb); 72extern void nf_conntrack_unregister_notifier(struct nf_ct_event_notifier *nb);
65 73
@@ -156,7 +164,7 @@ struct nf_exp_event_notifier {
156 int (*fcn)(unsigned int events, struct nf_exp_event *item); 164 int (*fcn)(unsigned int events, struct nf_exp_event *item);
157}; 165};
158 166
159extern struct nf_exp_event_notifier *nf_expect_event_cb; 167extern struct nf_exp_event_notifier __rcu *nf_expect_event_cb;
160extern int nf_ct_expect_register_notifier(struct nf_exp_event_notifier *nb); 168extern int nf_ct_expect_register_notifier(struct nf_exp_event_notifier *nb);
161extern void nf_ct_expect_unregister_notifier(struct nf_exp_event_notifier *nb); 169extern void nf_ct_expect_unregister_notifier(struct nf_exp_event_notifier *nb);
162 170
diff --git a/include/net/netfilter/nf_conntrack_extend.h b/include/net/netfilter/nf_conntrack_extend.h
index 0772d296dfdb..2dcf31703acb 100644
--- a/include/net/netfilter/nf_conntrack_extend.h
+++ b/include/net/netfilter/nf_conntrack_extend.h
@@ -7,10 +7,19 @@
7 7
8enum nf_ct_ext_id { 8enum nf_ct_ext_id {
9 NF_CT_EXT_HELPER, 9 NF_CT_EXT_HELPER,
10#if defined(CONFIG_NF_NAT) || defined(CONFIG_NF_NAT_MODULE)
10 NF_CT_EXT_NAT, 11 NF_CT_EXT_NAT,
12#endif
11 NF_CT_EXT_ACCT, 13 NF_CT_EXT_ACCT,
14#ifdef CONFIG_NF_CONNTRACK_EVENTS
12 NF_CT_EXT_ECACHE, 15 NF_CT_EXT_ECACHE,
16#endif
17#ifdef CONFIG_NF_CONNTRACK_ZONES
13 NF_CT_EXT_ZONE, 18 NF_CT_EXT_ZONE,
19#endif
20#ifdef CONFIG_NF_CONNTRACK_TIMESTAMP
21 NF_CT_EXT_TSTAMP,
22#endif
14 NF_CT_EXT_NUM, 23 NF_CT_EXT_NUM,
15}; 24};
16 25
@@ -19,6 +28,7 @@ enum nf_ct_ext_id {
19#define NF_CT_EXT_ACCT_TYPE struct nf_conn_counter 28#define NF_CT_EXT_ACCT_TYPE struct nf_conn_counter
20#define NF_CT_EXT_ECACHE_TYPE struct nf_conntrack_ecache 29#define NF_CT_EXT_ECACHE_TYPE struct nf_conntrack_ecache
21#define NF_CT_EXT_ZONE_TYPE struct nf_conntrack_zone 30#define NF_CT_EXT_ZONE_TYPE struct nf_conntrack_zone
31#define NF_CT_EXT_TSTAMP_TYPE struct nf_conn_tstamp
22 32
23/* Extensions: optional stuff which isn't permanently in struct. */ 33/* Extensions: optional stuff which isn't permanently in struct. */
24struct nf_ct_ext { 34struct nf_ct_ext {
diff --git a/include/net/netfilter/nf_conntrack_helper.h b/include/net/netfilter/nf_conntrack_helper.h
index 32c305dbdab6..f1c1311adc2c 100644
--- a/include/net/netfilter/nf_conntrack_helper.h
+++ b/include/net/netfilter/nf_conntrack_helper.h
@@ -63,4 +63,10 @@ static inline struct nf_conn_help *nfct_help(const struct nf_conn *ct)
63extern int nf_conntrack_helper_init(void); 63extern int nf_conntrack_helper_init(void);
64extern void nf_conntrack_helper_fini(void); 64extern void nf_conntrack_helper_fini(void);
65 65
66extern int nf_conntrack_broadcast_help(struct sk_buff *skb,
67 unsigned int protoff,
68 struct nf_conn *ct,
69 enum ip_conntrack_info ctinfo,
70 unsigned int timeout);
71
66#endif /*_NF_CONNTRACK_HELPER_H*/ 72#endif /*_NF_CONNTRACK_HELPER_H*/
diff --git a/include/net/netfilter/nf_conntrack_l3proto.h b/include/net/netfilter/nf_conntrack_l3proto.h
index a7547611e8f1..e8010f445ae1 100644
--- a/include/net/netfilter/nf_conntrack_l3proto.h
+++ b/include/net/netfilter/nf_conntrack_l3proto.h
@@ -73,7 +73,7 @@ struct nf_conntrack_l3proto {
73 struct module *me; 73 struct module *me;
74}; 74};
75 75
76extern struct nf_conntrack_l3proto *nf_ct_l3protos[AF_MAX]; 76extern struct nf_conntrack_l3proto __rcu *nf_ct_l3protos[AF_MAX];
77 77
78/* Protocol registration. */ 78/* Protocol registration. */
79extern int nf_conntrack_l3proto_register(struct nf_conntrack_l3proto *proto); 79extern int nf_conntrack_l3proto_register(struct nf_conntrack_l3proto *proto);
diff --git a/include/net/netfilter/nf_conntrack_timestamp.h b/include/net/netfilter/nf_conntrack_timestamp.h
new file mode 100644
index 000000000000..fc9c82b1f06b
--- /dev/null
+++ b/include/net/netfilter/nf_conntrack_timestamp.h
@@ -0,0 +1,65 @@
1#ifndef _NF_CONNTRACK_TSTAMP_H
2#define _NF_CONNTRACK_TSTAMP_H
3
4#include <net/net_namespace.h>
5#include <linux/netfilter/nf_conntrack_common.h>
6#include <linux/netfilter/nf_conntrack_tuple_common.h>
7#include <net/netfilter/nf_conntrack.h>
8#include <net/netfilter/nf_conntrack_extend.h>
9
10struct nf_conn_tstamp {
11 u_int64_t start;
12 u_int64_t stop;
13};
14
15static inline
16struct nf_conn_tstamp *nf_conn_tstamp_find(const struct nf_conn *ct)
17{
18#ifdef CONFIG_NF_CONNTRACK_TIMESTAMP
19 return nf_ct_ext_find(ct, NF_CT_EXT_TSTAMP);
20#else
21 return NULL;
22#endif
23}
24
25static inline
26struct nf_conn_tstamp *nf_ct_tstamp_ext_add(struct nf_conn *ct, gfp_t gfp)
27{
28#ifdef CONFIG_NF_CONNTRACK_TIMESTAMP
29 struct net *net = nf_ct_net(ct);
30
31 if (!net->ct.sysctl_tstamp)
32 return NULL;
33
34 return nf_ct_ext_add(ct, NF_CT_EXT_TSTAMP, gfp);
35#else
36 return NULL;
37#endif
38};
39
40static inline bool nf_ct_tstamp_enabled(struct net *net)
41{
42 return net->ct.sysctl_tstamp != 0;
43}
44
45static inline void nf_ct_set_tstamp(struct net *net, bool enable)
46{
47 net->ct.sysctl_tstamp = enable;
48}
49
50#ifdef CONFIG_NF_CONNTRACK_TIMESTAMP
51extern int nf_conntrack_tstamp_init(struct net *net);
52extern void nf_conntrack_tstamp_fini(struct net *net);
53#else
54static inline int nf_conntrack_tstamp_init(struct net *net)
55{
56 return 0;
57}
58
59static inline void nf_conntrack_tstamp_fini(struct net *net)
60{
61 return;
62}
63#endif /* CONFIG_NF_CONNTRACK_TIMESTAMP */
64
65#endif /* _NF_CONNTRACK_TSTAMP_H */
diff --git a/include/net/netfilter/nf_nat.h b/include/net/netfilter/nf_nat.h
index f5f09f032a90..aff80b190c12 100644
--- a/include/net/netfilter/nf_nat.h
+++ b/include/net/netfilter/nf_nat.h
@@ -56,7 +56,9 @@ struct nf_nat_multi_range_compat {
56/* per conntrack: nat application helper private data */ 56/* per conntrack: nat application helper private data */
57union nf_conntrack_nat_help { 57union nf_conntrack_nat_help {
58 /* insert nat helper private data here */ 58 /* insert nat helper private data here */
59#if defined(CONFIG_NF_NAT_PPTP) || defined(CONFIG_NF_NAT_PPTP_MODULE)
59 struct nf_nat_pptp nat_pptp_info; 60 struct nf_nat_pptp nat_pptp_info;
61#endif
60}; 62};
61 63
62struct nf_conn; 64struct nf_conn;
@@ -84,7 +86,11 @@ extern int nf_nat_used_tuple(const struct nf_conntrack_tuple *tuple,
84 86
85static inline struct nf_conn_nat *nfct_nat(const struct nf_conn *ct) 87static inline struct nf_conn_nat *nfct_nat(const struct nf_conn *ct)
86{ 88{
89#if defined(CONFIG_NF_NAT) || defined(CONFIG_NF_NAT_MODULE)
87 return nf_ct_ext_find(ct, NF_CT_EXT_NAT); 90 return nf_ct_ext_find(ct, NF_CT_EXT_NAT);
91#else
92 return NULL;
93#endif
88} 94}
89 95
90#else /* !__KERNEL__: iptables wants this to compile. */ 96#else /* !__KERNEL__: iptables wants this to compile. */
diff --git a/include/net/netfilter/nf_nat_core.h b/include/net/netfilter/nf_nat_core.h
index 33602ab66190..3dc7b98effeb 100644
--- a/include/net/netfilter/nf_nat_core.h
+++ b/include/net/netfilter/nf_nat_core.h
@@ -21,9 +21,9 @@ static inline int nf_nat_initialized(struct nf_conn *ct,
21 enum nf_nat_manip_type manip) 21 enum nf_nat_manip_type manip)
22{ 22{
23 if (manip == IP_NAT_MANIP_SRC) 23 if (manip == IP_NAT_MANIP_SRC)
24 return test_bit(IPS_SRC_NAT_DONE_BIT, &ct->status); 24 return ct->status & IPS_SRC_NAT_DONE;
25 else 25 else
26 return test_bit(IPS_DST_NAT_DONE_BIT, &ct->status); 26 return ct->status & IPS_DST_NAT_DONE;
27} 27}
28 28
29struct nlattr; 29struct nlattr;
diff --git a/include/net/netlink.h b/include/net/netlink.h
index 373f1a900cf4..8a3906a08f5f 100644
--- a/include/net/netlink.h
+++ b/include/net/netlink.h
@@ -856,18 +856,27 @@ static inline int nla_put_msecs(struct sk_buff *skb, int attrtype,
856#define NLA_PUT_BE16(skb, attrtype, value) \ 856#define NLA_PUT_BE16(skb, attrtype, value) \
857 NLA_PUT_TYPE(skb, __be16, attrtype, value) 857 NLA_PUT_TYPE(skb, __be16, attrtype, value)
858 858
859#define NLA_PUT_NET16(skb, attrtype, value) \
860 NLA_PUT_BE16(skb, attrtype | NLA_F_NET_BYTEORDER, value)
861
859#define NLA_PUT_U32(skb, attrtype, value) \ 862#define NLA_PUT_U32(skb, attrtype, value) \
860 NLA_PUT_TYPE(skb, u32, attrtype, value) 863 NLA_PUT_TYPE(skb, u32, attrtype, value)
861 864
862#define NLA_PUT_BE32(skb, attrtype, value) \ 865#define NLA_PUT_BE32(skb, attrtype, value) \
863 NLA_PUT_TYPE(skb, __be32, attrtype, value) 866 NLA_PUT_TYPE(skb, __be32, attrtype, value)
864 867
868#define NLA_PUT_NET32(skb, attrtype, value) \
869 NLA_PUT_BE32(skb, attrtype | NLA_F_NET_BYTEORDER, value)
870
865#define NLA_PUT_U64(skb, attrtype, value) \ 871#define NLA_PUT_U64(skb, attrtype, value) \
866 NLA_PUT_TYPE(skb, u64, attrtype, value) 872 NLA_PUT_TYPE(skb, u64, attrtype, value)
867 873
868#define NLA_PUT_BE64(skb, attrtype, value) \ 874#define NLA_PUT_BE64(skb, attrtype, value) \
869 NLA_PUT_TYPE(skb, __be64, attrtype, value) 875 NLA_PUT_TYPE(skb, __be64, attrtype, value)
870 876
877#define NLA_PUT_NET64(skb, attrtype, value) \
878 NLA_PUT_BE64(skb, attrtype | NLA_F_NET_BYTEORDER, value)
879
871#define NLA_PUT_STRING(skb, attrtype, value) \ 880#define NLA_PUT_STRING(skb, attrtype, value) \
872 NLA_PUT(skb, attrtype, strlen(value) + 1, value) 881 NLA_PUT(skb, attrtype, strlen(value) + 1, value)
873 882
diff --git a/include/net/netns/conntrack.h b/include/net/netns/conntrack.h
index d4958d4c6574..341eb089349e 100644
--- a/include/net/netns/conntrack.h
+++ b/include/net/netns/conntrack.h
@@ -21,15 +21,15 @@ struct netns_ct {
21 int sysctl_events; 21 int sysctl_events;
22 unsigned int sysctl_events_retry_timeout; 22 unsigned int sysctl_events_retry_timeout;
23 int sysctl_acct; 23 int sysctl_acct;
24 int sysctl_tstamp;
24 int sysctl_checksum; 25 int sysctl_checksum;
25 unsigned int sysctl_log_invalid; /* Log invalid packets */ 26 unsigned int sysctl_log_invalid; /* Log invalid packets */
26#ifdef CONFIG_SYSCTL 27#ifdef CONFIG_SYSCTL
27 struct ctl_table_header *sysctl_header; 28 struct ctl_table_header *sysctl_header;
28 struct ctl_table_header *acct_sysctl_header; 29 struct ctl_table_header *acct_sysctl_header;
30 struct ctl_table_header *tstamp_sysctl_header;
29 struct ctl_table_header *event_sysctl_header; 31 struct ctl_table_header *event_sysctl_header;
30#endif 32#endif
31 int hash_vmalloc;
32 int expect_vmalloc;
33 char *slabname; 33 char *slabname;
34}; 34};
35#endif 35#endif
diff --git a/include/net/netns/ipv4.h b/include/net/netns/ipv4.h
index d68c3f121774..e2e2ef57eca2 100644
--- a/include/net/netns/ipv4.h
+++ b/include/net/netns/ipv4.h
@@ -43,7 +43,6 @@ struct netns_ipv4 {
43 struct xt_table *nat_table; 43 struct xt_table *nat_table;
44 struct hlist_head *nat_bysource; 44 struct hlist_head *nat_bysource;
45 unsigned int nat_htable_size; 45 unsigned int nat_htable_size;
46 int nat_vmalloced;
47#endif 46#endif
48 47
49 int sysctl_icmp_echo_ignore_all; 48 int sysctl_icmp_echo_ignore_all;
diff --git a/include/net/phonet/pep.h b/include/net/phonet/pep.h
index b60b28c99e87..b669fe6dbc3b 100644
--- a/include/net/phonet/pep.h
+++ b/include/net/phonet/pep.h
@@ -28,7 +28,6 @@ struct pep_sock {
28 28
29 /* XXX: union-ify listening vs connected stuff ? */ 29 /* XXX: union-ify listening vs connected stuff ? */
30 /* Listening socket stuff: */ 30 /* Listening socket stuff: */
31 struct hlist_head ackq;
32 struct hlist_head hlist; 31 struct hlist_head hlist;
33 32
34 /* Connected socket stuff: */ 33 /* Connected socket stuff: */
@@ -45,10 +44,6 @@ struct pep_sock {
45 u8 tx_fc; /* TX flow control */ 44 u8 tx_fc; /* TX flow control */
46 u8 init_enable; /* auto-enable at creation */ 45 u8 init_enable; /* auto-enable at creation */
47 u8 aligned; 46 u8 aligned;
48#ifdef CONFIG_PHONET_PIPECTRLR
49 u8 pipe_state;
50 struct sockaddr_pn remote_pep;
51#endif
52}; 47};
53 48
54static inline struct pep_sock *pep_sk(struct sock *sk) 49static inline struct pep_sock *pep_sk(struct sock *sk)
@@ -158,6 +153,7 @@ enum {
158 PN_LEGACY_FLOW_CONTROL, 153 PN_LEGACY_FLOW_CONTROL,
159 PN_ONE_CREDIT_FLOW_CONTROL, 154 PN_ONE_CREDIT_FLOW_CONTROL,
160 PN_MULTI_CREDIT_FLOW_CONTROL, 155 PN_MULTI_CREDIT_FLOW_CONTROL,
156 PN_MAX_FLOW_CONTROL,
161}; 157};
162 158
163#define pn_flow_safe(fc) ((fc) >> 1) 159#define pn_flow_safe(fc) ((fc) >> 1)
@@ -169,21 +165,4 @@ enum {
169 PEP_IND_READY, 165 PEP_IND_READY,
170}; 166};
171 167
172#ifdef CONFIG_PHONET_PIPECTRLR
173#define PNS_PEP_CONNECT_UTID 0x02
174#define PNS_PIPE_CREATED_IND_UTID 0x04
175#define PNS_PIPE_ENABLE_UTID 0x0A
176#define PNS_PIPE_ENABLED_IND_UTID 0x0C
177#define PNS_PIPE_DISABLE_UTID 0x0F
178#define PNS_PIPE_DISABLED_IND_UTID 0x11
179#define PNS_PEP_DISCONNECT_UTID 0x06
180
181/* Used for tracking state of a pipe */
182enum {
183 PIPE_IDLE,
184 PIPE_DISABLED,
185 PIPE_ENABLED,
186};
187#endif /* CONFIG_PHONET_PIPECTRLR */
188
189#endif 168#endif
diff --git a/include/net/phonet/phonet.h b/include/net/phonet/phonet.h
index 5395e09187df..68e509750caa 100644
--- a/include/net/phonet/phonet.h
+++ b/include/net/phonet/phonet.h
@@ -36,6 +36,7 @@
36struct pn_sock { 36struct pn_sock {
37 struct sock sk; 37 struct sock sk;
38 u16 sobject; 38 u16 sobject;
39 u16 dobject;
39 u8 resource; 40 u8 resource;
40}; 41};
41 42
diff --git a/include/net/protocol.h b/include/net/protocol.h
index dc07495bce4c..6f7eb800974a 100644
--- a/include/net/protocol.h
+++ b/include/net/protocol.h
@@ -38,7 +38,7 @@ struct net_protocol {
38 void (*err_handler)(struct sk_buff *skb, u32 info); 38 void (*err_handler)(struct sk_buff *skb, u32 info);
39 int (*gso_send_check)(struct sk_buff *skb); 39 int (*gso_send_check)(struct sk_buff *skb);
40 struct sk_buff *(*gso_segment)(struct sk_buff *skb, 40 struct sk_buff *(*gso_segment)(struct sk_buff *skb,
41 int features); 41 u32 features);
42 struct sk_buff **(*gro_receive)(struct sk_buff **head, 42 struct sk_buff **(*gro_receive)(struct sk_buff **head,
43 struct sk_buff *skb); 43 struct sk_buff *skb);
44 int (*gro_complete)(struct sk_buff *skb); 44 int (*gro_complete)(struct sk_buff *skb);
@@ -57,7 +57,7 @@ struct inet6_protocol {
57 57
58 int (*gso_send_check)(struct sk_buff *skb); 58 int (*gso_send_check)(struct sk_buff *skb);
59 struct sk_buff *(*gso_segment)(struct sk_buff *skb, 59 struct sk_buff *(*gso_segment)(struct sk_buff *skb,
60 int features); 60 u32 features);
61 struct sk_buff **(*gro_receive)(struct sk_buff **head, 61 struct sk_buff **(*gro_receive)(struct sk_buff **head,
62 struct sk_buff *skb); 62 struct sk_buff *skb);
63 int (*gro_complete)(struct sk_buff *skb); 63 int (*gro_complete)(struct sk_buff *skb);
diff --git a/include/net/route.h b/include/net/route.h
index 93e10c453f6b..30d6cae3841a 100644
--- a/include/net/route.h
+++ b/include/net/route.h
@@ -49,36 +49,43 @@
49 49
50struct fib_nh; 50struct fib_nh;
51struct inet_peer; 51struct inet_peer;
52struct fib_info;
52struct rtable { 53struct rtable {
53 struct dst_entry dst; 54 struct dst_entry dst;
54 55
55 /* Cache lookup keys */ 56 /* Lookup key. */
56 struct flowi fl; 57 __be32 rt_key_dst;
58 __be32 rt_key_src;
57 59
58 int rt_genid; 60 int rt_genid;
59 unsigned rt_flags; 61 unsigned rt_flags;
60 __u16 rt_type; 62 __u16 rt_type;
63 __u8 rt_tos;
61 64
62 __be32 rt_dst; /* Path destination */ 65 __be32 rt_dst; /* Path destination */
63 __be32 rt_src; /* Path source */ 66 __be32 rt_src; /* Path source */
64 int rt_iif; 67 int rt_iif;
68 int rt_oif;
69 __u32 rt_mark;
65 70
66 /* Info on neighbour */ 71 /* Info on neighbour */
67 __be32 rt_gateway; 72 __be32 rt_gateway;
68 73
69 /* Miscellaneous cached information */ 74 /* Miscellaneous cached information */
70 __be32 rt_spec_dst; /* RFC1122 specific destination */ 75 __be32 rt_spec_dst; /* RFC1122 specific destination */
76 u32 rt_peer_genid;
71 struct inet_peer *peer; /* long-living peer info */ 77 struct inet_peer *peer; /* long-living peer info */
78 struct fib_info *fi; /* for client ref to shared metrics */
72}; 79};
73 80
74static inline bool rt_is_input_route(struct rtable *rt) 81static inline bool rt_is_input_route(struct rtable *rt)
75{ 82{
76 return rt->fl.iif != 0; 83 return rt->rt_iif != 0;
77} 84}
78 85
79static inline bool rt_is_output_route(struct rtable *rt) 86static inline bool rt_is_output_route(struct rtable *rt)
80{ 87{
81 return rt->fl.iif == 0; 88 return rt->rt_iif == 0;
82} 89}
83 90
84struct ip_rt_acct { 91struct ip_rt_acct {
@@ -115,9 +122,63 @@ extern void ip_rt_redirect(__be32 old_gw, __be32 dst, __be32 new_gw,
115 __be32 src, struct net_device *dev); 122 __be32 src, struct net_device *dev);
116extern void rt_cache_flush(struct net *net, int how); 123extern void rt_cache_flush(struct net *net, int how);
117extern void rt_cache_flush_batch(struct net *net); 124extern void rt_cache_flush_batch(struct net *net);
118extern int __ip_route_output_key(struct net *, struct rtable **, const struct flowi *flp); 125extern struct rtable *__ip_route_output_key(struct net *, const struct flowi4 *flp);
119extern int ip_route_output_key(struct net *, struct rtable **, struct flowi *flp); 126extern struct rtable *ip_route_output_flow(struct net *, struct flowi4 *flp,
120extern int ip_route_output_flow(struct net *, struct rtable **rp, struct flowi *flp, struct sock *sk, int flags); 127 struct sock *sk);
128extern struct dst_entry *ipv4_blackhole_route(struct net *net, struct dst_entry *dst_orig);
129
130static inline struct rtable *ip_route_output_key(struct net *net, struct flowi4 *flp)
131{
132 return ip_route_output_flow(net, flp, NULL);
133}
134
135static inline struct rtable *ip_route_output(struct net *net, __be32 daddr,
136 __be32 saddr, u8 tos, int oif)
137{
138 struct flowi4 fl4 = {
139 .flowi4_oif = oif,
140 .daddr = daddr,
141 .saddr = saddr,
142 .flowi4_tos = tos,
143 };
144 return ip_route_output_key(net, &fl4);
145}
146
147static inline struct rtable *ip_route_output_ports(struct net *net, struct sock *sk,
148 __be32 daddr, __be32 saddr,
149 __be16 dport, __be16 sport,
150 __u8 proto, __u8 tos, int oif)
151{
152 struct flowi4 fl4 = {
153 .flowi4_oif = oif,
154 .flowi4_flags = sk ? inet_sk_flowi_flags(sk) : 0,
155 .flowi4_mark = sk ? sk->sk_mark : 0,
156 .daddr = daddr,
157 .saddr = saddr,
158 .flowi4_tos = tos,
159 .flowi4_proto = proto,
160 .fl4_dport = dport,
161 .fl4_sport = sport,
162 };
163 if (sk)
164 security_sk_classify_flow(sk, flowi4_to_flowi(&fl4));
165 return ip_route_output_flow(net, &fl4, sk);
166}
167
168static inline struct rtable *ip_route_output_gre(struct net *net,
169 __be32 daddr, __be32 saddr,
170 __be32 gre_key, __u8 tos, int oif)
171{
172 struct flowi4 fl4 = {
173 .flowi4_oif = oif,
174 .daddr = daddr,
175 .saddr = saddr,
176 .flowi4_tos = tos,
177 .flowi4_proto = IPPROTO_GRE,
178 .fl4_gre_key = gre_key,
179 };
180 return ip_route_output_key(net, &fl4);
181}
121 182
122extern int ip_route_input_common(struct sk_buff *skb, __be32 dst, __be32 src, 183extern int ip_route_input_common(struct sk_buff *skb, __be32 dst, __be32 src,
123 u8 tos, struct net_device *devin, bool noref); 184 u8 tos, struct net_device *devin, bool noref);
@@ -162,57 +223,68 @@ static inline char rt_tos2priority(u8 tos)
162 return ip_tos2prio[IPTOS_TOS(tos)>>1]; 223 return ip_tos2prio[IPTOS_TOS(tos)>>1];
163} 224}
164 225
165static inline int ip_route_connect(struct rtable **rp, __be32 dst, 226static inline struct rtable *ip_route_connect(__be32 dst, __be32 src, u32 tos,
166 __be32 src, u32 tos, int oif, u8 protocol, 227 int oif, u8 protocol,
167 __be16 sport, __be16 dport, struct sock *sk, 228 __be16 sport, __be16 dport,
168 int flags) 229 struct sock *sk, bool can_sleep)
169{ 230{
170 struct flowi fl = { .oif = oif, 231 struct flowi4 fl4 = {
171 .mark = sk->sk_mark, 232 .flowi4_oif = oif,
172 .fl4_dst = dst, 233 .flowi4_mark = sk->sk_mark,
173 .fl4_src = src, 234 .daddr = dst,
174 .fl4_tos = tos, 235 .saddr = src,
175 .proto = protocol, 236 .flowi4_tos = tos,
176 .fl_ip_sport = sport, 237 .flowi4_proto = protocol,
177 .fl_ip_dport = dport }; 238 .fl4_sport = sport,
178 int err; 239 .fl4_dport = dport,
240 };
179 struct net *net = sock_net(sk); 241 struct net *net = sock_net(sk);
242 struct rtable *rt;
180 243
181 if (inet_sk(sk)->transparent) 244 if (inet_sk(sk)->transparent)
182 fl.flags |= FLOWI_FLAG_ANYSRC; 245 fl4.flowi4_flags |= FLOWI_FLAG_ANYSRC;
246 if (protocol == IPPROTO_TCP)
247 fl4.flowi4_flags |= FLOWI_FLAG_PRECOW_METRICS;
248 if (can_sleep)
249 fl4.flowi4_flags |= FLOWI_FLAG_CAN_SLEEP;
183 250
184 if (!dst || !src) { 251 if (!dst || !src) {
185 err = __ip_route_output_key(net, rp, &fl); 252 rt = __ip_route_output_key(net, &fl4);
186 if (err) 253 if (IS_ERR(rt))
187 return err; 254 return rt;
188 fl.fl4_dst = (*rp)->rt_dst; 255 fl4.daddr = rt->rt_dst;
189 fl.fl4_src = (*rp)->rt_src; 256 fl4.saddr = rt->rt_src;
190 ip_rt_put(*rp); 257 ip_rt_put(rt);
191 *rp = NULL;
192 } 258 }
193 security_sk_classify_flow(sk, &fl); 259 security_sk_classify_flow(sk, flowi4_to_flowi(&fl4));
194 return ip_route_output_flow(net, rp, &fl, sk, flags); 260 return ip_route_output_flow(net, &fl4, sk);
195} 261}
196 262
197static inline int ip_route_newports(struct rtable **rp, u8 protocol, 263static inline struct rtable *ip_route_newports(struct rtable *rt,
198 __be16 sport, __be16 dport, struct sock *sk) 264 u8 protocol, __be16 orig_sport,
265 __be16 orig_dport, __be16 sport,
266 __be16 dport, struct sock *sk)
199{ 267{
200 if (sport != (*rp)->fl.fl_ip_sport || 268 if (sport != orig_sport || dport != orig_dport) {
201 dport != (*rp)->fl.fl_ip_dport) { 269 struct flowi4 fl4 = {
202 struct flowi fl; 270 .flowi4_oif = rt->rt_oif,
203 271 .flowi4_mark = rt->rt_mark,
204 memcpy(&fl, &(*rp)->fl, sizeof(fl)); 272 .daddr = rt->rt_key_dst,
205 fl.fl_ip_sport = sport; 273 .saddr = rt->rt_key_src,
206 fl.fl_ip_dport = dport; 274 .flowi4_tos = rt->rt_tos,
207 fl.proto = protocol; 275 .flowi4_proto = protocol,
276 .fl4_sport = sport,
277 .fl4_dport = dport
278 };
208 if (inet_sk(sk)->transparent) 279 if (inet_sk(sk)->transparent)
209 fl.flags |= FLOWI_FLAG_ANYSRC; 280 fl4.flowi4_flags |= FLOWI_FLAG_ANYSRC;
210 ip_rt_put(*rp); 281 if (protocol == IPPROTO_TCP)
211 *rp = NULL; 282 fl4.flowi4_flags |= FLOWI_FLAG_PRECOW_METRICS;
212 security_sk_classify_flow(sk, &fl); 283 ip_rt_put(rt);
213 return ip_route_output_flow(sock_net(sk), rp, &fl, sk, 0); 284 security_sk_classify_flow(sk, flowi4_to_flowi(&fl4));
285 return ip_route_output_flow(sock_net(sk), &fl4, sk);
214 } 286 }
215 return 0; 287 return rt;
216} 288}
217 289
218extern void rt_bind_peer(struct rtable *rt, int create); 290extern void rt_bind_peer(struct rtable *rt, int create);
diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h
index 04f8556313d5..a9505b6a18e3 100644
--- a/include/net/sch_generic.h
+++ b/include/net/sch_generic.h
@@ -31,10 +31,12 @@ enum qdisc_state_t {
31 * following bits are only changed while qdisc lock is held 31 * following bits are only changed while qdisc lock is held
32 */ 32 */
33enum qdisc___state_t { 33enum qdisc___state_t {
34 __QDISC___STATE_RUNNING, 34 __QDISC___STATE_RUNNING = 1,
35 __QDISC___STATE_THROTTLED = 2,
35}; 36};
36 37
37struct qdisc_size_table { 38struct qdisc_size_table {
39 struct rcu_head rcu;
38 struct list_head list; 40 struct list_head list;
39 struct tc_sizespec szopts; 41 struct tc_sizespec szopts;
40 int refcnt; 42 int refcnt;
@@ -46,14 +48,13 @@ struct Qdisc {
46 struct sk_buff * (*dequeue)(struct Qdisc *dev); 48 struct sk_buff * (*dequeue)(struct Qdisc *dev);
47 unsigned flags; 49 unsigned flags;
48#define TCQ_F_BUILTIN 1 50#define TCQ_F_BUILTIN 1
49#define TCQ_F_THROTTLED 2 51#define TCQ_F_INGRESS 2
50#define TCQ_F_INGRESS 4 52#define TCQ_F_CAN_BYPASS 4
51#define TCQ_F_CAN_BYPASS 8 53#define TCQ_F_MQROOT 8
52#define TCQ_F_MQROOT 16
53#define TCQ_F_WARN_NONWC (1 << 16) 54#define TCQ_F_WARN_NONWC (1 << 16)
54 int padded; 55 int padded;
55 struct Qdisc_ops *ops; 56 struct Qdisc_ops *ops;
56 struct qdisc_size_table *stab; 57 struct qdisc_size_table __rcu *stab;
57 struct list_head list; 58 struct list_head list;
58 u32 handle; 59 u32 handle;
59 u32 parent; 60 u32 parent;
@@ -78,25 +79,44 @@ struct Qdisc {
78 unsigned long state; 79 unsigned long state;
79 struct sk_buff_head q; 80 struct sk_buff_head q;
80 struct gnet_stats_basic_packed bstats; 81 struct gnet_stats_basic_packed bstats;
81 unsigned long __state; 82 unsigned int __state;
82 struct gnet_stats_queue qstats; 83 struct gnet_stats_queue qstats;
83 struct rcu_head rcu_head; 84 struct rcu_head rcu_head;
84 spinlock_t busylock; 85 spinlock_t busylock;
86 u32 limit;
85}; 87};
86 88
87static inline bool qdisc_is_running(struct Qdisc *qdisc) 89static inline bool qdisc_is_running(const struct Qdisc *qdisc)
88{ 90{
89 return test_bit(__QDISC___STATE_RUNNING, &qdisc->__state); 91 return (qdisc->__state & __QDISC___STATE_RUNNING) ? true : false;
90} 92}
91 93
92static inline bool qdisc_run_begin(struct Qdisc *qdisc) 94static inline bool qdisc_run_begin(struct Qdisc *qdisc)
93{ 95{
94 return !__test_and_set_bit(__QDISC___STATE_RUNNING, &qdisc->__state); 96 if (qdisc_is_running(qdisc))
97 return false;
98 qdisc->__state |= __QDISC___STATE_RUNNING;
99 return true;
95} 100}
96 101
97static inline void qdisc_run_end(struct Qdisc *qdisc) 102static inline void qdisc_run_end(struct Qdisc *qdisc)
98{ 103{
99 __clear_bit(__QDISC___STATE_RUNNING, &qdisc->__state); 104 qdisc->__state &= ~__QDISC___STATE_RUNNING;
105}
106
107static inline bool qdisc_is_throttled(const struct Qdisc *qdisc)
108{
109 return (qdisc->__state & __QDISC___STATE_THROTTLED) ? true : false;
110}
111
112static inline void qdisc_throttled(struct Qdisc *qdisc)
113{
114 qdisc->__state |= __QDISC___STATE_THROTTLED;
115}
116
117static inline void qdisc_unthrottled(struct Qdisc *qdisc)
118{
119 qdisc->__state &= ~__QDISC___STATE_THROTTLED;
100} 120}
101 121
102struct Qdisc_class_ops { 122struct Qdisc_class_ops {
@@ -331,8 +351,8 @@ extern struct Qdisc *qdisc_alloc(struct netdev_queue *dev_queue,
331 struct Qdisc_ops *ops); 351 struct Qdisc_ops *ops);
332extern struct Qdisc *qdisc_create_dflt(struct netdev_queue *dev_queue, 352extern struct Qdisc *qdisc_create_dflt(struct netdev_queue *dev_queue,
333 struct Qdisc_ops *ops, u32 parentid); 353 struct Qdisc_ops *ops, u32 parentid);
334extern void qdisc_calculate_pkt_len(struct sk_buff *skb, 354extern void __qdisc_calculate_pkt_len(struct sk_buff *skb,
335 struct qdisc_size_table *stab); 355 const struct qdisc_size_table *stab);
336extern void tcf_destroy(struct tcf_proto *tp); 356extern void tcf_destroy(struct tcf_proto *tp);
337extern void tcf_destroy_chain(struct tcf_proto **fl); 357extern void tcf_destroy_chain(struct tcf_proto **fl);
338 358
@@ -411,12 +431,20 @@ enum net_xmit_qdisc_t {
411#define net_xmit_drop_count(e) (1) 431#define net_xmit_drop_count(e) (1)
412#endif 432#endif
413 433
414static inline int qdisc_enqueue(struct sk_buff *skb, struct Qdisc *sch) 434static inline void qdisc_calculate_pkt_len(struct sk_buff *skb,
435 const struct Qdisc *sch)
415{ 436{
416#ifdef CONFIG_NET_SCHED 437#ifdef CONFIG_NET_SCHED
417 if (sch->stab) 438 struct qdisc_size_table *stab = rcu_dereference_bh(sch->stab);
418 qdisc_calculate_pkt_len(skb, sch->stab); 439
440 if (stab)
441 __qdisc_calculate_pkt_len(skb, stab);
419#endif 442#endif
443}
444
445static inline int qdisc_enqueue(struct sk_buff *skb, struct Qdisc *sch)
446{
447 qdisc_calculate_pkt_len(skb, sch);
420 return sch->enqueue(skb, sch); 448 return sch->enqueue(skb, sch);
421} 449}
422 450
diff --git a/include/net/sock.h b/include/net/sock.h
index bc1cf7d88ccb..da0534d3401c 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -281,7 +281,7 @@ struct sock {
281 int sk_rcvbuf; 281 int sk_rcvbuf;
282 282
283 struct sk_filter __rcu *sk_filter; 283 struct sk_filter __rcu *sk_filter;
284 struct socket_wq *sk_wq; 284 struct socket_wq __rcu *sk_wq;
285 285
286#ifdef CONFIG_NET_DMA 286#ifdef CONFIG_NET_DMA
287 struct sk_buff_head sk_async_wait_queue; 287 struct sk_buff_head sk_async_wait_queue;
@@ -1191,7 +1191,7 @@ extern void sk_filter_release_rcu(struct rcu_head *rcu);
1191static inline void sk_filter_release(struct sk_filter *fp) 1191static inline void sk_filter_release(struct sk_filter *fp)
1192{ 1192{
1193 if (atomic_dec_and_test(&fp->refcnt)) 1193 if (atomic_dec_and_test(&fp->refcnt))
1194 call_rcu_bh(&fp->rcu, sk_filter_release_rcu); 1194 call_rcu(&fp->rcu, sk_filter_release_rcu);
1195} 1195}
1196 1196
1197static inline void sk_filter_uncharge(struct sock *sk, struct sk_filter *fp) 1197static inline void sk_filter_uncharge(struct sock *sk, struct sk_filter *fp)
@@ -1266,7 +1266,8 @@ static inline void sk_set_socket(struct sock *sk, struct socket *sock)
1266 1266
1267static inline wait_queue_head_t *sk_sleep(struct sock *sk) 1267static inline wait_queue_head_t *sk_sleep(struct sock *sk)
1268{ 1268{
1269 return &sk->sk_wq->wait; 1269 BUILD_BUG_ON(offsetof(struct socket_wq, wait) != 0);
1270 return &rcu_dereference_raw(sk->sk_wq)->wait;
1270} 1271}
1271/* Detach socket from process context. 1272/* Detach socket from process context.
1272 * Announce socket dead, detach it from wait queue and inode. 1273 * Announce socket dead, detach it from wait queue and inode.
@@ -1287,7 +1288,7 @@ static inline void sock_orphan(struct sock *sk)
1287static inline void sock_graft(struct sock *sk, struct socket *parent) 1288static inline void sock_graft(struct sock *sk, struct socket *parent)
1288{ 1289{
1289 write_lock_bh(&sk->sk_callback_lock); 1290 write_lock_bh(&sk->sk_callback_lock);
1290 rcu_assign_pointer(sk->sk_wq, parent->wq); 1291 sk->sk_wq = parent->wq;
1291 parent->sk = sk; 1292 parent->sk = sk;
1292 sk_set_socket(sk, parent); 1293 sk_set_socket(sk, parent);
1293 security_sock_graft(sk, parent); 1294 security_sock_graft(sk, parent);
diff --git a/include/net/tcp.h b/include/net/tcp.h
index 38509f047382..cda30ea354a2 100644
--- a/include/net/tcp.h
+++ b/include/net/tcp.h
@@ -196,6 +196,9 @@ extern void tcp_time_wait(struct sock *sk, int state, int timeo);
196/* TCP thin-stream limits */ 196/* TCP thin-stream limits */
197#define TCP_THIN_LINEAR_RETRIES 6 /* After 6 linear retries, do exp. backoff */ 197#define TCP_THIN_LINEAR_RETRIES 6 /* After 6 linear retries, do exp. backoff */
198 198
199/* TCP initial congestion window as per draft-hkchu-tcpm-initcwnd-01 */
200#define TCP_INIT_CWND 10
201
199extern struct inet_timewait_death_row tcp_death_row; 202extern struct inet_timewait_death_row tcp_death_row;
200 203
201/* sysctl variables for tcp */ 204/* sysctl variables for tcp */
@@ -799,15 +802,6 @@ static inline __u32 tcp_current_ssthresh(const struct sock *sk)
799/* Use define here intentionally to get WARN_ON location shown at the caller */ 802/* Use define here intentionally to get WARN_ON location shown at the caller */
800#define tcp_verify_left_out(tp) WARN_ON(tcp_left_out(tp) > tp->packets_out) 803#define tcp_verify_left_out(tp) WARN_ON(tcp_left_out(tp) > tp->packets_out)
801 804
802/*
803 * Convert RFC 3390 larger initial window into an equivalent number of packets.
804 * This is based on the numbers specified in RFC 5681, 3.1.
805 */
806static inline u32 rfc3390_bytes_to_packets(const u32 smss)
807{
808 return smss <= 1095 ? 4 : (smss > 2190 ? 2 : 3);
809}
810
811extern void tcp_enter_cwr(struct sock *sk, const int set_ssthresh); 805extern void tcp_enter_cwr(struct sock *sk, const int set_ssthresh);
812extern __u32 tcp_init_cwnd(struct tcp_sock *tp, struct dst_entry *dst); 806extern __u32 tcp_init_cwnd(struct tcp_sock *tp, struct dst_entry *dst);
813 807
@@ -1074,8 +1068,6 @@ static inline int tcp_paws_reject(const struct tcp_options_received *rx_opt,
1074 return 1; 1068 return 1;
1075} 1069}
1076 1070
1077#define TCP_CHECK_TIMER(sk) do { } while (0)
1078
1079static inline void tcp_mib_init(struct net *net) 1071static inline void tcp_mib_init(struct net *net)
1080{ 1072{
1081 /* See RFC 2012 */ 1073 /* See RFC 2012 */
@@ -1404,7 +1396,7 @@ extern struct request_sock_ops tcp6_request_sock_ops;
1404extern void tcp_v4_destroy_sock(struct sock *sk); 1396extern void tcp_v4_destroy_sock(struct sock *sk);
1405 1397
1406extern int tcp_v4_gso_send_check(struct sk_buff *skb); 1398extern int tcp_v4_gso_send_check(struct sk_buff *skb);
1407extern struct sk_buff *tcp_tso_segment(struct sk_buff *skb, int features); 1399extern struct sk_buff *tcp_tso_segment(struct sk_buff *skb, u32 features);
1408extern struct sk_buff **tcp_gro_receive(struct sk_buff **head, 1400extern struct sk_buff **tcp_gro_receive(struct sk_buff **head,
1409 struct sk_buff *skb); 1401 struct sk_buff *skb);
1410extern struct sk_buff **tcp4_gro_receive(struct sk_buff **head, 1402extern struct sk_buff **tcp4_gro_receive(struct sk_buff **head,
diff --git a/include/net/transp_v6.h b/include/net/transp_v6.h
index 42a0eb68b7b6..eeb077dd735f 100644
--- a/include/net/transp_v6.h
+++ b/include/net/transp_v6.h
@@ -14,7 +14,7 @@ extern struct proto udpv6_prot;
14extern struct proto udplitev6_prot; 14extern struct proto udplitev6_prot;
15extern struct proto tcpv6_prot; 15extern struct proto tcpv6_prot;
16 16
17struct flowi; 17struct flowi6;
18 18
19/* extention headers */ 19/* extention headers */
20extern int ipv6_exthdrs_init(void); 20extern int ipv6_exthdrs_init(void);
@@ -42,7 +42,7 @@ extern int datagram_recv_ctl(struct sock *sk,
42 42
43extern int datagram_send_ctl(struct net *net, 43extern int datagram_send_ctl(struct net *net,
44 struct msghdr *msg, 44 struct msghdr *msg,
45 struct flowi *fl, 45 struct flowi6 *fl6,
46 struct ipv6_txoptions *opt, 46 struct ipv6_txoptions *opt,
47 int *hlimit, int *tclass, 47 int *hlimit, int *tclass,
48 int *dontfrag); 48 int *dontfrag);
diff --git a/include/net/udp.h b/include/net/udp.h
index bb967dd59bf7..67ea6fcb3ec0 100644
--- a/include/net/udp.h
+++ b/include/net/udp.h
@@ -144,6 +144,17 @@ static inline __wsum udp_csum_outgoing(struct sock *sk, struct sk_buff *skb)
144 return csum; 144 return csum;
145} 145}
146 146
147static inline __wsum udp_csum(struct sk_buff *skb)
148{
149 __wsum csum = csum_partial(skb_transport_header(skb),
150 sizeof(struct udphdr), skb->csum);
151
152 for (skb = skb_shinfo(skb)->frag_list; skb; skb = skb->next) {
153 csum = csum_add(csum, skb->csum);
154 }
155 return csum;
156}
157
147/* hash routines shared between UDPv4/6 and UDP-Litev4/6 */ 158/* hash routines shared between UDPv4/6 and UDP-Litev4/6 */
148static inline void udp_lib_hash(struct sock *sk) 159static inline void udp_lib_hash(struct sock *sk)
149{ 160{
@@ -245,5 +256,5 @@ extern void udp4_proc_exit(void);
245extern void udp_init(void); 256extern void udp_init(void);
246 257
247extern int udp4_ufo_send_check(struct sk_buff *skb); 258extern int udp4_ufo_send_check(struct sk_buff *skb);
248extern struct sk_buff *udp4_ufo_fragment(struct sk_buff *skb, int features); 259extern struct sk_buff *udp4_ufo_fragment(struct sk_buff *skb, u32 features);
249#endif /* _UDP_H */ 260#endif /* _UDP_H */
diff --git a/include/net/udplite.h b/include/net/udplite.h
index afdffe607b24..673a024c6b2a 100644
--- a/include/net/udplite.h
+++ b/include/net/udplite.h
@@ -115,6 +115,18 @@ static inline __wsum udplite_csum_outgoing(struct sock *sk, struct sk_buff *skb)
115 return csum; 115 return csum;
116} 116}
117 117
118static inline __wsum udplite_csum(struct sk_buff *skb)
119{
120 struct sock *sk = skb->sk;
121 int cscov = udplite_sender_cscov(udp_sk(sk), udp_hdr(skb));
122 const int off = skb_transport_offset(skb);
123 const int len = skb->len - off;
124
125 skb->ip_summed = CHECKSUM_NONE; /* no HW support for checksumming */
126
127 return skb_checksum(skb, off, min(cscov, len), 0);
128}
129
118extern void udplite4_register(void); 130extern void udplite4_register(void);
119extern int udplite_get_port(struct sock *sk, unsigned short snum, 131extern int udplite_get_port(struct sock *sk, unsigned short snum,
120 int (*scmp)(const struct sock *, const struct sock *)); 132 int (*scmp)(const struct sock *, const struct sock *));
diff --git a/include/net/xfrm.h b/include/net/xfrm.h
index b9f385da758e..42a8c32a10e2 100644
--- a/include/net/xfrm.h
+++ b/include/net/xfrm.h
@@ -36,6 +36,7 @@
36#define XFRM_PROTO_ROUTING IPPROTO_ROUTING 36#define XFRM_PROTO_ROUTING IPPROTO_ROUTING
37#define XFRM_PROTO_DSTOPTS IPPROTO_DSTOPTS 37#define XFRM_PROTO_DSTOPTS IPPROTO_DSTOPTS
38 38
39#define XFRM_ALIGN4(len) (((len) + 3) & ~3)
39#define XFRM_ALIGN8(len) (((len) + 7) & ~7) 40#define XFRM_ALIGN8(len) (((len) + 7) & ~7)
40#define MODULE_ALIAS_XFRM_MODE(family, encap) \ 41#define MODULE_ALIAS_XFRM_MODE(family, encap) \
41 MODULE_ALIAS("xfrm-mode-" __stringify(family) "-" __stringify(encap)) 42 MODULE_ALIAS("xfrm-mode-" __stringify(family) "-" __stringify(encap))
@@ -185,9 +186,14 @@ struct xfrm_state {
185 186
186 /* State for replay detection */ 187 /* State for replay detection */
187 struct xfrm_replay_state replay; 188 struct xfrm_replay_state replay;
189 struct xfrm_replay_state_esn *replay_esn;
188 190
189 /* Replay detection state at the time we sent the last notification */ 191 /* Replay detection state at the time we sent the last notification */
190 struct xfrm_replay_state preplay; 192 struct xfrm_replay_state preplay;
193 struct xfrm_replay_state_esn *preplay_esn;
194
195 /* The functions for replay detection. */
196 struct xfrm_replay *repl;
191 197
192 /* internal flag that only holds state for delayed aevent at the 198 /* internal flag that only holds state for delayed aevent at the
193 * moment 199 * moment
@@ -258,6 +264,15 @@ struct km_event {
258 struct net *net; 264 struct net *net;
259}; 265};
260 266
267struct xfrm_replay {
268 void (*advance)(struct xfrm_state *x, __be32 net_seq);
269 int (*check)(struct xfrm_state *x,
270 struct sk_buff *skb,
271 __be32 net_seq);
272 void (*notify)(struct xfrm_state *x, int event);
273 int (*overflow)(struct xfrm_state *x, struct sk_buff *skb);
274};
275
261struct net_device; 276struct net_device;
262struct xfrm_type; 277struct xfrm_type;
263struct xfrm_dst; 278struct xfrm_dst;
@@ -266,25 +281,26 @@ struct xfrm_policy_afinfo {
266 struct dst_ops *dst_ops; 281 struct dst_ops *dst_ops;
267 void (*garbage_collect)(struct net *net); 282 void (*garbage_collect)(struct net *net);
268 struct dst_entry *(*dst_lookup)(struct net *net, int tos, 283 struct dst_entry *(*dst_lookup)(struct net *net, int tos,
269 xfrm_address_t *saddr, 284 const xfrm_address_t *saddr,
270 xfrm_address_t *daddr); 285 const xfrm_address_t *daddr);
271 int (*get_saddr)(struct net *net, xfrm_address_t *saddr, xfrm_address_t *daddr); 286 int (*get_saddr)(struct net *net, xfrm_address_t *saddr, xfrm_address_t *daddr);
272 void (*decode_session)(struct sk_buff *skb, 287 void (*decode_session)(struct sk_buff *skb,
273 struct flowi *fl, 288 struct flowi *fl,
274 int reverse); 289 int reverse);
275 int (*get_tos)(struct flowi *fl); 290 int (*get_tos)(const struct flowi *fl);
276 int (*init_path)(struct xfrm_dst *path, 291 int (*init_path)(struct xfrm_dst *path,
277 struct dst_entry *dst, 292 struct dst_entry *dst,
278 int nfheader_len); 293 int nfheader_len);
279 int (*fill_dst)(struct xfrm_dst *xdst, 294 int (*fill_dst)(struct xfrm_dst *xdst,
280 struct net_device *dev, 295 struct net_device *dev,
281 struct flowi *fl); 296 const struct flowi *fl);
297 struct dst_entry *(*blackhole_route)(struct net *net, struct dst_entry *orig);
282}; 298};
283 299
284extern int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo); 300extern int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo);
285extern int xfrm_policy_unregister_afinfo(struct xfrm_policy_afinfo *afinfo); 301extern int xfrm_policy_unregister_afinfo(struct xfrm_policy_afinfo *afinfo);
286extern void km_policy_notify(struct xfrm_policy *xp, int dir, struct km_event *c); 302extern void km_policy_notify(struct xfrm_policy *xp, int dir, const struct km_event *c);
287extern void km_state_notify(struct xfrm_state *x, struct km_event *c); 303extern void km_state_notify(struct xfrm_state *x, const struct km_event *c);
288 304
289struct xfrm_tmpl; 305struct xfrm_tmpl;
290extern int km_query(struct xfrm_state *x, struct xfrm_tmpl *t, struct xfrm_policy *pol); 306extern int km_query(struct xfrm_state *x, struct xfrm_tmpl *t, struct xfrm_policy *pol);
@@ -299,9 +315,12 @@ struct xfrm_state_afinfo {
299 const struct xfrm_type *type_map[IPPROTO_MAX]; 315 const struct xfrm_type *type_map[IPPROTO_MAX];
300 struct xfrm_mode *mode_map[XFRM_MODE_MAX]; 316 struct xfrm_mode *mode_map[XFRM_MODE_MAX];
301 int (*init_flags)(struct xfrm_state *x); 317 int (*init_flags)(struct xfrm_state *x);
302 void (*init_tempsel)(struct xfrm_selector *sel, struct flowi *fl); 318 void (*init_tempsel)(struct xfrm_selector *sel,
303 void (*init_temprop)(struct xfrm_state *x, struct xfrm_tmpl *tmpl, 319 const struct flowi *fl);
304 xfrm_address_t *daddr, xfrm_address_t *saddr); 320 void (*init_temprop)(struct xfrm_state *x,
321 const struct xfrm_tmpl *tmpl,
322 const xfrm_address_t *daddr,
323 const xfrm_address_t *saddr);
305 int (*tmpl_sort)(struct xfrm_tmpl **dst, struct xfrm_tmpl **src, int n); 324 int (*tmpl_sort)(struct xfrm_tmpl **dst, struct xfrm_tmpl **src, int n);
306 int (*state_sort)(struct xfrm_state **dst, struct xfrm_state **src, int n); 325 int (*state_sort)(struct xfrm_state **dst, struct xfrm_state **src, int n);
307 int (*output)(struct sk_buff *skb); 326 int (*output)(struct sk_buff *skb);
@@ -332,7 +351,8 @@ struct xfrm_type {
332 void (*destructor)(struct xfrm_state *); 351 void (*destructor)(struct xfrm_state *);
333 int (*input)(struct xfrm_state *, struct sk_buff *skb); 352 int (*input)(struct xfrm_state *, struct sk_buff *skb);
334 int (*output)(struct xfrm_state *, struct sk_buff *pskb); 353 int (*output)(struct xfrm_state *, struct sk_buff *pskb);
335 int (*reject)(struct xfrm_state *, struct sk_buff *, struct flowi *); 354 int (*reject)(struct xfrm_state *, struct sk_buff *,
355 const struct flowi *);
336 int (*hdr_offset)(struct xfrm_state *, struct sk_buff *, u8 **); 356 int (*hdr_offset)(struct xfrm_state *, struct sk_buff *, u8 **);
337 /* Estimate maximal size of result of transformation of a dgram */ 357 /* Estimate maximal size of result of transformation of a dgram */
338 u32 (*get_mtu)(struct xfrm_state *, int size); 358 u32 (*get_mtu)(struct xfrm_state *, int size);
@@ -501,7 +521,7 @@ struct xfrm_policy {
501 struct xfrm_tmpl xfrm_vec[XFRM_MAX_DEPTH]; 521 struct xfrm_tmpl xfrm_vec[XFRM_MAX_DEPTH];
502}; 522};
503 523
504static inline struct net *xp_net(struct xfrm_policy *xp) 524static inline struct net *xp_net(const struct xfrm_policy *xp)
505{ 525{
506 return read_pnet(&xp->xp_net); 526 return read_pnet(&xp->xp_net);
507} 527}
@@ -545,13 +565,17 @@ struct xfrm_migrate {
545struct xfrm_mgr { 565struct xfrm_mgr {
546 struct list_head list; 566 struct list_head list;
547 char *id; 567 char *id;
548 int (*notify)(struct xfrm_state *x, struct km_event *c); 568 int (*notify)(struct xfrm_state *x, const struct km_event *c);
549 int (*acquire)(struct xfrm_state *x, struct xfrm_tmpl *, struct xfrm_policy *xp, int dir); 569 int (*acquire)(struct xfrm_state *x, struct xfrm_tmpl *, struct xfrm_policy *xp, int dir);
550 struct xfrm_policy *(*compile_policy)(struct sock *sk, int opt, u8 *data, int len, int *dir); 570 struct xfrm_policy *(*compile_policy)(struct sock *sk, int opt, u8 *data, int len, int *dir);
551 int (*new_mapping)(struct xfrm_state *x, xfrm_address_t *ipaddr, __be16 sport); 571 int (*new_mapping)(struct xfrm_state *x, xfrm_address_t *ipaddr, __be16 sport);
552 int (*notify_policy)(struct xfrm_policy *x, int dir, struct km_event *c); 572 int (*notify_policy)(struct xfrm_policy *x, int dir, const struct km_event *c);
553 int (*report)(struct net *net, u8 proto, struct xfrm_selector *sel, xfrm_address_t *addr); 573 int (*report)(struct net *net, u8 proto, struct xfrm_selector *sel, xfrm_address_t *addr);
554 int (*migrate)(struct xfrm_selector *sel, u8 dir, u8 type, struct xfrm_migrate *m, int num_bundles, struct xfrm_kmaddress *k); 574 int (*migrate)(const struct xfrm_selector *sel,
575 u8 dir, u8 type,
576 const struct xfrm_migrate *m,
577 int num_bundles,
578 const struct xfrm_kmaddress *k);
555}; 579};
556 580
557extern int xfrm_register_km(struct xfrm_mgr *km); 581extern int xfrm_register_km(struct xfrm_mgr *km);
@@ -570,8 +594,14 @@ struct xfrm_skb_cb {
570 594
571 /* Sequence number for replay protection. */ 595 /* Sequence number for replay protection. */
572 union { 596 union {
573 u64 output; 597 struct {
574 __be32 input; 598 __u32 low;
599 __u32 hi;
600 } output;
601 struct {
602 __be32 low;
603 __be32 hi;
604 } input;
575 } seq; 605 } seq;
576}; 606};
577 607
@@ -675,6 +705,8 @@ extern void xfrm_audit_state_delete(struct xfrm_state *x, int result,
675 u32 auid, u32 ses, u32 secid); 705 u32 auid, u32 ses, u32 secid);
676extern void xfrm_audit_state_replay_overflow(struct xfrm_state *x, 706extern void xfrm_audit_state_replay_overflow(struct xfrm_state *x,
677 struct sk_buff *skb); 707 struct sk_buff *skb);
708extern void xfrm_audit_state_replay(struct xfrm_state *x,
709 struct sk_buff *skb, __be32 net_seq);
678extern void xfrm_audit_state_notfound_simple(struct sk_buff *skb, u16 family); 710extern void xfrm_audit_state_notfound_simple(struct sk_buff *skb, u16 family);
679extern void xfrm_audit_state_notfound(struct sk_buff *skb, u16 family, 711extern void xfrm_audit_state_notfound(struct sk_buff *skb, u16 family,
680 __be32 net_spi, __be32 net_seq); 712 __be32 net_spi, __be32 net_seq);
@@ -707,6 +739,11 @@ static inline void xfrm_audit_state_replay_overflow(struct xfrm_state *x,
707{ 739{
708} 740}
709 741
742static inline void xfrm_audit_state_replay(struct xfrm_state *x,
743 struct sk_buff *skb, __be32 net_seq)
744{
745}
746
710static inline void xfrm_audit_state_notfound_simple(struct sk_buff *skb, 747static inline void xfrm_audit_state_notfound_simple(struct sk_buff *skb,
711 u16 family) 748 u16 family)
712{ 749{
@@ -762,10 +799,11 @@ static inline void xfrm_state_hold(struct xfrm_state *x)
762 atomic_inc(&x->refcnt); 799 atomic_inc(&x->refcnt);
763} 800}
764 801
765static __inline__ int addr_match(void *token1, void *token2, int prefixlen) 802static inline bool addr_match(const void *token1, const void *token2,
803 int prefixlen)
766{ 804{
767 __be32 *a1 = token1; 805 const __be32 *a1 = token1;
768 __be32 *a2 = token2; 806 const __be32 *a2 = token2;
769 int pdw; 807 int pdw;
770 int pbi; 808 int pbi;
771 809
@@ -774,7 +812,7 @@ static __inline__ int addr_match(void *token1, void *token2, int prefixlen)
774 812
775 if (pdw) 813 if (pdw)
776 if (memcmp(a1, a2, pdw << 2)) 814 if (memcmp(a1, a2, pdw << 2))
777 return 0; 815 return false;
778 816
779 if (pbi) { 817 if (pbi) {
780 __be32 mask; 818 __be32 mask;
@@ -782,32 +820,32 @@ static __inline__ int addr_match(void *token1, void *token2, int prefixlen)
782 mask = htonl((0xffffffff) << (32 - pbi)); 820 mask = htonl((0xffffffff) << (32 - pbi));
783 821
784 if ((a1[pdw] ^ a2[pdw]) & mask) 822 if ((a1[pdw] ^ a2[pdw]) & mask)
785 return 0; 823 return false;
786 } 824 }
787 825
788 return 1; 826 return true;
789} 827}
790 828
791static __inline__ 829static __inline__
792__be16 xfrm_flowi_sport(struct flowi *fl) 830__be16 xfrm_flowi_sport(const struct flowi *fl, const union flowi_uli *uli)
793{ 831{
794 __be16 port; 832 __be16 port;
795 switch(fl->proto) { 833 switch(fl->flowi_proto) {
796 case IPPROTO_TCP: 834 case IPPROTO_TCP:
797 case IPPROTO_UDP: 835 case IPPROTO_UDP:
798 case IPPROTO_UDPLITE: 836 case IPPROTO_UDPLITE:
799 case IPPROTO_SCTP: 837 case IPPROTO_SCTP:
800 port = fl->fl_ip_sport; 838 port = uli->ports.sport;
801 break; 839 break;
802 case IPPROTO_ICMP: 840 case IPPROTO_ICMP:
803 case IPPROTO_ICMPV6: 841 case IPPROTO_ICMPV6:
804 port = htons(fl->fl_icmp_type); 842 port = htons(uli->icmpt.type);
805 break; 843 break;
806 case IPPROTO_MH: 844 case IPPROTO_MH:
807 port = htons(fl->fl_mh_type); 845 port = htons(uli->mht.type);
808 break; 846 break;
809 case IPPROTO_GRE: 847 case IPPROTO_GRE:
810 port = htons(ntohl(fl->fl_gre_key) >> 16); 848 port = htons(ntohl(uli->gre_key) >> 16);
811 break; 849 break;
812 default: 850 default:
813 port = 0; /*XXX*/ 851 port = 0; /*XXX*/
@@ -816,22 +854,22 @@ __be16 xfrm_flowi_sport(struct flowi *fl)
816} 854}
817 855
818static __inline__ 856static __inline__
819__be16 xfrm_flowi_dport(struct flowi *fl) 857__be16 xfrm_flowi_dport(const struct flowi *fl, const union flowi_uli *uli)
820{ 858{
821 __be16 port; 859 __be16 port;
822 switch(fl->proto) { 860 switch(fl->flowi_proto) {
823 case IPPROTO_TCP: 861 case IPPROTO_TCP:
824 case IPPROTO_UDP: 862 case IPPROTO_UDP:
825 case IPPROTO_UDPLITE: 863 case IPPROTO_UDPLITE:
826 case IPPROTO_SCTP: 864 case IPPROTO_SCTP:
827 port = fl->fl_ip_dport; 865 port = uli->ports.dport;
828 break; 866 break;
829 case IPPROTO_ICMP: 867 case IPPROTO_ICMP:
830 case IPPROTO_ICMPV6: 868 case IPPROTO_ICMPV6:
831 port = htons(fl->fl_icmp_code); 869 port = htons(uli->icmpt.code);
832 break; 870 break;
833 case IPPROTO_GRE: 871 case IPPROTO_GRE:
834 port = htons(ntohl(fl->fl_gre_key) & 0xffff); 872 port = htons(ntohl(uli->gre_key) & 0xffff);
835 break; 873 break;
836 default: 874 default:
837 port = 0; /*XXX*/ 875 port = 0; /*XXX*/
@@ -839,7 +877,8 @@ __be16 xfrm_flowi_dport(struct flowi *fl)
839 return port; 877 return port;
840} 878}
841 879
842extern int xfrm_selector_match(struct xfrm_selector *sel, struct flowi *fl, 880extern int xfrm_selector_match(const struct xfrm_selector *sel,
881 const struct flowi *fl,
843 unsigned short family); 882 unsigned short family);
844 883
845#ifdef CONFIG_SECURITY_NETWORK_XFRM 884#ifdef CONFIG_SECURITY_NETWORK_XFRM
@@ -947,7 +986,7 @@ secpath_reset(struct sk_buff *skb)
947} 986}
948 987
949static inline int 988static inline int
950xfrm_addr_any(xfrm_address_t *addr, unsigned short family) 989xfrm_addr_any(const xfrm_address_t *addr, unsigned short family)
951{ 990{
952 switch (family) { 991 switch (family) {
953 case AF_INET: 992 case AF_INET:
@@ -959,21 +998,21 @@ xfrm_addr_any(xfrm_address_t *addr, unsigned short family)
959} 998}
960 999
961static inline int 1000static inline int
962__xfrm4_state_addr_cmp(struct xfrm_tmpl *tmpl, struct xfrm_state *x) 1001__xfrm4_state_addr_cmp(const struct xfrm_tmpl *tmpl, const struct xfrm_state *x)
963{ 1002{
964 return (tmpl->saddr.a4 && 1003 return (tmpl->saddr.a4 &&
965 tmpl->saddr.a4 != x->props.saddr.a4); 1004 tmpl->saddr.a4 != x->props.saddr.a4);
966} 1005}
967 1006
968static inline int 1007static inline int
969__xfrm6_state_addr_cmp(struct xfrm_tmpl *tmpl, struct xfrm_state *x) 1008__xfrm6_state_addr_cmp(const struct xfrm_tmpl *tmpl, const struct xfrm_state *x)
970{ 1009{
971 return (!ipv6_addr_any((struct in6_addr*)&tmpl->saddr) && 1010 return (!ipv6_addr_any((struct in6_addr*)&tmpl->saddr) &&
972 ipv6_addr_cmp((struct in6_addr *)&tmpl->saddr, (struct in6_addr*)&x->props.saddr)); 1011 ipv6_addr_cmp((struct in6_addr *)&tmpl->saddr, (struct in6_addr*)&x->props.saddr));
973} 1012}
974 1013
975static inline int 1014static inline int
976xfrm_state_addr_cmp(struct xfrm_tmpl *tmpl, struct xfrm_state *x, unsigned short family) 1015xfrm_state_addr_cmp(const struct xfrm_tmpl *tmpl, const struct xfrm_state *x, unsigned short family)
977{ 1016{
978 switch (family) { 1017 switch (family) {
979 case AF_INET: 1018 case AF_INET:
@@ -1126,49 +1165,49 @@ static inline int xfrm6_policy_check_reverse(struct sock *sk, int dir,
1126#endif 1165#endif
1127 1166
1128static __inline__ 1167static __inline__
1129xfrm_address_t *xfrm_flowi_daddr(struct flowi *fl, unsigned short family) 1168xfrm_address_t *xfrm_flowi_daddr(const struct flowi *fl, unsigned short family)
1130{ 1169{
1131 switch (family){ 1170 switch (family){
1132 case AF_INET: 1171 case AF_INET:
1133 return (xfrm_address_t *)&fl->fl4_dst; 1172 return (xfrm_address_t *)&fl->u.ip4.daddr;
1134 case AF_INET6: 1173 case AF_INET6:
1135 return (xfrm_address_t *)&fl->fl6_dst; 1174 return (xfrm_address_t *)&fl->u.ip6.daddr;
1136 } 1175 }
1137 return NULL; 1176 return NULL;
1138} 1177}
1139 1178
1140static __inline__ 1179static __inline__
1141xfrm_address_t *xfrm_flowi_saddr(struct flowi *fl, unsigned short family) 1180xfrm_address_t *xfrm_flowi_saddr(const struct flowi *fl, unsigned short family)
1142{ 1181{
1143 switch (family){ 1182 switch (family){
1144 case AF_INET: 1183 case AF_INET:
1145 return (xfrm_address_t *)&fl->fl4_src; 1184 return (xfrm_address_t *)&fl->u.ip4.saddr;
1146 case AF_INET6: 1185 case AF_INET6:
1147 return (xfrm_address_t *)&fl->fl6_src; 1186 return (xfrm_address_t *)&fl->u.ip6.saddr;
1148 } 1187 }
1149 return NULL; 1188 return NULL;
1150} 1189}
1151 1190
1152static __inline__ 1191static __inline__
1153void xfrm_flowi_addr_get(struct flowi *fl, 1192void xfrm_flowi_addr_get(const struct flowi *fl,
1154 xfrm_address_t *saddr, xfrm_address_t *daddr, 1193 xfrm_address_t *saddr, xfrm_address_t *daddr,
1155 unsigned short family) 1194 unsigned short family)
1156{ 1195{
1157 switch(family) { 1196 switch(family) {
1158 case AF_INET: 1197 case AF_INET:
1159 memcpy(&saddr->a4, &fl->fl4_src, sizeof(saddr->a4)); 1198 memcpy(&saddr->a4, &fl->u.ip4.saddr, sizeof(saddr->a4));
1160 memcpy(&daddr->a4, &fl->fl4_dst, sizeof(daddr->a4)); 1199 memcpy(&daddr->a4, &fl->u.ip4.daddr, sizeof(daddr->a4));
1161 break; 1200 break;
1162 case AF_INET6: 1201 case AF_INET6:
1163 ipv6_addr_copy((struct in6_addr *)&saddr->a6, &fl->fl6_src); 1202 ipv6_addr_copy((struct in6_addr *)&saddr->a6, &fl->u.ip6.saddr);
1164 ipv6_addr_copy((struct in6_addr *)&daddr->a6, &fl->fl6_dst); 1203 ipv6_addr_copy((struct in6_addr *)&daddr->a6, &fl->u.ip6.daddr);
1165 break; 1204 break;
1166 } 1205 }
1167} 1206}
1168 1207
1169static __inline__ int 1208static __inline__ int
1170__xfrm4_state_addr_check(struct xfrm_state *x, 1209__xfrm4_state_addr_check(const struct xfrm_state *x,
1171 xfrm_address_t *daddr, xfrm_address_t *saddr) 1210 const xfrm_address_t *daddr, const xfrm_address_t *saddr)
1172{ 1211{
1173 if (daddr->a4 == x->id.daddr.a4 && 1212 if (daddr->a4 == x->id.daddr.a4 &&
1174 (saddr->a4 == x->props.saddr.a4 || !saddr->a4 || !x->props.saddr.a4)) 1213 (saddr->a4 == x->props.saddr.a4 || !saddr->a4 || !x->props.saddr.a4))
@@ -1177,8 +1216,8 @@ __xfrm4_state_addr_check(struct xfrm_state *x,
1177} 1216}
1178 1217
1179static __inline__ int 1218static __inline__ int
1180__xfrm6_state_addr_check(struct xfrm_state *x, 1219__xfrm6_state_addr_check(const struct xfrm_state *x,
1181 xfrm_address_t *daddr, xfrm_address_t *saddr) 1220 const xfrm_address_t *daddr, const xfrm_address_t *saddr)
1182{ 1221{
1183 if (!ipv6_addr_cmp((struct in6_addr *)daddr, (struct in6_addr *)&x->id.daddr) && 1222 if (!ipv6_addr_cmp((struct in6_addr *)daddr, (struct in6_addr *)&x->id.daddr) &&
1184 (!ipv6_addr_cmp((struct in6_addr *)saddr, (struct in6_addr *)&x->props.saddr)|| 1223 (!ipv6_addr_cmp((struct in6_addr *)saddr, (struct in6_addr *)&x->props.saddr)||
@@ -1189,8 +1228,8 @@ __xfrm6_state_addr_check(struct xfrm_state *x,
1189} 1228}
1190 1229
1191static __inline__ int 1230static __inline__ int
1192xfrm_state_addr_check(struct xfrm_state *x, 1231xfrm_state_addr_check(const struct xfrm_state *x,
1193 xfrm_address_t *daddr, xfrm_address_t *saddr, 1232 const xfrm_address_t *daddr, const xfrm_address_t *saddr,
1194 unsigned short family) 1233 unsigned short family)
1195{ 1234{
1196 switch (family) { 1235 switch (family) {
@@ -1203,23 +1242,23 @@ xfrm_state_addr_check(struct xfrm_state *x,
1203} 1242}
1204 1243
1205static __inline__ int 1244static __inline__ int
1206xfrm_state_addr_flow_check(struct xfrm_state *x, struct flowi *fl, 1245xfrm_state_addr_flow_check(const struct xfrm_state *x, const struct flowi *fl,
1207 unsigned short family) 1246 unsigned short family)
1208{ 1247{
1209 switch (family) { 1248 switch (family) {
1210 case AF_INET: 1249 case AF_INET:
1211 return __xfrm4_state_addr_check(x, 1250 return __xfrm4_state_addr_check(x,
1212 (xfrm_address_t *)&fl->fl4_dst, 1251 (const xfrm_address_t *)&fl->u.ip4.daddr,
1213 (xfrm_address_t *)&fl->fl4_src); 1252 (const xfrm_address_t *)&fl->u.ip4.saddr);
1214 case AF_INET6: 1253 case AF_INET6:
1215 return __xfrm6_state_addr_check(x, 1254 return __xfrm6_state_addr_check(x,
1216 (xfrm_address_t *)&fl->fl6_dst, 1255 (const xfrm_address_t *)&fl->u.ip6.daddr,
1217 (xfrm_address_t *)&fl->fl6_src); 1256 (const xfrm_address_t *)&fl->u.ip6.saddr);
1218 } 1257 }
1219 return 0; 1258 return 0;
1220} 1259}
1221 1260
1222static inline int xfrm_state_kern(struct xfrm_state *x) 1261static inline int xfrm_state_kern(const struct xfrm_state *x)
1223{ 1262{
1224 return atomic_read(&x->tunnel_users); 1263 return atomic_read(&x->tunnel_users);
1225} 1264}
@@ -1323,8 +1362,10 @@ extern int xfrm_state_walk(struct net *net, struct xfrm_state_walk *walk,
1323 int (*func)(struct xfrm_state *, int, void*), void *); 1362 int (*func)(struct xfrm_state *, int, void*), void *);
1324extern void xfrm_state_walk_done(struct xfrm_state_walk *walk); 1363extern void xfrm_state_walk_done(struct xfrm_state_walk *walk);
1325extern struct xfrm_state *xfrm_state_alloc(struct net *net); 1364extern struct xfrm_state *xfrm_state_alloc(struct net *net);
1326extern struct xfrm_state *xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr, 1365extern struct xfrm_state *xfrm_state_find(const xfrm_address_t *daddr,
1327 struct flowi *fl, struct xfrm_tmpl *tmpl, 1366 const xfrm_address_t *saddr,
1367 const struct flowi *fl,
1368 struct xfrm_tmpl *tmpl,
1328 struct xfrm_policy *pol, int *err, 1369 struct xfrm_policy *pol, int *err,
1329 unsigned short family); 1370 unsigned short family);
1330extern struct xfrm_state *xfrm_stateonly_find(struct net *net, u32 mark, 1371extern struct xfrm_state *xfrm_stateonly_find(struct net *net, u32 mark,
@@ -1337,11 +1378,11 @@ extern void xfrm_state_insert(struct xfrm_state *x);
1337extern int xfrm_state_add(struct xfrm_state *x); 1378extern int xfrm_state_add(struct xfrm_state *x);
1338extern int xfrm_state_update(struct xfrm_state *x); 1379extern int xfrm_state_update(struct xfrm_state *x);
1339extern struct xfrm_state *xfrm_state_lookup(struct net *net, u32 mark, 1380extern struct xfrm_state *xfrm_state_lookup(struct net *net, u32 mark,
1340 xfrm_address_t *daddr, __be32 spi, 1381 const xfrm_address_t *daddr, __be32 spi,
1341 u8 proto, unsigned short family); 1382 u8 proto, unsigned short family);
1342extern struct xfrm_state *xfrm_state_lookup_byaddr(struct net *net, u32 mark, 1383extern struct xfrm_state *xfrm_state_lookup_byaddr(struct net *net, u32 mark,
1343 xfrm_address_t *daddr, 1384 const xfrm_address_t *daddr,
1344 xfrm_address_t *saddr, 1385 const xfrm_address_t *saddr,
1345 u8 proto, 1386 u8 proto,
1346 unsigned short family); 1387 unsigned short family);
1347#ifdef CONFIG_XFRM_SUB_POLICY 1388#ifdef CONFIG_XFRM_SUB_POLICY
@@ -1386,10 +1427,8 @@ extern int xfrm_state_delete(struct xfrm_state *x);
1386extern int xfrm_state_flush(struct net *net, u8 proto, struct xfrm_audit *audit_info); 1427extern int xfrm_state_flush(struct net *net, u8 proto, struct xfrm_audit *audit_info);
1387extern void xfrm_sad_getinfo(struct net *net, struct xfrmk_sadinfo *si); 1428extern void xfrm_sad_getinfo(struct net *net, struct xfrmk_sadinfo *si);
1388extern void xfrm_spd_getinfo(struct net *net, struct xfrmk_spdinfo *si); 1429extern void xfrm_spd_getinfo(struct net *net, struct xfrmk_spdinfo *si);
1389extern int xfrm_replay_check(struct xfrm_state *x, 1430extern u32 xfrm_replay_seqhi(struct xfrm_state *x, __be32 net_seq);
1390 struct sk_buff *skb, __be32 seq); 1431extern int xfrm_init_replay(struct xfrm_state *x);
1391extern void xfrm_replay_advance(struct xfrm_state *x, __be32 seq);
1392extern void xfrm_replay_notify(struct xfrm_state *x, int event);
1393extern int xfrm_state_mtu(struct xfrm_state *x, int mtu); 1432extern int xfrm_state_mtu(struct xfrm_state *x, int mtu);
1394extern int xfrm_init_state(struct xfrm_state *x); 1433extern int xfrm_init_state(struct xfrm_state *x);
1395extern int xfrm_prepare_input(struct xfrm_state *x, struct sk_buff *skb); 1434extern int xfrm_prepare_input(struct xfrm_state *x, struct sk_buff *skb);
@@ -1468,19 +1507,19 @@ u32 xfrm_get_acqseq(void);
1468extern int xfrm_alloc_spi(struct xfrm_state *x, u32 minspi, u32 maxspi); 1507extern int xfrm_alloc_spi(struct xfrm_state *x, u32 minspi, u32 maxspi);
1469struct xfrm_state *xfrm_find_acq(struct net *net, struct xfrm_mark *mark, 1508struct xfrm_state *xfrm_find_acq(struct net *net, struct xfrm_mark *mark,
1470 u8 mode, u32 reqid, u8 proto, 1509 u8 mode, u32 reqid, u8 proto,
1471 xfrm_address_t *daddr, 1510 const xfrm_address_t *daddr,
1472 xfrm_address_t *saddr, int create, 1511 const xfrm_address_t *saddr, int create,
1473 unsigned short family); 1512 unsigned short family);
1474extern int xfrm_sk_policy_insert(struct sock *sk, int dir, struct xfrm_policy *pol); 1513extern int xfrm_sk_policy_insert(struct sock *sk, int dir, struct xfrm_policy *pol);
1475 1514
1476#ifdef CONFIG_XFRM_MIGRATE 1515#ifdef CONFIG_XFRM_MIGRATE
1477extern int km_migrate(struct xfrm_selector *sel, u8 dir, u8 type, 1516extern int km_migrate(const struct xfrm_selector *sel, u8 dir, u8 type,
1478 struct xfrm_migrate *m, int num_bundles, 1517 const struct xfrm_migrate *m, int num_bundles,
1479 struct xfrm_kmaddress *k); 1518 const struct xfrm_kmaddress *k);
1480extern struct xfrm_state * xfrm_migrate_state_find(struct xfrm_migrate *m); 1519extern struct xfrm_state * xfrm_migrate_state_find(struct xfrm_migrate *m);
1481extern struct xfrm_state * xfrm_state_migrate(struct xfrm_state *x, 1520extern struct xfrm_state * xfrm_state_migrate(struct xfrm_state *x,
1482 struct xfrm_migrate *m); 1521 struct xfrm_migrate *m);
1483extern int xfrm_migrate(struct xfrm_selector *sel, u8 dir, u8 type, 1522extern int xfrm_migrate(const struct xfrm_selector *sel, u8 dir, u8 type,
1484 struct xfrm_migrate *m, int num_bundles, 1523 struct xfrm_migrate *m, int num_bundles,
1485 struct xfrm_kmaddress *k); 1524 struct xfrm_kmaddress *k);
1486#endif 1525#endif
@@ -1500,10 +1539,10 @@ extern struct xfrm_algo_desc *xfrm_ealg_get_byidx(unsigned int idx);
1500extern struct xfrm_algo_desc *xfrm_aalg_get_byid(int alg_id); 1539extern struct xfrm_algo_desc *xfrm_aalg_get_byid(int alg_id);
1501extern struct xfrm_algo_desc *xfrm_ealg_get_byid(int alg_id); 1540extern struct xfrm_algo_desc *xfrm_ealg_get_byid(int alg_id);
1502extern struct xfrm_algo_desc *xfrm_calg_get_byid(int alg_id); 1541extern struct xfrm_algo_desc *xfrm_calg_get_byid(int alg_id);
1503extern struct xfrm_algo_desc *xfrm_aalg_get_byname(char *name, int probe); 1542extern struct xfrm_algo_desc *xfrm_aalg_get_byname(const char *name, int probe);
1504extern struct xfrm_algo_desc *xfrm_ealg_get_byname(char *name, int probe); 1543extern struct xfrm_algo_desc *xfrm_ealg_get_byname(const char *name, int probe);
1505extern struct xfrm_algo_desc *xfrm_calg_get_byname(char *name, int probe); 1544extern struct xfrm_algo_desc *xfrm_calg_get_byname(const char *name, int probe);
1506extern struct xfrm_algo_desc *xfrm_aead_get_byname(char *name, int icv_len, 1545extern struct xfrm_algo_desc *xfrm_aead_get_byname(const char *name, int icv_len,
1507 int probe); 1546 int probe);
1508 1547
1509struct hash_desc; 1548struct hash_desc;
@@ -1511,7 +1550,8 @@ struct scatterlist;
1511typedef int (icv_update_fn_t)(struct hash_desc *, struct scatterlist *, 1550typedef int (icv_update_fn_t)(struct hash_desc *, struct scatterlist *,
1512 unsigned int); 1551 unsigned int);
1513 1552
1514static inline int xfrm_addr_cmp(xfrm_address_t *a, xfrm_address_t *b, 1553static inline int xfrm_addr_cmp(const xfrm_address_t *a,
1554 const xfrm_address_t *b,
1515 int family) 1555 int family)
1516{ 1556{
1517 switch (family) { 1557 switch (family) {
@@ -1544,16 +1584,21 @@ static inline int xfrm_aevent_is_on(struct net *net)
1544} 1584}
1545#endif 1585#endif
1546 1586
1547static inline int xfrm_alg_len(struct xfrm_algo *alg) 1587static inline int xfrm_alg_len(const struct xfrm_algo *alg)
1548{ 1588{
1549 return sizeof(*alg) + ((alg->alg_key_len + 7) / 8); 1589 return sizeof(*alg) + ((alg->alg_key_len + 7) / 8);
1550} 1590}
1551 1591
1552static inline int xfrm_alg_auth_len(struct xfrm_algo_auth *alg) 1592static inline int xfrm_alg_auth_len(const struct xfrm_algo_auth *alg)
1553{ 1593{
1554 return sizeof(*alg) + ((alg->alg_key_len + 7) / 8); 1594 return sizeof(*alg) + ((alg->alg_key_len + 7) / 8);
1555} 1595}
1556 1596
1597static inline int xfrm_replay_state_esn_len(struct xfrm_replay_state_esn *replay_esn)
1598{
1599 return sizeof(*replay_esn) + replay_esn->bmp_len * sizeof(__u32);
1600}
1601
1557#ifdef CONFIG_XFRM_MIGRATE 1602#ifdef CONFIG_XFRM_MIGRATE
1558static inline struct xfrm_algo *xfrm_algo_clone(struct xfrm_algo *orig) 1603static inline struct xfrm_algo *xfrm_algo_clone(struct xfrm_algo *orig)
1559{ 1604{
@@ -1597,7 +1642,7 @@ static inline int xfrm_mark_get(struct nlattr **attrs, struct xfrm_mark *m)
1597 return m->v & m->m; 1642 return m->v & m->m;
1598} 1643}
1599 1644
1600static inline int xfrm_mark_put(struct sk_buff *skb, struct xfrm_mark *m) 1645static inline int xfrm_mark_put(struct sk_buff *skb, const struct xfrm_mark *m)
1601{ 1646{
1602 if (m->m | m->v) 1647 if (m->m | m->v)
1603 NLA_PUT(skb, XFRMA_MARK, sizeof(struct xfrm_mark), m); 1648 NLA_PUT(skb, XFRMA_MARK, sizeof(struct xfrm_mark), m);
diff --git a/include/xen/events.h b/include/xen/events.h
index 962da2ced5b4..d3b9010ee96a 100644
--- a/include/xen/events.h
+++ b/include/xen/events.h
@@ -23,6 +23,12 @@ int bind_ipi_to_irqhandler(enum ipi_vector ipi,
23 unsigned long irqflags, 23 unsigned long irqflags,
24 const char *devname, 24 const char *devname,
25 void *dev_id); 25 void *dev_id);
26int bind_interdomain_evtchn_to_irqhandler(unsigned int remote_domain,
27 unsigned int remote_port,
28 irq_handler_t handler,
29 unsigned long irqflags,
30 const char *devname,
31 void *dev_id);
26 32
27/* 33/*
28 * Common unbind function for all event sources. Takes IRQ to unbind from. 34 * Common unbind function for all event sources. Takes IRQ to unbind from.
diff --git a/include/xen/interface/io/netif.h b/include/xen/interface/io/netif.h
index 518481c95f18..cb94668f6e9f 100644
--- a/include/xen/interface/io/netif.h
+++ b/include/xen/interface/io/netif.h
@@ -22,50 +22,50 @@
22 22
23/* 23/*
24 * This is the 'wire' format for packets: 24 * This is the 'wire' format for packets:
25 * Request 1: netif_tx_request -- NETTXF_* (any flags) 25 * Request 1: xen_netif_tx_request -- XEN_NETTXF_* (any flags)
26 * [Request 2: netif_tx_extra] (only if request 1 has NETTXF_extra_info) 26 * [Request 2: xen_netif_extra_info] (only if request 1 has XEN_NETTXF_extra_info)
27 * [Request 3: netif_tx_extra] (only if request 2 has XEN_NETIF_EXTRA_MORE) 27 * [Request 3: xen_netif_extra_info] (only if request 2 has XEN_NETIF_EXTRA_MORE)
28 * Request 4: netif_tx_request -- NETTXF_more_data 28 * Request 4: xen_netif_tx_request -- XEN_NETTXF_more_data
29 * Request 5: netif_tx_request -- NETTXF_more_data 29 * Request 5: xen_netif_tx_request -- XEN_NETTXF_more_data
30 * ... 30 * ...
31 * Request N: netif_tx_request -- 0 31 * Request N: xen_netif_tx_request -- 0
32 */ 32 */
33 33
34/* Protocol checksum field is blank in the packet (hardware offload)? */ 34/* Protocol checksum field is blank in the packet (hardware offload)? */
35#define _NETTXF_csum_blank (0) 35#define _XEN_NETTXF_csum_blank (0)
36#define NETTXF_csum_blank (1U<<_NETTXF_csum_blank) 36#define XEN_NETTXF_csum_blank (1U<<_XEN_NETTXF_csum_blank)
37 37
38/* Packet data has been validated against protocol checksum. */ 38/* Packet data has been validated against protocol checksum. */
39#define _NETTXF_data_validated (1) 39#define _XEN_NETTXF_data_validated (1)
40#define NETTXF_data_validated (1U<<_NETTXF_data_validated) 40#define XEN_NETTXF_data_validated (1U<<_XEN_NETTXF_data_validated)
41 41
42/* Packet continues in the next request descriptor. */ 42/* Packet continues in the next request descriptor. */
43#define _NETTXF_more_data (2) 43#define _XEN_NETTXF_more_data (2)
44#define NETTXF_more_data (1U<<_NETTXF_more_data) 44#define XEN_NETTXF_more_data (1U<<_XEN_NETTXF_more_data)
45 45
46/* Packet to be followed by extra descriptor(s). */ 46/* Packet to be followed by extra descriptor(s). */
47#define _NETTXF_extra_info (3) 47#define _XEN_NETTXF_extra_info (3)
48#define NETTXF_extra_info (1U<<_NETTXF_extra_info) 48#define XEN_NETTXF_extra_info (1U<<_XEN_NETTXF_extra_info)
49 49
50struct xen_netif_tx_request { 50struct xen_netif_tx_request {
51 grant_ref_t gref; /* Reference to buffer page */ 51 grant_ref_t gref; /* Reference to buffer page */
52 uint16_t offset; /* Offset within buffer page */ 52 uint16_t offset; /* Offset within buffer page */
53 uint16_t flags; /* NETTXF_* */ 53 uint16_t flags; /* XEN_NETTXF_* */
54 uint16_t id; /* Echoed in response message. */ 54 uint16_t id; /* Echoed in response message. */
55 uint16_t size; /* Packet size in bytes. */ 55 uint16_t size; /* Packet size in bytes. */
56}; 56};
57 57
58/* Types of netif_extra_info descriptors. */ 58/* Types of xen_netif_extra_info descriptors. */
59#define XEN_NETIF_EXTRA_TYPE_NONE (0) /* Never used - invalid */ 59#define XEN_NETIF_EXTRA_TYPE_NONE (0) /* Never used - invalid */
60#define XEN_NETIF_EXTRA_TYPE_GSO (1) /* u.gso */ 60#define XEN_NETIF_EXTRA_TYPE_GSO (1) /* u.gso */
61#define XEN_NETIF_EXTRA_TYPE_MAX (2) 61#define XEN_NETIF_EXTRA_TYPE_MAX (2)
62 62
63/* netif_extra_info flags. */ 63/* xen_netif_extra_info flags. */
64#define _XEN_NETIF_EXTRA_FLAG_MORE (0) 64#define _XEN_NETIF_EXTRA_FLAG_MORE (0)
65#define XEN_NETIF_EXTRA_FLAG_MORE (1U<<_XEN_NETIF_EXTRA_FLAG_MORE) 65#define XEN_NETIF_EXTRA_FLAG_MORE (1U<<_XEN_NETIF_EXTRA_FLAG_MORE)
66 66
67/* GSO types - only TCPv4 currently supported. */ 67/* GSO types - only TCPv4 currently supported. */
68#define XEN_NETIF_GSO_TYPE_TCPV4 (1) 68#define XEN_NETIF_GSO_TYPE_TCPV4 (1)
69 69
70/* 70/*
71 * This structure needs to fit within both netif_tx_request and 71 * This structure needs to fit within both netif_tx_request and
@@ -107,7 +107,7 @@ struct xen_netif_extra_info {
107 107
108struct xen_netif_tx_response { 108struct xen_netif_tx_response {
109 uint16_t id; 109 uint16_t id;
110 int16_t status; /* NETIF_RSP_* */ 110 int16_t status; /* XEN_NETIF_RSP_* */
111}; 111};
112 112
113struct xen_netif_rx_request { 113struct xen_netif_rx_request {
@@ -116,25 +116,29 @@ struct xen_netif_rx_request {
116}; 116};
117 117
118/* Packet data has been validated against protocol checksum. */ 118/* Packet data has been validated against protocol checksum. */
119#define _NETRXF_data_validated (0) 119#define _XEN_NETRXF_data_validated (0)
120#define NETRXF_data_validated (1U<<_NETRXF_data_validated) 120#define XEN_NETRXF_data_validated (1U<<_XEN_NETRXF_data_validated)
121 121
122/* Protocol checksum field is blank in the packet (hardware offload)? */ 122/* Protocol checksum field is blank in the packet (hardware offload)? */
123#define _NETRXF_csum_blank (1) 123#define _XEN_NETRXF_csum_blank (1)
124#define NETRXF_csum_blank (1U<<_NETRXF_csum_blank) 124#define XEN_NETRXF_csum_blank (1U<<_XEN_NETRXF_csum_blank)
125 125
126/* Packet continues in the next request descriptor. */ 126/* Packet continues in the next request descriptor. */
127#define _NETRXF_more_data (2) 127#define _XEN_NETRXF_more_data (2)
128#define NETRXF_more_data (1U<<_NETRXF_more_data) 128#define XEN_NETRXF_more_data (1U<<_XEN_NETRXF_more_data)
129 129
130/* Packet to be followed by extra descriptor(s). */ 130/* Packet to be followed by extra descriptor(s). */
131#define _NETRXF_extra_info (3) 131#define _XEN_NETRXF_extra_info (3)
132#define NETRXF_extra_info (1U<<_NETRXF_extra_info) 132#define XEN_NETRXF_extra_info (1U<<_XEN_NETRXF_extra_info)
133
134/* GSO Prefix descriptor. */
135#define _XEN_NETRXF_gso_prefix (4)
136#define XEN_NETRXF_gso_prefix (1U<<_XEN_NETRXF_gso_prefix)
133 137
134struct xen_netif_rx_response { 138struct xen_netif_rx_response {
135 uint16_t id; 139 uint16_t id;
136 uint16_t offset; /* Offset in page of start of received packet */ 140 uint16_t offset; /* Offset in page of start of received packet */
137 uint16_t flags; /* NETRXF_* */ 141 uint16_t flags; /* XEN_NETRXF_* */
138 int16_t status; /* -ve: BLKIF_RSP_* ; +ve: Rx'ed pkt size. */ 142 int16_t status; /* -ve: BLKIF_RSP_* ; +ve: Rx'ed pkt size. */
139}; 143};
140 144
@@ -149,10 +153,10 @@ DEFINE_RING_TYPES(xen_netif_rx,
149 struct xen_netif_rx_request, 153 struct xen_netif_rx_request,
150 struct xen_netif_rx_response); 154 struct xen_netif_rx_response);
151 155
152#define NETIF_RSP_DROPPED -2 156#define XEN_NETIF_RSP_DROPPED -2
153#define NETIF_RSP_ERROR -1 157#define XEN_NETIF_RSP_ERROR -1
154#define NETIF_RSP_OKAY 0 158#define XEN_NETIF_RSP_OKAY 0
155/* No response: used for auxiliary requests (e.g., netif_tx_extra). */ 159/* No response: used for auxiliary requests (e.g., xen_netif_extra_info). */
156#define NETIF_RSP_NULL 1 160#define XEN_NETIF_RSP_NULL 1
157 161
158#endif 162#endif