diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-03-16 19:29:25 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-03-16 19:29:25 -0400 |
commit | 7a6362800cb7d1d618a697a650c7aaed3eb39320 (patch) | |
tree | 087f9bc6c13ef1fad4b392c5cf9325cd28fa8523 /include/linux | |
parent | 6445ced8670f37cfc2c5e24a9de9b413dbfc788d (diff) | |
parent | ceda86a108671294052cbf51660097b6534672f5 (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/linux')
88 files changed, 3018 insertions, 260 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 | */ | ||
22 | struct 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 | |||
32 | extern 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 | */ | ||
38 | static inline void free_cpu_rmap(struct cpu_rmap *rmap) | ||
39 | { | ||
40 | kfree(rmap); | ||
41 | } | ||
42 | |||
43 | extern int cpu_rmap_add(struct cpu_rmap *rmap, void *obj); | ||
44 | extern int cpu_rmap_update(struct cpu_rmap *rmap, u16 index, | ||
45 | const struct cpumask *affinity); | ||
46 | |||
47 | static inline u16 cpu_rmap_lookup_index(struct cpu_rmap *rmap, unsigned int cpu) | ||
48 | { | ||
49 | return rmap->near[cpu].index; | ||
50 | } | ||
51 | |||
52 | static 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 | */ | ||
65 | static inline struct cpu_rmap *alloc_irq_cpu_rmap(unsigned int size) | ||
66 | { | ||
67 | return alloc_cpu_rmap(size, GFP_KERNEL); | ||
68 | } | ||
69 | extern void free_irq_cpu_rmap(struct cpu_rmap *rmap); | ||
70 | |||
71 | extern 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 | */ | ||
104 | struct 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 | */ | ||
121 | struct 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 | */ | ||
166 | struct dcb_peer_app_info { | ||
167 | __u8 willing; | ||
168 | __u8 error; | ||
169 | }; | ||
170 | |||
108 | struct dcbmsg { | 171 | struct 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 | */ |
143 | enum dcbnl_commands { | 207 | enum 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 | */ |
207 | enum dcbnl_attrs { | 274 | enum 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 | */ | ||
233 | enum ieee_attrs { | 314 | enum 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 | */ | ||
341 | enum 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 | |||
350 | enum 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 | |||
284 | enum { | 282 | enum { |
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 | */ | ||
536 | struct 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 | */ | ||
550 | struct 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 | */ | ||
561 | struct 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 | */ | ||
572 | struct 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 | */ | ||
603 | enum 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 */ |
545 | u32 ethtool_op_get_link(struct net_device *dev); | 632 | u32 ethtool_op_get_link(struct net_device *dev); |
546 | u32 ethtool_op_get_rx_csum(struct net_device *dev); | ||
547 | u32 ethtool_op_get_tx_csum(struct net_device *dev); | 633 | u32 ethtool_op_get_tx_csum(struct net_device *dev); |
548 | int ethtool_op_set_tx_csum(struct net_device *dev, u32 data); | 634 | int ethtool_op_set_tx_csum(struct net_device *dev, u32 data); |
549 | int ethtool_op_set_tx_hw_csum(struct net_device *dev, u32 data); | 635 | int 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); | |||
183 | extern void icmpv6_param_prob(struct sk_buff *skb, | 183 | extern void icmpv6_param_prob(struct sk_buff *skb, |
184 | u8 code, int pos); | 184 | u8 code, int pos); |
185 | 185 | ||
186 | struct flowi; | 186 | struct flowi6; |
187 | struct in6_addr; | 187 | struct in6_addr; |
188 | extern void icmpv6_flow_init(struct sock *sk, | 188 | extern 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 | ||
220 | extern int ip_check_mc(struct in_device *dev, __be32 mc_addr, __be32 src_addr, u16 proto); | 220 | extern int ip_check_mc_rcu(struct in_device *dev, __be32 mc_addr, __be32 src_addr, u16 proto); |
221 | extern int igmp_rcv(struct sk_buff *); | 221 | extern int igmp_rcv(struct sk_buff *); |
222 | extern int ip_mc_join_group(struct sock *sk, struct ip_mreqn *imr); | 222 | extern int ip_mc_join_group(struct sock *sk, struct ip_mreqn *imr); |
223 | extern int ip_mc_leave_group(struct sock *sk, struct ip_mreqn *imr); | 223 | extern 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 | ||
146 | struct in_ifaddr { | 146 | struct 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 | ||
120 | struct socket_wq { | 120 | struct 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 | }; |
388 | typedef enum gro_result gro_result_t; | 391 | typedef enum gro_result gro_result_t; |
389 | 392 | ||
390 | typedef 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 | |||
434 | enum rx_handler_result { | ||
435 | RX_HANDLER_CONSUMED, | ||
436 | RX_HANDLER_ANOTHER, | ||
437 | RX_HANDLER_EXACT, | ||
438 | RX_HANDLER_PASS, | ||
439 | }; | ||
440 | typedef enum rx_handler_result rx_handler_result_t; | ||
441 | typedef rx_handler_result_t rx_handler_func_t(struct sk_buff **pskb); | ||
391 | 442 | ||
392 | extern void __napi_schedule(struct napi_struct *n); | 443 | extern 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 | */ |
557 | struct rps_dev_flow { | 609 | struct 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 | ||
609 | extern struct rps_sock_flow_table __rcu *rps_sock_flow_table; | 662 | extern struct rps_sock_flow_table __rcu *rps_sock_flow_table; |
610 | 663 | ||
664 | #ifdef CONFIG_RFS_ACCEL | ||
665 | extern 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. */ |
612 | struct netdev_rx_queue { | 670 | struct 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 */ | ||
707 | struct 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 |
758 | struct net_device_ops { | 892 | struct 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 | ||
1161 | static inline | 1350 | static inline |
1351 | int netdev_get_prio_tc_map(const struct net_device *dev, u32 prio) | ||
1352 | { | ||
1353 | return dev->prio_tc_map[prio & TC_BITMASK]; | ||
1354 | } | ||
1355 | |||
1356 | static inline | ||
1357 | int 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 | |||
1366 | static inline | ||
1367 | void 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 | |||
1374 | static inline | ||
1375 | int 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 | |||
1385 | static inline | ||
1386 | int 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 | |||
1395 | static inline | ||
1396 | int netdev_get_num_tc(struct net_device *dev) | ||
1397 | { | ||
1398 | return dev->num_tc; | ||
1399 | } | ||
1400 | |||
1401 | static inline | ||
1162 | struct netdev_queue *netdev_get_tx_queue(const struct net_device *dev, | 1402 | struct 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 | ||
1598 | static 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 | |||
1358 | extern int netdev_boot_setup_check(struct net_device *dev); | 1605 | extern int netdev_boot_setup_check(struct net_device *dev); |
1359 | extern unsigned long netdev_boot_base(const char *prefix, int unit); | 1606 | extern unsigned long netdev_boot_base(const char *prefix, int unit); |
1360 | extern struct net_device *dev_getbyhwaddr_rcu(struct net *net, unsigned short type, | 1607 | extern 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) | |||
1606 | static inline void netif_tx_stop_queue(struct netdev_queue *dev_queue) | 1853 | static 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); | |||
1844 | extern int dev_change_net_namespace(struct net_device *, | 2090 | extern int dev_change_net_namespace(struct net_device *, |
1845 | struct net *, const char *); | 2091 | struct net *, const char *); |
1846 | extern int dev_set_mtu(struct net_device *, int); | 2092 | extern int dev_set_mtu(struct net_device *, int); |
2093 | extern void dev_set_group(struct net_device *, int); | ||
1847 | extern int dev_set_mac_address(struct net_device *, | 2094 | extern int dev_set_mac_address(struct net_device *, |
1848 | struct sockaddr *); | 2095 | struct sockaddr *); |
1849 | extern int dev_hard_start_xmit(struct sk_buff *skb, | 2096 | extern int dev_hard_start_xmit(struct sk_buff *skb, |
@@ -2267,8 +2514,10 @@ extern int netdev_max_backlog; | |||
2267 | extern int netdev_tstamp_prequeue; | 2514 | extern int netdev_tstamp_prequeue; |
2268 | extern int weight_p; | 2515 | extern int weight_p; |
2269 | extern int netdev_set_master(struct net_device *dev, struct net_device *master); | 2516 | extern int netdev_set_master(struct net_device *dev, struct net_device *master); |
2517 | extern int netdev_set_bond_master(struct net_device *dev, | ||
2518 | struct net_device *master); | ||
2270 | extern int skb_checksum_help(struct sk_buff *skb); | 2519 | extern int skb_checksum_help(struct sk_buff *skb); |
2271 | extern struct sk_buff *skb_gso_segment(struct sk_buff *skb, int features); | 2520 | extern struct sk_buff *skb_gso_segment(struct sk_buff *skb, u32 features); |
2272 | #ifdef CONFIG_BUG | 2521 | #ifdef CONFIG_BUG |
2273 | extern void netdev_rx_csum_fault(struct net_device *dev); | 2522 | extern 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 | ||
2296 | extern void linkwatch_run_queue(void); | 2545 | extern void linkwatch_run_queue(void); |
2297 | 2546 | ||
2298 | unsigned long netdev_increment_features(unsigned long all, unsigned long one, | 2547 | static inline u32 netdev_get_wanted_features(struct net_device *dev) |
2299 | unsigned long mask); | 2548 | { |
2300 | unsigned long netdev_fix_features(unsigned long features, const char *name); | 2549 | return (dev->features & ~dev->hw_features) | dev->wanted_features; |
2550 | } | ||
2551 | u32 netdev_increment_features(u32 all, u32 one, u32 mask); | ||
2552 | u32 netdev_fix_features(struct net_device *dev, u32 features); | ||
2553 | void netdev_update_features(struct net_device *dev); | ||
2301 | 2554 | ||
2302 | void netif_stacked_transfer_operstate(const struct net_device *rootdev, | 2555 | void netif_stacked_transfer_operstate(const struct net_device *rootdev, |
2303 | struct net_device *dev); | 2556 | struct net_device *dev); |
2304 | 2557 | ||
2305 | int netif_skb_features(struct sk_buff *skb); | 2558 | u32 netif_skb_features(struct sk_buff *skb); |
2306 | 2559 | ||
2307 | static inline int net_gso_ok(int features, int gso_type) | 2560 | static 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 | ||
2313 | static inline int skb_gso_ok(struct sk_buff *skb, int features) | 2566 | static 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 | ||
2331 | extern int __skb_bond_should_drop(struct sk_buff *skb, | 2584 | static inline int netif_is_bond_slave(struct net_device *dev) |
2332 | struct net_device *master); | ||
2333 | |||
2334 | static 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 | ||
2342 | extern struct pernet_operations __net_initdata loopback_net_ops; | 2589 | extern 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 | ||
2352 | static inline u32 dev_ethtool_get_rx_csum(struct net_device *dev) | 2599 | static 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 | ||
46 | enum nf_inet_hooks { | 53 | enum 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 |
82 | static inline int NF_DROP_GETERR(int verdict) | ||
83 | { | ||
84 | return -(verdict >> NF_VERDICT_QBITS); | ||
85 | } | ||
75 | 86 | ||
76 | static inline int nf_inet_addr_cmp(const union nf_inet_addr *a1, | 87 | static 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 | ||
270 | extern const struct nf_afinfo *nf_afinfo[NFPROTO_NUMPROTO]; | 281 | extern const struct nf_afinfo __rcu *nf_afinfo[NFPROTO_NUMPROTO]; |
271 | static inline const struct nf_afinfo *nf_get_afinfo(unsigned short family) | 282 | static 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) |
360 | extern void (*ip_ct_attach)(struct sk_buff *, struct sk_buff *); | 371 | extern void (*ip_ct_attach)(struct sk_buff *, struct sk_buff *) __rcu; |
361 | extern void nf_ct_attach(struct sk_buff *, struct sk_buff *); | 372 | extern void nf_ct_attach(struct sk_buff *, struct sk_buff *); |
362 | extern void (*nf_ct_destroy)(struct nf_conntrack *); | 373 | extern void (*nf_ct_destroy)(struct nf_conntrack *) __rcu; |
363 | #else | 374 | #else |
364 | static inline void nf_ct_attach(struct sk_buff *new, struct sk_buff *skb) {} | 375 | static 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 @@ | |||
1 | header-y += ipset/ | ||
2 | |||
1 | header-y += nf_conntrack_common.h | 3 | header-y += nf_conntrack_common.h |
2 | header-y += nf_conntrack_ftp.h | 4 | header-y += nf_conntrack_ftp.h |
3 | header-y += nf_conntrack_sctp.h | 5 | header-y += nf_conntrack_sctp.h |
@@ -9,6 +11,7 @@ header-y += nfnetlink_conntrack.h | |||
9 | header-y += nfnetlink_log.h | 11 | header-y += nfnetlink_log.h |
10 | header-y += nfnetlink_queue.h | 12 | header-y += nfnetlink_queue.h |
11 | header-y += x_tables.h | 13 | header-y += x_tables.h |
14 | header-y += xt_AUDIT.h | ||
12 | header-y += xt_CHECKSUM.h | 15 | header-y += xt_CHECKSUM.h |
13 | header-y += xt_CLASSIFY.h | 16 | header-y += xt_CLASSIFY.h |
14 | header-y += xt_CONNMARK.h | 17 | header-y += xt_CONNMARK.h |
@@ -26,6 +29,7 @@ header-y += xt_TCPMSS.h | |||
26 | header-y += xt_TCPOPTSTRIP.h | 29 | header-y += xt_TCPOPTSTRIP.h |
27 | header-y += xt_TEE.h | 30 | header-y += xt_TEE.h |
28 | header-y += xt_TPROXY.h | 31 | header-y += xt_TPROXY.h |
32 | header-y += xt_addrtype.h | ||
29 | header-y += xt_cluster.h | 33 | header-y += xt_cluster.h |
30 | header-y += xt_comment.h | 34 | header-y += xt_comment.h |
31 | header-y += xt_connbytes.h | 35 | header-y += xt_connbytes.h |
@@ -34,6 +38,7 @@ header-y += xt_connmark.h | |||
34 | header-y += xt_conntrack.h | 38 | header-y += xt_conntrack.h |
35 | header-y += xt_cpu.h | 39 | header-y += xt_cpu.h |
36 | header-y += xt_dccp.h | 40 | header-y += xt_dccp.h |
41 | header-y += xt_devgroup.h | ||
37 | header-y += xt_dscp.h | 42 | header-y += xt_dscp.h |
38 | header-y += xt_esp.h | 43 | header-y += xt_esp.h |
39 | header-y += xt_hashlimit.h | 44 | header-y += xt_hashlimit.h |
@@ -54,7 +59,9 @@ header-y += xt_quota.h | |||
54 | header-y += xt_rateest.h | 59 | header-y += xt_rateest.h |
55 | header-y += xt_realm.h | 60 | header-y += xt_realm.h |
56 | header-y += xt_recent.h | 61 | header-y += xt_recent.h |
62 | header-y += xt_set.h | ||
57 | header-y += xt_sctp.h | 63 | header-y += xt_sctp.h |
64 | header-y += xt_socket.h | ||
58 | header-y += xt_state.h | 65 | header-y += xt_state.h |
59 | header-y += xt_statistic.h | 66 | header-y += xt_statistic.h |
60 | header-y += xt_string.h | 67 | header-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 @@ | |||
1 | header-y += ip_set.h | ||
2 | header-y += ip_set_bitmap.h | ||
3 | header-y += ip_set_hash.h | ||
4 | header-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 */ | ||
21 | enum 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 */ | ||
50 | enum { | ||
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 */ | ||
69 | enum { | ||
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 */ | ||
101 | enum { | ||
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 */ | ||
112 | enum { | ||
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 */ | ||
120 | enum 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 */ | ||
142 | enum 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 */ | ||
148 | enum 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 */ | ||
154 | enum 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 | */ | ||
174 | typedef u16 ip_set_id_t; | ||
175 | |||
176 | #define IPSET_INVALID_ID 65535 | ||
177 | |||
178 | enum 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 */ | ||
190 | enum 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 */ | ||
198 | enum 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 | |||
215 | struct ip_set; | ||
216 | |||
217 | typedef int (*ipset_adtfn)(struct ip_set *set, void *value, u32 timeout); | ||
218 | |||
219 | /* Set type, variant-specific part */ | ||
220 | struct 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 */ | ||
258 | struct 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 */ | ||
286 | extern int ip_set_type_register(struct ip_set_type *set_type); | ||
287 | extern void ip_set_type_unregister(struct ip_set_type *set_type); | ||
288 | |||
289 | /* A generic IP set */ | ||
290 | struct 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 */ | ||
308 | extern ip_set_id_t ip_set_get_byname(const char *name, struct ip_set **set); | ||
309 | extern void ip_set_put_byindex(ip_set_id_t index); | ||
310 | extern const char * ip_set_name_byindex(ip_set_id_t index); | ||
311 | extern ip_set_id_t ip_set_nfnl_get(const char *name); | ||
312 | extern ip_set_id_t ip_set_nfnl_get_byindex(ip_set_id_t index); | ||
313 | extern void ip_set_nfnl_put(ip_set_id_t index); | ||
314 | |||
315 | /* API for iptables set match, and SET target */ | ||
316 | extern int ip_set_add(ip_set_id_t id, const struct sk_buff *skb, | ||
317 | u8 family, u8 dim, u8 flags); | ||
318 | extern int ip_set_del(ip_set_id_t id, const struct sk_buff *skb, | ||
319 | u8 family, u8 dim, u8 flags); | ||
320 | extern 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 */ | ||
324 | extern void * ip_set_alloc(size_t size); | ||
325 | extern void ip_set_free(void *members); | ||
326 | extern int ip_set_get_ipaddr4(struct nlattr *nla, __be32 *ipaddr); | ||
327 | extern int ip_set_get_ipaddr6(struct nlattr *nla, union nf_inet_addr *ipaddr); | ||
328 | |||
329 | static inline int | ||
330 | ip_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? */ | ||
342 | static inline bool | ||
343 | ip_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 */ | ||
349 | static inline bool | ||
350 | ip_set_attr_netorder(struct nlattr *tb[], int type) | ||
351 | { | ||
352 | return tb[type] && (tb[type]->nla_type & NLA_F_NET_BYTEORDER); | ||
353 | } | ||
354 | |||
355 | static inline bool | ||
356 | ip_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 */ | ||
362 | static inline u32 | ||
363 | ip_set_get_h32(const struct nlattr *attr) | ||
364 | { | ||
365 | return ntohl(nla_get_be32(attr)); | ||
366 | } | ||
367 | |||
368 | static inline u16 | ||
369 | ip_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) \ | ||
378 | do { \ | ||
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) \ | ||
388 | do { \ | ||
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 */ | ||
399 | static inline __be32 | ||
400 | ip4addr(const struct sk_buff *skb, bool src) | ||
401 | { | ||
402 | return src ? ip_hdr(skb)->saddr : ip_hdr(skb)->daddr; | ||
403 | } | ||
404 | |||
405 | static inline void | ||
406 | ip4addrptr(const struct sk_buff *skb, bool src, __be32 *addr) | ||
407 | { | ||
408 | *addr = src ? ip_hdr(skb)->saddr : ip_hdr(skb)->daddr; | ||
409 | } | ||
410 | |||
411 | static inline void | ||
412 | ip6addrptr(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 */ | ||
419 | static inline int | ||
420 | bitmap_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 | |||
429 | union 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 */ | ||
435 | struct 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 */ | ||
445 | struct 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 */ | ||
29 | struct 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 */ | ||
36 | struct 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 */ | ||
44 | struct 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 */ | ||
50 | struct 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 */ | ||
66 | static u8 | ||
67 | htable_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 */ | ||
84 | static void | ||
85 | add_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 | |||
106 | static void | ||
107 | del_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 */ | ||
128 | static void | ||
129 | ahash_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 */ | ||
145 | static size_t | ||
146 | ahash_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 */ | ||
164 | static void | ||
165 | ip_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 */ | ||
188 | static void | ||
189 | ip_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. */ | ||
264 | static int | ||
265 | type_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. */ | ||
294 | static int | ||
295 | type_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 | |||
305 | retry: | ||
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. */ | ||
351 | static int | ||
352 | type_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++; | ||
382 | out: | ||
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 | */ | ||
390 | static int | ||
391 | type_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 */ | ||
438 | static int | ||
439 | type_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 */ | ||
465 | static int | ||
466 | type_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 */ | ||
494 | static int | ||
495 | type_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; | ||
526 | nla_put_failure: | ||
527 | return -EMSGSIZE; | ||
528 | } | ||
529 | |||
530 | /* Reply a LIST/SAVE request: dump the elements of the specified set */ | ||
531 | static int | ||
532 | type_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 | |||
576 | nla_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 | |||
588 | static int | ||
589 | type_pf_kadt(struct ip_set *set, const struct sk_buff * skb, | ||
590 | enum ipset_adt adt, u8 pf, u8 dim, u8 flags); | ||
591 | static int | ||
592 | type_pf_uadt(struct ip_set *set, struct nlattr *tb[], | ||
593 | enum ipset_adt adt, u32 *lineno, u32 flags); | ||
594 | |||
595 | static 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 | |||
616 | static inline u32 | ||
617 | type_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 | |||
625 | static inline bool | ||
626 | type_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 | |||
634 | static inline void | ||
635 | type_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 | |||
642 | static int | ||
643 | type_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 */ | ||
675 | static void | ||
676 | type_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 | |||
717 | static int | ||
718 | type_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 | |||
738 | retry: | ||
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 | |||
779 | static int | ||
780 | type_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++; | ||
831 | out: | ||
832 | rcu_read_unlock_bh(); | ||
833 | return ret; | ||
834 | } | ||
835 | |||
836 | static int | ||
837 | type_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 | ||
883 | static int | ||
884 | type_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 | |||
908 | static int | ||
909 | type_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 | |||
932 | static int | ||
933 | type_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 | |||
977 | nla_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 | |||
989 | static 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 | |||
1005 | static void | ||
1006 | type_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 | |||
1020 | static void | ||
1021 | type_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 */ | ||
5 | enum { | ||
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 | |||
17 | static inline u32 | ||
18 | range_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 | |||
4 | extern 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) | ||
8 | extern bool ip_set_get_ip6_port(const struct sk_buff *skb, bool src, | ||
9 | __be16 *port, u8 *proto); | ||
10 | #else | ||
11 | static 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 | |||
18 | extern 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 */ | ||
5 | enum { | ||
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 */ | ||
5 | enum { | ||
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 | |||
25 | static inline unsigned int | ||
26 | ip_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 | |||
43 | static inline bool | ||
44 | ip_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 | |||
51 | static inline bool | ||
52 | ip_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 | |||
59 | static inline unsigned long | ||
60 | ip_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 | |||
75 | static inline u32 | ||
76 | ip_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 | |||
88 | static inline bool | ||
89 | ip_set_timeout_test(unsigned long timeout) | ||
90 | { | ||
91 | return timeout == IPSET_ELEM_PERMANENT || | ||
92 | time_after(timeout, jiffies); | ||
93 | } | ||
94 | |||
95 | static inline bool | ||
96 | ip_set_timeout_expired(unsigned long timeout) | ||
97 | { | ||
98 | return timeout != IPSET_ELEM_PERMANENT && | ||
99 | time_before(timeout, jiffies); | ||
100 | } | ||
101 | |||
102 | static inline unsigned long | ||
103 | ip_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 | |||
118 | static inline u32 | ||
119 | ip_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 */ | ||
8 | extern const union nf_inet_addr ip_set_netmask_map[]; | ||
9 | extern const union nf_inet_addr ip_set_hostmask_map[]; | ||
10 | |||
11 | static inline __be32 | ||
12 | ip_set_netmask(u8 pfxlen) | ||
13 | { | ||
14 | return ip_set_netmask_map[pfxlen].ip; | ||
15 | } | ||
16 | |||
17 | static inline const __be32 * | ||
18 | ip_set_netmask6(u8 pfxlen) | ||
19 | { | ||
20 | return &ip_set_netmask_map[pfxlen].ip6[0]; | ||
21 | } | ||
22 | |||
23 | static inline u32 | ||
24 | ip_set_hostmask(u8 pfxlen) | ||
25 | { | ||
26 | return (__force u32) ip_set_hostmask_map[pfxlen].ip; | ||
27 | } | ||
28 | |||
29 | static inline const __be32 * | ||
30 | ip_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 | |||
4 | extern 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 | ||
131 | enum 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 | |||
130 | enum ctattr_nat { | 139 | enum 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 { | |||
611 | extern void xt_compat_lock(u_int8_t af); | 611 | extern void xt_compat_lock(u_int8_t af); |
612 | extern void xt_compat_unlock(u_int8_t af); | 612 | extern void xt_compat_unlock(u_int8_t af); |
613 | 613 | ||
614 | extern int xt_compat_add_offset(u_int8_t af, unsigned int offset, short delta); | 614 | extern int xt_compat_add_offset(u_int8_t af, unsigned int offset, int delta); |
615 | extern void xt_compat_flush_offsets(u_int8_t af); | 615 | extern void xt_compat_flush_offsets(u_int8_t af); |
616 | extern void xt_compat_init_offsets(u_int8_t af, unsigned int number); | ||
616 | extern int xt_compat_calc_jump(u_int8_t af, unsigned int offset); | 617 | extern int xt_compat_calc_jump(u_int8_t af, unsigned int offset); |
617 | 618 | ||
618 | extern int xt_compat_match_offset(const struct xt_match *match); | 619 | extern 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 | |||
17 | enum { | ||
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 | |||
26 | struct 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 | ||
6 | struct xt_ct_target_info { | 8 | struct 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 | ||
23 | struct 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 | ||
9 | struct xt_tcpoptstrip_target_info { | 11 | struct 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. */ |
7 | struct xt_tproxy_target_info { | 9 | struct 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 | ||
14 | struct xt_tproxy_target_info_v1 { | 16 | struct 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 | |||
6 | enum { | ||
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 */ | ||
15 | enum { | ||
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 | |||
30 | struct xt_addrtype_info_v1 { | ||
31 | __u16 source; /* source-type mask */ | ||
32 | __u16 dest; /* dest-type mask */ | ||
33 | __u32 flags; | ||
34 | }; | ||
35 | |||
36 | /* revision 0 */ | ||
37 | struct 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 | |||
4 | enum xt_cluster_flags { | 6 | enum xt_cluster_flags { |
5 | XT_CLUSTER_F_INV = (1 << 0) | 7 | XT_CLUSTER_F_INV = (1 << 0) |
6 | }; | 8 | }; |
7 | 9 | ||
8 | struct xt_cluster_match_info { | 10 | struct 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 | ||
6 | struct xt_comment_info { | 6 | struct 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 | |||
4 | struct xt_connlimit_data; | 6 | struct xt_connlimit_data; |
5 | 7 | ||
8 | enum { | ||
9 | XT_CONNLIMIT_INVERT = 1 << 0, | ||
10 | XT_CONNLIMIT_DADDR = 1 << 1, | ||
11 | }; | ||
12 | |||
6 | struct xt_connlimit_info { | 13 | struct 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 | ||
61 | struct 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 | |||
6 | enum 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 | |||
13 | struct 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 | |||
4 | enum xt_quota_flags { | 6 | enum xt_quota_flags { |
5 | XT_QUOTA_INVERT = 0x1, | 7 | XT_QUOTA_INVERT = 0x1, |
6 | }; | 8 | }; |
@@ -9,9 +11,9 @@ enum xt_quota_flags { | |||
9 | struct xt_quota_priv; | 11 | struct xt_quota_priv; |
10 | 12 | ||
11 | struct xt_quota_info { | 13 | struct 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 | |||
16 | struct 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 */ | ||
29 | struct xt_set_info_match_v0 { | ||
30 | struct xt_set_info_v0 match_set; | ||
31 | }; | ||
32 | |||
33 | struct 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 | |||
40 | struct xt_set_info { | ||
41 | ip_set_id_t index; | ||
42 | __u8 dim; | ||
43 | __u8 flags; | ||
44 | }; | ||
45 | |||
46 | /* match and target infos */ | ||
47 | struct xt_set_info_match { | ||
48 | struct xt_set_info match_set; | ||
49 | }; | ||
50 | |||
51 | struct 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 | |||
4 | enum { | 6 | enum { |
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 | |||
4 | struct xt_time_info { | 6 | struct 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 | ||
14 | enum { | 16 | enum { |
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 | |||
4 | enum xt_u32_ops { | 6 | enum 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 | ||
11 | struct xt_u32_location_element { | 13 | struct xt_u32_location_element { |
12 | u_int32_t number; | 14 | __u32 number; |
13 | u_int8_t nextop; | 15 | __u8 nextop; |
14 | }; | 16 | }; |
15 | 17 | ||
16 | struct xt_u32_value_element { | 18 | struct 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 { | |||
27 | struct xt_u32_test { | 29 | struct 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 | ||
34 | struct xt_u32 { | 36 | struct 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 */ |
26 | struct hdr_ui { | 28 | struct 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 | ||
34 | struct hdr_ni { | 36 | struct 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 | ||
42 | struct ebt_802_3_hdr { | 44 | struct 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 | ||
61 | struct ebt_802_3_info { | 63 | struct 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 | ||
32 | struct ebt_mac_wormhash_tuple { | 34 | struct 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 | ||
12 | struct ebt_limit_info { | 14 | struct 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 | ||
12 | struct ebt_log_info { | 14 | struct 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) |
7 | struct ebt_mark_m_info { | 9 | struct 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 | ||
12 | struct ebt_nflog_info { | 14 | struct 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 | |||
4 | struct ebt_pkttype_info { | 6 | struct 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 | ||
23 | struct ebt_stp_config_info { | 25 | struct 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 | ||
37 | struct ebt_stp_info { | 39 | struct 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 | ||
12 | struct ebt_ulog_info { | 14 | struct 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 | ||
10 | struct ebt_vlan_info { | 12 | struct 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 | |||
4 | enum clusterip_hashmode { | 6 | enum 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 | ||
18 | struct ipt_clusterip_tgt_info { | 20 | struct 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 | ||
21 | struct ipt_ECN_info { | 23 | struct 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 | ||
8 | struct ipt_same_info { | 10 | struct 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 | |||
7 | enum { | 9 | enum { |
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 | ||
15 | struct ipt_TTL_info { | 17 | struct 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 | |||
4 | enum { | 6 | enum { |
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 | ||
11 | struct ipt_addrtype_info_v1 { | 13 | struct 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 */ |
18 | struct ipt_addrtype_info { | 20 | struct 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 | |||
4 | struct ipt_ah { | 6 | struct 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 */ |
22 | struct ipt_ecn_info { | 24 | struct 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 | |||
7 | enum { | 9 | enum { |
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 | ||
15 | struct ipt_ttl_info { | 17 | struct 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 | |||
8 | enum { | 10 | enum { |
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 | ||
16 | struct ip6t_HL_info { | 18 | struct 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 | |||
4 | enum ip6t_reject_with { | 6 | enum 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 | ||
14 | struct ip6t_reject_info { | 16 | struct 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 | |||
4 | struct ip6t_ah { | 6 | struct 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 | |||
4 | struct ip6t_frag { | 6 | struct 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 | |||
8 | enum { | 10 | enum { |
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 | ||
16 | struct ip6t_hl_info { | 18 | struct 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 | |||
11 | struct ip6t_ipv6header_info { | 13 | struct 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 */ |
5 | struct ip6t_mh { | 7 | struct 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 | ||
6 | struct ip6t_opts { | 8 | struct 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 | ||
8 | struct ip6t_rt { | 9 | struct 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 | |||
252 | enum { | ||
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 | |||
261 | struct 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 | |||
271 | struct 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 | ||
498 | enum { | ||
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 */ | ||
507 | struct tc_netem_gimodel { | ||
508 | __u32 p13; | ||
509 | __u32 p31; | ||
510 | __u32 p32; | ||
511 | __u32 p14; | ||
512 | __u32 p23; | ||
513 | }; | ||
514 | |||
515 | /* Gilbert-Elliot models */ | ||
516 | struct 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 | |||
544 | struct 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 | |||
554 | enum { | ||
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 | */ | ||
565 | struct 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 | |||
577 | struct 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); | |||
2767 | void security_xfrm_state_free(struct xfrm_state *x); | 2767 | void security_xfrm_state_free(struct xfrm_state *x); |
2768 | int security_xfrm_policy_lookup(struct xfrm_sec_ctx *ctx, u32 fl_secid, u8 dir); | 2768 | int security_xfrm_policy_lookup(struct xfrm_sec_ctx *ctx, u32 fl_secid, u8 dir); |
2769 | int security_xfrm_state_pol_flow_match(struct xfrm_state *x, | 2769 | int 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); | ||
2771 | int security_xfrm_decode_session(struct sk_buff *skb, u32 *secid); | 2772 | int security_xfrm_decode_session(struct sk_buff *skb, u32 *secid); |
2772 | void security_skb_classify_flow(struct sk_buff *skb, struct flowi *fl); | 2773 | void 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 | ||
2821 | static inline int security_xfrm_state_pol_flow_match(struct xfrm_state *x, | 2822 | static 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 | ||
1805 | static inline bool skb_has_frag_list(const struct sk_buff *skb) | 1811 | static 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, | |||
1868 | extern int skb_shift(struct sk_buff *tgt, struct sk_buff *skb, | 1874 | extern int skb_shift(struct sk_buff *tgt, struct sk_buff *skb, |
1869 | int shiftlen); | 1875 | int shiftlen); |
1870 | 1876 | ||
1871 | extern struct sk_buff *skb_segment(struct sk_buff *skb, int features); | 1877 | extern struct sk_buff *skb_segment(struct sk_buff *skb, u32 features); |
1872 | 1878 | ||
1873 | static inline void *skb_header_pointer(const struct sk_buff *skb, int offset, | 1879 | static 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 | ||
216 | struct tipc_bearer_config { | 203 | struct 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 */ | ||
252 | struct 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 | ||
87 | struct 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 | |||
87 | struct xfrm_algo { | 97 | struct 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 | ||
355 | struct xfrm_usersa_id { | 368 | struct xfrm_usersa_id { |