aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/linux/atalk.h2
-rw-r--r--include/linux/icmpv6.h11
-rw-r--r--include/linux/ieee80211.h35
-rw-r--r--include/linux/if_arp.h6
-rw-r--r--include/linux/if_vlan.h2
-rw-r--r--include/linux/igmp.h38
-rw-r--r--include/linux/in6.h11
-rw-r--r--include/linux/inetdevice.h8
-rw-r--r--include/linux/ipv6.h43
-rw-r--r--include/linux/net.h3
-rw-r--r--include/linux/netdevice.h35
-rw-r--r--include/linux/netfilter.h9
-rw-r--r--include/linux/netfilter/nf_conntrack_sip.h185
-rw-r--r--include/linux/nl80211.h218
-rw-r--r--include/linux/seq_file.h9
-rw-r--r--include/linux/skbuff.h94
-rw-r--r--include/linux/smc91x.h13
-rw-r--r--include/linux/ssb/ssb.h21
-rw-r--r--include/linux/ssb/ssb_driver_chipcommon.h4
-rw-r--r--include/linux/ssb/ssb_driver_gige.h174
-rw-r--r--include/linux/ssb/ssb_driver_pci.h19
-rw-r--r--include/linux/tcp.h7
-rw-r--r--include/linux/udp.h19
-rw-r--r--include/linux/wireless.h1
-rw-r--r--include/linux/xfrm.h3
-rw-r--r--include/net/addrconf.h34
-rw-r--r--include/net/cfg80211.h159
-rw-r--r--include/net/dst.h10
-rw-r--r--include/net/icmp.h9
-rw-r--r--include/net/ieee80211.h1
-rw-r--r--include/net/ieee80211softmac.h373
-rw-r--r--include/net/ieee80211softmac_wx.h99
-rw-r--r--include/net/inet_hashtables.h10
-rw-r--r--include/net/inet_sock.h7
-rw-r--r--include/net/inet_timewait_sock.h18
-rw-r--r--include/net/ip.h10
-rw-r--r--include/net/ip6_fib.h18
-rw-r--r--include/net/ip6_route.h41
-rw-r--r--include/net/ipv6.h58
-rw-r--r--include/net/llc_if.h5
-rw-r--r--include/net/mac80211.h529
-rw-r--r--include/net/ndisc.h4
-rw-r--r--include/net/neighbour.h31
-rw-r--r--include/net/net_namespace.h12
-rw-r--r--include/net/netfilter/nf_conntrack.h7
-rw-r--r--include/net/netfilter/nf_conntrack_expect.h22
-rw-r--r--include/net/netfilter/nf_conntrack_helper.h5
-rw-r--r--include/net/netfilter/nf_conntrack_tuple.h53
-rw-r--r--include/net/netns/ipv4.h10
-rw-r--r--include/net/netns/ipv6.h18
-rw-r--r--include/net/pkt_cls.h2
-rw-r--r--include/net/protocol.h3
-rw-r--r--include/net/raw.h4
-rw-r--r--include/net/request_sock.h7
-rw-r--r--include/net/route.h5
-rw-r--r--include/net/sctp/command.h3
-rw-r--r--include/net/sctp/sctp.h5
-rw-r--r--include/net/sctp/sm.h8
-rw-r--r--include/net/sctp/structs.h10
-rw-r--r--include/net/sock.h48
-rw-r--r--include/net/tcp.h16
-rw-r--r--include/net/tipc/tipc_bearer.h9
-rw-r--r--include/net/tipc/tipc_port.h7
-rw-r--r--include/net/udp.h7
-rw-r--r--include/net/wireless.h186
-rw-r--r--include/net/xfrm.h69
66 files changed, 1813 insertions, 1089 deletions
diff --git a/include/linux/atalk.h b/include/linux/atalk.h
index ced8a1ed080c..e9ebac2e2ecc 100644
--- a/include/linux/atalk.h
+++ b/include/linux/atalk.h
@@ -85,8 +85,6 @@ static inline struct atalk_sock *at_sk(struct sock *sk)
85 return (struct atalk_sock *)sk; 85 return (struct atalk_sock *)sk;
86} 86}
87 87
88#include <asm/byteorder.h>
89
90struct ddpehdr { 88struct ddpehdr {
91 __be16 deh_len_hops; /* lower 10 bits are length, next 4 - hops */ 89 __be16 deh_len_hops; /* lower 10 bits are length, next 4 - hops */
92 __be16 deh_sum; 90 __be16 deh_sum;
diff --git a/include/linux/icmpv6.h b/include/linux/icmpv6.h
index 7c5e9817e998..03067443198a 100644
--- a/include/linux/icmpv6.h
+++ b/include/linux/icmpv6.h
@@ -176,12 +176,21 @@ extern void icmpv6_send(struct sk_buff *skb,
176 __u32 info, 176 __u32 info,
177 struct net_device *dev); 177 struct net_device *dev);
178 178
179extern int icmpv6_init(struct net_proto_family *ops); 179extern int icmpv6_init(void);
180extern int icmpv6_err_convert(int type, int code, 180extern int icmpv6_err_convert(int type, int code,
181 int *err); 181 int *err);
182extern void icmpv6_cleanup(void); 182extern void icmpv6_cleanup(void);
183extern void icmpv6_param_prob(struct sk_buff *skb, 183extern void icmpv6_param_prob(struct sk_buff *skb,
184 int code, int pos); 184 int code, int pos);
185
186struct flowi;
187struct in6_addr;
188extern void icmpv6_flow_init(struct sock *sk,
189 struct flowi *fl,
190 u8 type,
191 const struct in6_addr *saddr,
192 const struct in6_addr *daddr,
193 int oif);
185#endif 194#endif
186 195
187#endif 196#endif
diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h
index f577c8f1c66d..f27d11ab418b 100644
--- a/include/linux/ieee80211.h
+++ b/include/linux/ieee80211.h
@@ -97,6 +97,7 @@
97#define IEEE80211_MAX_FRAME_LEN 2352 97#define IEEE80211_MAX_FRAME_LEN 2352
98 98
99#define IEEE80211_MAX_SSID_LEN 32 99#define IEEE80211_MAX_SSID_LEN 32
100#define IEEE80211_MAX_MESH_ID_LEN 32
100 101
101struct ieee80211_hdr { 102struct ieee80211_hdr {
102 __le16 frame_control; 103 __le16 frame_control;
@@ -109,6 +110,16 @@ struct ieee80211_hdr {
109} __attribute__ ((packed)); 110} __attribute__ ((packed));
110 111
111 112
113struct ieee80211s_hdr {
114 u8 flags;
115 u8 ttl;
116 u8 seqnum[3];
117 u8 eaddr1[6];
118 u8 eaddr2[6];
119 u8 eaddr3[6];
120} __attribute__ ((packed));
121
122
112struct ieee80211_mgmt { 123struct ieee80211_mgmt {
113 __le16 frame_control; 124 __le16 frame_control;
114 __le16 duration; 125 __le16 duration;
@@ -206,6 +217,23 @@ struct ieee80211_mgmt {
206 __le16 params; 217 __le16 params;
207 __le16 reason_code; 218 __le16 reason_code;
208 } __attribute__((packed)) delba; 219 } __attribute__((packed)) delba;
220 struct{
221 u8 action_code;
222 /* capab_info for open and confirm,
223 * reason for close
224 */
225 __le16 aux;
226 /* Followed in plink_confirm by status
227 * code, AID and supported rates,
228 * and directly by supported rates in
229 * plink_open and plink_close
230 */
231 u8 variable[0];
232 } __attribute__((packed)) plink_action;
233 struct{
234 u8 action_code;
235 u8 variable[0];
236 } __attribute__((packed)) mesh_action;
209 } u; 237 } u;
210 } __attribute__ ((packed)) action; 238 } __attribute__ ((packed)) action;
211 } u; 239 } u;
@@ -437,6 +465,13 @@ enum ieee80211_eid {
437 WLAN_EID_TS_DELAY = 43, 465 WLAN_EID_TS_DELAY = 43,
438 WLAN_EID_TCLAS_PROCESSING = 44, 466 WLAN_EID_TCLAS_PROCESSING = 44,
439 WLAN_EID_QOS_CAPA = 46, 467 WLAN_EID_QOS_CAPA = 46,
468 /* 802.11s */
469 WLAN_EID_MESH_CONFIG = 36, /* Pending IEEE 802.11 ANA approval */
470 WLAN_EID_MESH_ID = 37, /* Pending IEEE 802.11 ANA approval */
471 WLAN_EID_PEER_LINK = 40, /* Pending IEEE 802.11 ANA approval */
472 WLAN_EID_PREQ = 53, /* Pending IEEE 802.11 ANA approval */
473 WLAN_EID_PREP = 54, /* Pending IEEE 802.11 ANA approval */
474 WLAN_EID_PERR = 55, /* Pending IEEE 802.11 ANA approval */
440 /* 802.11h */ 475 /* 802.11h */
441 WLAN_EID_PWR_CONSTRAINT = 32, 476 WLAN_EID_PWR_CONSTRAINT = 32,
442 WLAN_EID_PWR_CAPABILITY = 33, 477 WLAN_EID_PWR_CAPABILITY = 33,
diff --git a/include/linux/if_arp.h b/include/linux/if_arp.h
index 296e8e86e91d..4d3401812e6c 100644
--- a/include/linux/if_arp.h
+++ b/include/linux/if_arp.h
@@ -156,6 +156,12 @@ static inline struct arphdr *arp_hdr(const struct sk_buff *skb)
156{ 156{
157 return (struct arphdr *)skb_network_header(skb); 157 return (struct arphdr *)skb_network_header(skb);
158} 158}
159
160static inline int arp_hdr_len(struct net_device *dev)
161{
162 /* ARP header, plus 2 device addresses, plus 2 IP addresses. */
163 return sizeof(struct arphdr) + (dev->addr_len + sizeof(u32)) * 2;
164}
159#endif 165#endif
160 166
161#endif /* _LINUX_IF_ARP_H */ 167#endif /* _LINUX_IF_ARP_H */
diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h
index 79504b22a932..edd55af7ebd6 100644
--- a/include/linux/if_vlan.h
+++ b/include/linux/if_vlan.h
@@ -93,7 +93,7 @@ static inline struct net_device *vlan_group_get_device(struct vlan_group *vg,
93{ 93{
94 struct net_device **array; 94 struct net_device **array;
95 array = vg->vlan_devices_arrays[vlan_id / VLAN_GROUP_ARRAY_PART_LEN]; 95 array = vg->vlan_devices_arrays[vlan_id / VLAN_GROUP_ARRAY_PART_LEN];
96 return array[vlan_id % VLAN_GROUP_ARRAY_PART_LEN]; 96 return array ? array[vlan_id % VLAN_GROUP_ARRAY_PART_LEN] : NULL;
97} 97}
98 98
99static inline void vlan_group_set_device(struct vlan_group *vg, 99static inline void vlan_group_set_device(struct vlan_group *vg,
diff --git a/include/linux/igmp.h b/include/linux/igmp.h
index f510e7e382a8..f5a1a0db2e8e 100644
--- a/include/linux/igmp.h
+++ b/include/linux/igmp.h
@@ -80,27 +80,6 @@ struct igmpv3_query {
80 __be32 srcs[0]; 80 __be32 srcs[0];
81}; 81};
82 82
83#ifdef __KERNEL__
84#include <linux/skbuff.h>
85
86static inline struct igmphdr *igmp_hdr(const struct sk_buff *skb)
87{
88 return (struct igmphdr *)skb_transport_header(skb);
89}
90
91static inline struct igmpv3_report *
92 igmpv3_report_hdr(const struct sk_buff *skb)
93{
94 return (struct igmpv3_report *)skb_transport_header(skb);
95}
96
97static inline struct igmpv3_query *
98 igmpv3_query_hdr(const struct sk_buff *skb)
99{
100 return (struct igmpv3_query *)skb_transport_header(skb);
101}
102#endif
103
104#define IGMP_HOST_MEMBERSHIP_QUERY 0x11 /* From RFC1112 */ 83#define IGMP_HOST_MEMBERSHIP_QUERY 0x11 /* From RFC1112 */
105#define IGMP_HOST_MEMBERSHIP_REPORT 0x12 /* Ditto */ 84#define IGMP_HOST_MEMBERSHIP_REPORT 0x12 /* Ditto */
106#define IGMP_DVMRP 0x13 /* DVMRP routing */ 85#define IGMP_DVMRP 0x13 /* DVMRP routing */
@@ -151,6 +130,23 @@ static inline struct igmpv3_query *
151#include <linux/timer.h> 130#include <linux/timer.h>
152#include <linux/in.h> 131#include <linux/in.h>
153 132
133static inline struct igmphdr *igmp_hdr(const struct sk_buff *skb)
134{
135 return (struct igmphdr *)skb_transport_header(skb);
136}
137
138static inline struct igmpv3_report *
139 igmpv3_report_hdr(const struct sk_buff *skb)
140{
141 return (struct igmpv3_report *)skb_transport_header(skb);
142}
143
144static inline struct igmpv3_query *
145 igmpv3_query_hdr(const struct sk_buff *skb)
146{
147 return (struct igmpv3_query *)skb_transport_header(skb);
148}
149
154extern int sysctl_igmp_max_memberships; 150extern int sysctl_igmp_max_memberships;
155extern int sysctl_igmp_max_msf; 151extern int sysctl_igmp_max_msf;
156 152
diff --git a/include/linux/in6.h b/include/linux/in6.h
index 2a61c82af115..f674000c6c99 100644
--- a/include/linux/in6.h
+++ b/include/linux/in6.h
@@ -249,4 +249,15 @@ struct in6_flowlabel_req
249 * IP6T_SO_GET_REVISION_TARGET 69 249 * IP6T_SO_GET_REVISION_TARGET 69
250 */ 250 */
251 251
252/* RFC5014: Source address selection */
253#define IPV6_ADDR_PREFERENCES 72
254
255#define IPV6_PREFER_SRC_TMP 0x0001
256#define IPV6_PREFER_SRC_PUBLIC 0x0002
257#define IPV6_PREFER_SRC_PUBTMP_DEFAULT 0x0100
258#define IPV6_PREFER_SRC_COA 0x0004
259#define IPV6_PREFER_SRC_HOME 0x0400
260#define IPV6_PREFER_SRC_CGA 0x0008
261#define IPV6_PREFER_SRC_NONCGA 0x0800
262
252#endif 263#endif
diff --git a/include/linux/inetdevice.h b/include/linux/inetdevice.h
index fc4e3db649e8..7009b0cdd06f 100644
--- a/include/linux/inetdevice.h
+++ b/include/linux/inetdevice.h
@@ -70,13 +70,13 @@ static inline void ipv4_devconf_setall(struct in_device *in_dev)
70 ipv4_devconf_set((in_dev), NET_IPV4_CONF_ ## attr, (val)) 70 ipv4_devconf_set((in_dev), NET_IPV4_CONF_ ## attr, (val))
71 71
72#define IN_DEV_ANDCONF(in_dev, attr) \ 72#define IN_DEV_ANDCONF(in_dev, attr) \
73 (IPV4_DEVCONF_ALL(in_dev->dev->nd_net, attr) && \ 73 (IPV4_DEVCONF_ALL(dev_net(in_dev->dev), attr) && \
74 IN_DEV_CONF_GET((in_dev), attr)) 74 IN_DEV_CONF_GET((in_dev), attr))
75#define IN_DEV_ORCONF(in_dev, attr) \ 75#define IN_DEV_ORCONF(in_dev, attr) \
76 (IPV4_DEVCONF_ALL(in_dev->dev->nd_net, attr) || \ 76 (IPV4_DEVCONF_ALL(dev_net(in_dev->dev), attr) || \
77 IN_DEV_CONF_GET((in_dev), attr)) 77 IN_DEV_CONF_GET((in_dev), attr))
78#define IN_DEV_MAXCONF(in_dev, attr) \ 78#define IN_DEV_MAXCONF(in_dev, attr) \
79 (max(IPV4_DEVCONF_ALL(in_dev->dev->nd_net, attr), \ 79 (max(IPV4_DEVCONF_ALL(dev_net(in_dev->dev), attr), \
80 IN_DEV_CONF_GET((in_dev), attr))) 80 IN_DEV_CONF_GET((in_dev), attr)))
81 81
82#define IN_DEV_FORWARD(in_dev) IN_DEV_CONF_GET((in_dev), FORWARDING) 82#define IN_DEV_FORWARD(in_dev) IN_DEV_CONF_GET((in_dev), FORWARDING)
@@ -129,7 +129,7 @@ extern int unregister_inetaddr_notifier(struct notifier_block *nb);
129 129
130extern struct net_device *ip_dev_find(struct net *net, __be32 addr); 130extern struct net_device *ip_dev_find(struct net *net, __be32 addr);
131extern int inet_addr_onlink(struct in_device *in_dev, __be32 a, __be32 b); 131extern int inet_addr_onlink(struct in_device *in_dev, __be32 a, __be32 b);
132extern int devinet_ioctl(unsigned int cmd, void __user *); 132extern int devinet_ioctl(struct net *net, unsigned int cmd, void __user *);
133extern void devinet_init(void); 133extern void devinet_init(void);
134extern struct in_device *inetdev_by_index(struct net *, int); 134extern struct in_device *inetdev_by_index(struct net *, int);
135extern __be32 inet_select_addr(const struct net_device *dev, __be32 dst, int scope); 135extern __be32 inet_select_addr(const struct net_device *dev, __be32 dst, int scope);
diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h
index 4aaefc349a4b..b90d3d461d4e 100644
--- a/include/linux/ipv6.h
+++ b/include/linux/ipv6.h
@@ -274,8 +274,29 @@ struct ipv6_pinfo {
274 274
275 __be32 flow_label; 275 __be32 flow_label;
276 __u32 frag_size; 276 __u32 frag_size;
277 __s16 hop_limit; 277
278 __s16 mcast_hops; 278 /*
279 * Packed in 16bits.
280 * Omit one shift by by putting the signed field at MSB.
281 */
282#if defined(__BIG_ENDIAN_BITFIELD)
283 __s16 hop_limit:9;
284 __u16 __unused_1:7;
285#else
286 __u16 __unused_1:7;
287 __s16 hop_limit:9;
288#endif
289
290#if defined(__BIG_ENDIAN_BITFIELD)
291 /* Packed in 16bits. */
292 __s16 mcast_hops:9;
293 __u16 __unused_2:6,
294 mc_loop:1;
295#else
296 __u16 mc_loop:1,
297 __unused_2:6;
298 __s16 mcast_hops:9;
299#endif
279 int mcast_oif; 300 int mcast_oif;
280 301
281 /* pktoption flags */ 302 /* pktoption flags */
@@ -298,11 +319,14 @@ struct ipv6_pinfo {
298 } rxopt; 319 } rxopt;
299 320
300 /* sockopt flags */ 321 /* sockopt flags */
301 __u8 mc_loop:1, 322 __u8 recverr:1,
302 recverr:1,
303 sndflow:1, 323 sndflow:1,
304 pmtudisc:2, 324 pmtudisc:2,
305 ipv6only:1; 325 ipv6only:1,
326 srcprefs:3; /* 001: prefer temporary address
327 * 010: prefer public address
328 * 100: prefer care-of address
329 */
306 __u8 tclass; 330 __u8 tclass;
307 331
308 __u32 dst_cookie; 332 __u32 dst_cookie;
@@ -315,9 +339,8 @@ struct ipv6_pinfo {
315 struct sk_buff *pktoptions; 339 struct sk_buff *pktoptions;
316 struct { 340 struct {
317 struct ipv6_txoptions *opt; 341 struct ipv6_txoptions *opt;
318 struct rt6_info *rt; 342 u8 hop_limit;
319 int hop_limit; 343 u8 tclass;
320 int tclass;
321 } cork; 344 } cork;
322}; 345};
323 346
@@ -458,7 +481,7 @@ static inline struct raw6_sock *raw6_sk(const struct sock *sk)
458#endif /* defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) */ 481#endif /* defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) */
459 482
460#define INET6_MATCH(__sk, __net, __hash, __saddr, __daddr, __ports, __dif)\ 483#define INET6_MATCH(__sk, __net, __hash, __saddr, __daddr, __ports, __dif)\
461 (((__sk)->sk_hash == (__hash)) && ((__sk)->sk_net == (__net)) && \ 484 (((__sk)->sk_hash == (__hash)) && sock_net((__sk)) == (__net) && \
462 ((*((__portpair *)&(inet_sk(__sk)->dport))) == (__ports)) && \ 485 ((*((__portpair *)&(inet_sk(__sk)->dport))) == (__ports)) && \
463 ((__sk)->sk_family == AF_INET6) && \ 486 ((__sk)->sk_family == AF_INET6) && \
464 ipv6_addr_equal(&inet6_sk(__sk)->daddr, (__saddr)) && \ 487 ipv6_addr_equal(&inet6_sk(__sk)->daddr, (__saddr)) && \
@@ -466,7 +489,7 @@ static inline struct raw6_sock *raw6_sk(const struct sock *sk)
466 (!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if == (__dif)))) 489 (!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if == (__dif))))
467 490
468#define INET6_TW_MATCH(__sk, __net, __hash, __saddr, __daddr, __ports, __dif) \ 491#define INET6_TW_MATCH(__sk, __net, __hash, __saddr, __daddr, __ports, __dif) \
469 (((__sk)->sk_hash == (__hash)) && ((__sk)->sk_net == (__net)) && \ 492 (((__sk)->sk_hash == (__hash)) && sock_net((__sk)) == (__net) && \
470 (*((__portpair *)&(inet_twsk(__sk)->tw_dport)) == (__ports)) && \ 493 (*((__portpair *)&(inet_twsk(__sk)->tw_dport)) == (__ports)) && \
471 ((__sk)->sk_family == PF_INET6) && \ 494 ((__sk)->sk_family == PF_INET6) && \
472 (ipv6_addr_equal(&inet6_twsk(__sk)->tw_v6_daddr, (__saddr))) && \ 495 (ipv6_addr_equal(&inet6_twsk(__sk)->tw_v6_daddr, (__saddr))) && \
diff --git a/include/linux/net.h b/include/linux/net.h
index c414d90e647b..71f7dd559285 100644
--- a/include/linux/net.h
+++ b/include/linux/net.h
@@ -19,6 +19,7 @@
19#define _LINUX_NET_H 19#define _LINUX_NET_H
20 20
21#include <linux/wait.h> 21#include <linux/wait.h>
22#include <linux/socket.h>
22#include <asm/socket.h> 23#include <asm/socket.h>
23 24
24struct poll_table_struct; 25struct poll_table_struct;
@@ -26,7 +27,7 @@ struct pipe_inode_info;
26struct inode; 27struct inode;
27struct net; 28struct net;
28 29
29#define NPROTO 34 /* should be enough for now.. */ 30#define NPROTO AF_MAX
30 31
31#define SYS_SOCKET 1 /* sys_socket(2) */ 32#define SYS_SOCKET 1 /* sys_socket(2) */
32#define SYS_BIND 2 /* sys_bind(2) */ 33#define SYS_BIND 2 /* sys_bind(2) */
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index fae6a7ececdb..3b54f8a2c055 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -710,8 +710,10 @@ struct net_device
710 void (*poll_controller)(struct net_device *dev); 710 void (*poll_controller)(struct net_device *dev);
711#endif 711#endif
712 712
713#ifdef CONFIG_NET_NS
713 /* Network namespace this network device is inside */ 714 /* Network namespace this network device is inside */
714 struct net *nd_net; 715 struct net *nd_net;
716#endif
715 717
716 /* bridge stuff */ 718 /* bridge stuff */
717 struct net_bridge_port *br_port; 719 struct net_bridge_port *br_port;
@@ -726,6 +728,10 @@ struct net_device
726 /* rtnetlink link ops */ 728 /* rtnetlink link ops */
727 const struct rtnl_link_ops *rtnl_link_ops; 729 const struct rtnl_link_ops *rtnl_link_ops;
728 730
731 /* for setting kernel sock attribute on TCP connection setup */
732#define GSO_MAX_SIZE 65536
733 unsigned int gso_max_size;
734
729 /* The TX queue control structures */ 735 /* The TX queue control structures */
730 unsigned int egress_subqueue_count; 736 unsigned int egress_subqueue_count;
731 struct net_device_subqueue egress_subqueue[1]; 737 struct net_device_subqueue egress_subqueue[1];
@@ -735,6 +741,27 @@ struct net_device
735#define NETDEV_ALIGN 32 741#define NETDEV_ALIGN 32
736#define NETDEV_ALIGN_CONST (NETDEV_ALIGN - 1) 742#define NETDEV_ALIGN_CONST (NETDEV_ALIGN - 1)
737 743
744/*
745 * Net namespace inlines
746 */
747static inline
748struct net *dev_net(const struct net_device *dev)
749{
750#ifdef CONFIG_NET_NS
751 return dev->nd_net;
752#else
753 return &init_net;
754#endif
755}
756
757static inline
758void dev_net_set(struct net_device *dev, struct net *net)
759{
760#ifdef CONFIG_NET_NS
761 dev->nd_net = net;
762#endif
763}
764
738/** 765/**
739 * netdev_priv - access network device private data 766 * netdev_priv - access network device private data
740 * @dev: network device 767 * @dev: network device
@@ -811,7 +838,7 @@ static inline struct net_device *next_net_device(struct net_device *dev)
811 struct list_head *lh; 838 struct list_head *lh;
812 struct net *net; 839 struct net *net;
813 840
814 net = dev->nd_net; 841 net = dev_net(dev);
815 lh = dev->dev_list.next; 842 lh = dev->dev_list.next;
816 return lh == &net->dev_base_head ? NULL : net_device_entry(lh); 843 return lh == &net->dev_base_head ? NULL : net_device_entry(lh);
817} 844}
@@ -1477,6 +1504,12 @@ static inline int netif_needs_gso(struct net_device *dev, struct sk_buff *skb)
1477 unlikely(skb->ip_summed != CHECKSUM_PARTIAL)); 1504 unlikely(skb->ip_summed != CHECKSUM_PARTIAL));
1478} 1505}
1479 1506
1507static inline void netif_set_gso_max_size(struct net_device *dev,
1508 unsigned int size)
1509{
1510 dev->gso_max_size = size;
1511}
1512
1480/* On bonding slaves other than the currently active slave, suppress 1513/* On bonding slaves other than the currently active slave, suppress
1481 * duplicates except for 802.3ad ETH_P_SLOW, alb non-mcast/bcast, and 1514 * duplicates except for 802.3ad ETH_P_SLOW, alb non-mcast/bcast, and
1482 * ARP on active-backup slaves with arp_validate enabled. 1515 * ARP on active-backup slaves with arp_validate enabled.
diff --git a/include/linux/netfilter.h b/include/linux/netfilter.h
index f0680c2bee73..89e6c72ad295 100644
--- a/include/linux/netfilter.h
+++ b/include/linux/netfilter.h
@@ -61,6 +61,15 @@ union nf_inet_addr {
61#ifdef __KERNEL__ 61#ifdef __KERNEL__
62#ifdef CONFIG_NETFILTER 62#ifdef CONFIG_NETFILTER
63 63
64static inline int nf_inet_addr_cmp(const union nf_inet_addr *a1,
65 const union nf_inet_addr *a2)
66{
67 return a1->all[0] == a2->all[0] &&
68 a1->all[1] == a2->all[1] &&
69 a1->all[2] == a2->all[2] &&
70 a1->all[3] == a2->all[3];
71}
72
64extern void netfilter_init(void); 73extern void netfilter_init(void);
65 74
66/* Largest hook number + 1 */ 75/* Largest hook number + 1 */
diff --git a/include/linux/netfilter/nf_conntrack_sip.h b/include/linux/netfilter/nf_conntrack_sip.h
index 8e5ce1ca7bfc..5da04e586a3f 100644
--- a/include/linux/netfilter/nf_conntrack_sip.h
+++ b/include/linux/netfilter/nf_conntrack_sip.h
@@ -5,37 +5,164 @@
5#define SIP_PORT 5060 5#define SIP_PORT 5060
6#define SIP_TIMEOUT 3600 6#define SIP_TIMEOUT 3600
7 7
8enum sip_header_pos { 8struct nf_ct_sip_master {
9 POS_REG_REQ_URI, 9 unsigned int register_cseq;
10 POS_REQ_URI, 10};
11 POS_FROM, 11
12 POS_TO, 12enum sip_expectation_classes {
13 POS_VIA, 13 SIP_EXPECT_SIGNALLING,
14 POS_CONTACT, 14 SIP_EXPECT_AUDIO,
15 POS_CONTENT, 15 SIP_EXPECT_VIDEO,
16 POS_MEDIA, 16 __SIP_EXPECT_MAX
17 POS_OWNER_IP4, 17};
18 POS_CONNECTION_IP4, 18#define SIP_EXPECT_MAX (__SIP_EXPECT_MAX - 1)
19 POS_OWNER_IP6, 19
20 POS_CONNECTION_IP6, 20struct sdp_media_type {
21 POS_SDP_HEADER, 21 const char *name;
22 unsigned int len;
23 enum sip_expectation_classes class;
24};
25
26#define SDP_MEDIA_TYPE(__name, __class) \
27{ \
28 .name = (__name), \
29 .len = sizeof(__name) - 1, \
30 .class = (__class), \
31}
32
33struct sip_handler {
34 const char *method;
35 unsigned int len;
36 int (*request)(struct sk_buff *skb,
37 const char **dptr, unsigned int *datalen,
38 unsigned int cseq);
39 int (*response)(struct sk_buff *skb,
40 const char **dptr, unsigned int *datalen,
41 unsigned int cseq, unsigned int code);
42};
43
44#define SIP_HANDLER(__method, __request, __response) \
45{ \
46 .method = (__method), \
47 .len = sizeof(__method) - 1, \
48 .request = (__request), \
49 .response = (__response), \
50}
51
52struct sip_header {
53 const char *name;
54 const char *cname;
55 const char *search;
56 unsigned int len;
57 unsigned int clen;
58 unsigned int slen;
59 int (*match_len)(const struct nf_conn *ct,
60 const char *dptr, const char *limit,
61 int *shift);
62};
63
64#define __SIP_HDR(__name, __cname, __search, __match) \
65{ \
66 .name = (__name), \
67 .len = sizeof(__name) - 1, \
68 .cname = (__cname), \
69 .clen = (__cname) ? sizeof(__cname) - 1 : 0, \
70 .search = (__search), \
71 .slen = (__search) ? sizeof(__search) - 1 : 0, \
72 .match_len = (__match), \
73}
74
75#define SIP_HDR(__name, __cname, __search, __match) \
76 __SIP_HDR(__name, __cname, __search, __match)
77
78#define SDP_HDR(__name, __search, __match) \
79 __SIP_HDR(__name, NULL, __search, __match)
80
81enum sip_header_types {
82 SIP_HDR_CSEQ,
83 SIP_HDR_FROM,
84 SIP_HDR_TO,
85 SIP_HDR_CONTACT,
86 SIP_HDR_VIA,
87 SIP_HDR_EXPIRES,
88 SIP_HDR_CONTENT_LENGTH,
89};
90
91enum sdp_header_types {
92 SDP_HDR_UNSPEC,
93 SDP_HDR_VERSION,
94 SDP_HDR_OWNER_IP4,
95 SDP_HDR_CONNECTION_IP4,
96 SDP_HDR_OWNER_IP6,
97 SDP_HDR_CONNECTION_IP6,
98 SDP_HDR_MEDIA,
22}; 99};
23 100
24extern unsigned int (*nf_nat_sip_hook)(struct sk_buff *skb, 101extern unsigned int (*nf_nat_sip_hook)(struct sk_buff *skb,
25 enum ip_conntrack_info ctinfo, 102 const char **dptr,
26 struct nf_conn *ct, 103 unsigned int *datalen);
27 const char **dptr); 104extern unsigned int (*nf_nat_sip_expect_hook)(struct sk_buff *skb,
28extern unsigned int (*nf_nat_sdp_hook)(struct sk_buff *skb, 105 const char **dptr,
29 enum ip_conntrack_info ctinfo, 106 unsigned int *datalen,
30 struct nf_conntrack_expect *exp, 107 struct nf_conntrack_expect *exp,
31 const char *dptr); 108 unsigned int matchoff,
32 109 unsigned int matchlen);
33extern int ct_sip_get_info(const struct nf_conn *ct, const char *dptr, 110extern unsigned int (*nf_nat_sdp_addr_hook)(struct sk_buff *skb,
34 size_t dlen, unsigned int *matchoff, 111 const char **dptr,
35 unsigned int *matchlen, enum sip_header_pos pos); 112 unsigned int dataoff,
36extern int ct_sip_lnlen(const char *line, const char *limit); 113 unsigned int *datalen,
37extern const char *ct_sip_search(const char *needle, const char *haystack, 114 enum sdp_header_types type,
38 size_t needle_len, size_t haystack_len, 115 enum sdp_header_types term,
39 int case_sensitive); 116 const union nf_inet_addr *addr);
117extern unsigned int (*nf_nat_sdp_port_hook)(struct sk_buff *skb,
118 const char **dptr,
119 unsigned int *datalen,
120 unsigned int matchoff,
121 unsigned int matchlen,
122 u_int16_t port);
123extern unsigned int (*nf_nat_sdp_session_hook)(struct sk_buff *skb,
124 const char **dptr,
125 unsigned int dataoff,
126 unsigned int *datalen,
127 const union nf_inet_addr *addr);
128extern unsigned int (*nf_nat_sdp_media_hook)(struct sk_buff *skb,
129 const char **dptr,
130 unsigned int *datalen,
131 struct nf_conntrack_expect *rtp_exp,
132 struct nf_conntrack_expect *rtcp_exp,
133 unsigned int mediaoff,
134 unsigned int medialen,
135 union nf_inet_addr *rtp_addr);
136
137extern int ct_sip_parse_request(const struct nf_conn *ct,
138 const char *dptr, unsigned int datalen,
139 unsigned int *matchoff, unsigned int *matchlen,
140 union nf_inet_addr *addr, __be16 *port);
141extern int ct_sip_get_header(const struct nf_conn *ct, const char *dptr,
142 unsigned int dataoff, unsigned int datalen,
143 enum sip_header_types type,
144 unsigned int *matchoff, unsigned int *matchlen);
145extern int ct_sip_parse_header_uri(const struct nf_conn *ct, const char *dptr,
146 unsigned int *dataoff, unsigned int datalen,
147 enum sip_header_types type, int *in_header,
148 unsigned int *matchoff, unsigned int *matchlen,
149 union nf_inet_addr *addr, __be16 *port);
150extern int ct_sip_parse_address_param(const struct nf_conn *ct, const char *dptr,
151 unsigned int dataoff, unsigned int datalen,
152 const char *name,
153 unsigned int *matchoff, unsigned int *matchlen,
154 union nf_inet_addr *addr);
155extern int ct_sip_parse_numerical_param(const struct nf_conn *ct, const char *dptr,
156 unsigned int off, unsigned int datalen,
157 const char *name,
158 unsigned int *matchoff, unsigned int *matchen,
159 unsigned int *val);
160
161extern int ct_sip_get_sdp_header(const struct nf_conn *ct, const char *dptr,
162 unsigned int dataoff, unsigned int datalen,
163 enum sdp_header_types type,
164 enum sdp_header_types term,
165 unsigned int *matchoff, unsigned int *matchlen);
166
40#endif /* __KERNEL__ */ 167#endif /* __KERNEL__ */
41#endif /* __NF_CONNTRACK_SIP_H__ */ 168#endif /* __NF_CONNTRACK_SIP_H__ */
diff --git a/include/linux/nl80211.h b/include/linux/nl80211.h
index 9fecf902419c..ea6517e58b04 100644
--- a/include/linux/nl80211.h
+++ b/include/linux/nl80211.h
@@ -78,6 +78,18 @@
78 * or, if no MAC address given, all stations, on the interface identified 78 * or, if no MAC address given, all stations, on the interface identified
79 * by %NL80211_ATTR_IFINDEX. 79 * by %NL80211_ATTR_IFINDEX.
80 * 80 *
81 * @NL80211_CMD_GET_MPATH: Get mesh path attributes for mesh path to
82 * destination %NL80211_ATTR_MAC on the interface identified by
83 * %NL80211_ATTR_IFINDEX.
84 * @NL80211_CMD_SET_MPATH: Set mesh path attributes for mesh path to
85 * destination %NL80211_ATTR_MAC on the interface identified by
86 * %NL80211_ATTR_IFINDEX.
87 * @NL80211_CMD_NEW_PATH: Add a mesh path with given attributes to the
88 * the interface identified by %NL80211_ATTR_IFINDEX.
89 * @NL80211_CMD_DEL_PATH: Remove a mesh path identified by %NL80211_ATTR_MAC
90 * or, if no MAC address given, all mesh paths, on the interface identified
91 * by %NL80211_ATTR_IFINDEX.
92 *
81 * @NL80211_CMD_MAX: highest used command number 93 * @NL80211_CMD_MAX: highest used command number
82 * @__NL80211_CMD_AFTER_LAST: internal use 94 * @__NL80211_CMD_AFTER_LAST: internal use
83 */ 95 */
@@ -112,6 +124,11 @@ enum nl80211_commands {
112 124
113 /* add commands here */ 125 /* add commands here */
114 126
127 NL80211_CMD_GET_MPATH,
128 NL80211_CMD_SET_MPATH,
129 NL80211_CMD_NEW_MPATH,
130 NL80211_CMD_DEL_MPATH,
131
115 /* used to define NL80211_CMD_MAX below */ 132 /* used to define NL80211_CMD_MAX below */
116 __NL80211_CMD_AFTER_LAST, 133 __NL80211_CMD_AFTER_LAST,
117 NL80211_CMD_MAX = __NL80211_CMD_AFTER_LAST - 1 134 NL80211_CMD_MAX = __NL80211_CMD_AFTER_LAST - 1
@@ -157,9 +174,23 @@ enum nl80211_commands {
157 * restriction (at most %NL80211_MAX_SUPP_RATES). 174 * restriction (at most %NL80211_MAX_SUPP_RATES).
158 * @NL80211_ATTR_STA_VLAN: interface index of VLAN interface to move station 175 * @NL80211_ATTR_STA_VLAN: interface index of VLAN interface to move station
159 * to, or the AP interface the station was originally added to to. 176 * to, or the AP interface the station was originally added to to.
160 * @NL80211_ATTR_STA_STATS: statistics for a station, part of station info 177 * @NL80211_ATTR_STA_INFO: information about a station, part of station info
161 * given for %NL80211_CMD_GET_STATION, nested attribute containing 178 * given for %NL80211_CMD_GET_STATION, nested attribute containing
162 * info as possible, see &enum nl80211_sta_stats. 179 * info as possible, see &enum nl80211_sta_info.
180 *
181 * @NL80211_ATTR_WIPHY_BANDS: Information about an operating bands,
182 * consisting of a nested array.
183 *
184 * @NL80211_ATTR_MESH_ID: mesh id (1-32 bytes).
185 * @NL80211_ATTR_PLINK_ACTION: action to perform on the mesh peer link.
186 * @NL80211_ATTR_MPATH_NEXT_HOP: MAC address of the next hop for a mesh path.
187 * @NL80211_ATTR_MPATH_INFO: information about a mesh_path, part of mesh path
188 * info given for %NL80211_CMD_GET_MPATH, nested attribute described at
189 * &enum nl80211_mpath_info.
190 *
191 *
192 * @NL80211_ATTR_MNTR_FLAGS: flags, nested element with NLA_FLAG attributes of
193 * &enum nl80211_mntr_flags.
163 * 194 *
164 * @NL80211_ATTR_MAX: highest attribute number currently defined 195 * @NL80211_ATTR_MAX: highest attribute number currently defined
165 * @__NL80211_ATTR_AFTER_LAST: internal use 196 * @__NL80211_ATTR_AFTER_LAST: internal use
@@ -193,10 +224,19 @@ enum nl80211_attrs {
193 NL80211_ATTR_STA_LISTEN_INTERVAL, 224 NL80211_ATTR_STA_LISTEN_INTERVAL,
194 NL80211_ATTR_STA_SUPPORTED_RATES, 225 NL80211_ATTR_STA_SUPPORTED_RATES,
195 NL80211_ATTR_STA_VLAN, 226 NL80211_ATTR_STA_VLAN,
196 NL80211_ATTR_STA_STATS, 227 NL80211_ATTR_STA_INFO,
228
229 NL80211_ATTR_WIPHY_BANDS,
230
231 NL80211_ATTR_MNTR_FLAGS,
197 232
198 /* add attributes here, update the policy in nl80211.c */ 233 /* add attributes here, update the policy in nl80211.c */
199 234
235 NL80211_ATTR_MESH_ID,
236 NL80211_ATTR_STA_PLINK_ACTION,
237 NL80211_ATTR_MPATH_NEXT_HOP,
238 NL80211_ATTR_MPATH_INFO,
239
200 __NL80211_ATTR_AFTER_LAST, 240 __NL80211_ATTR_AFTER_LAST,
201 NL80211_ATTR_MAX = __NL80211_ATTR_AFTER_LAST - 1 241 NL80211_ATTR_MAX = __NL80211_ATTR_AFTER_LAST - 1
202}; 242};
@@ -213,6 +253,7 @@ enum nl80211_attrs {
213 * @NL80211_IFTYPE_AP_VLAN: VLAN interface for access points 253 * @NL80211_IFTYPE_AP_VLAN: VLAN interface for access points
214 * @NL80211_IFTYPE_WDS: wireless distribution interface 254 * @NL80211_IFTYPE_WDS: wireless distribution interface
215 * @NL80211_IFTYPE_MONITOR: monitor interface receiving all frames 255 * @NL80211_IFTYPE_MONITOR: monitor interface receiving all frames
256 * @NL80211_IFTYPE_MESH_POINT: mesh point
216 * @NL80211_IFTYPE_MAX: highest interface type number currently defined 257 * @NL80211_IFTYPE_MAX: highest interface type number currently defined
217 * @__NL80211_IFTYPE_AFTER_LAST: internal use 258 * @__NL80211_IFTYPE_AFTER_LAST: internal use
218 * 259 *
@@ -228,6 +269,7 @@ enum nl80211_iftype {
228 NL80211_IFTYPE_AP_VLAN, 269 NL80211_IFTYPE_AP_VLAN,
229 NL80211_IFTYPE_WDS, 270 NL80211_IFTYPE_WDS,
230 NL80211_IFTYPE_MONITOR, 271 NL80211_IFTYPE_MONITOR,
272 NL80211_IFTYPE_MESH_POINT,
231 273
232 /* keep last */ 274 /* keep last */
233 __NL80211_IFTYPE_AFTER_LAST, 275 __NL80211_IFTYPE_AFTER_LAST,
@@ -257,27 +299,167 @@ enum nl80211_sta_flags {
257}; 299};
258 300
259/** 301/**
260 * enum nl80211_sta_stats - station statistics 302 * enum nl80211_sta_info - station information
261 * 303 *
262 * These attribute types are used with %NL80211_ATTR_STA_STATS 304 * These attribute types are used with %NL80211_ATTR_STA_INFO
263 * when getting information about a station. 305 * when getting information about a station.
264 * 306 *
265 * @__NL80211_STA_STAT_INVALID: attribute number 0 is reserved 307 * @__NL80211_STA_INFO_INVALID: attribute number 0 is reserved
266 * @NL80211_STA_STAT_INACTIVE_TIME: time since last activity (u32, msecs) 308 * @NL80211_STA_INFO_INACTIVE_TIME: time since last activity (u32, msecs)
267 * @NL80211_STA_STAT_RX_BYTES: total received bytes (u32, from this station) 309 * @NL80211_STA_INFO_RX_BYTES: total received bytes (u32, from this station)
268 * @NL80211_STA_STAT_TX_BYTES: total transmitted bytes (u32, to this station) 310 * @NL80211_STA_INFO_TX_BYTES: total transmitted bytes (u32, to this station)
269 * @__NL80211_STA_STAT_AFTER_LAST: internal 311 * @__NL80211_STA_INFO_AFTER_LAST: internal
270 * @NL80211_STA_STAT_MAX: highest possible station stats attribute 312 * @NL80211_STA_INFO_MAX: highest possible station info attribute
313 */
314enum nl80211_sta_info {
315 __NL80211_STA_INFO_INVALID,
316 NL80211_STA_INFO_INACTIVE_TIME,
317 NL80211_STA_INFO_RX_BYTES,
318 NL80211_STA_INFO_TX_BYTES,
319 NL80211_STA_INFO_LLID,
320 NL80211_STA_INFO_PLID,
321 NL80211_STA_INFO_PLINK_STATE,
322
323 /* keep last */
324 __NL80211_STA_INFO_AFTER_LAST,
325 NL80211_STA_INFO_MAX = __NL80211_STA_INFO_AFTER_LAST - 1
326};
327
328/**
329 * enum nl80211_mpath_flags - nl80211 mesh path flags
330 *
331 * @NL80211_MPATH_FLAG_ACTIVE: the mesh path is active
332 * @NL80211_MPATH_FLAG_RESOLVING: the mesh path discovery process is running
333 * @NL80211_MPATH_FLAG_DSN_VALID: the mesh path contains a valid DSN
334 * @NL80211_MPATH_FLAG_FIXED: the mesh path has been manually set
335 * @NL80211_MPATH_FLAG_RESOLVED: the mesh path discovery process succeeded
336 */
337enum nl80211_mpath_flags {
338 NL80211_MPATH_FLAG_ACTIVE = 1<<0,
339 NL80211_MPATH_FLAG_RESOLVING = 1<<1,
340 NL80211_MPATH_FLAG_DSN_VALID = 1<<2,
341 NL80211_MPATH_FLAG_FIXED = 1<<3,
342 NL80211_MPATH_FLAG_RESOLVED = 1<<4,
343};
344
345/**
346 * enum nl80211_mpath_info - mesh path information
347 *
348 * These attribute types are used with %NL80211_ATTR_MPATH_INFO when getting
349 * information about a mesh path.
350 *
351 * @__NL80211_MPATH_INFO_INVALID: attribute number 0 is reserved
352 * @NL80211_ATTR_MPATH_FRAME_QLEN: number of queued frames for this destination
353 * @NL80211_ATTR_MPATH_DSN: destination sequence number
354 * @NL80211_ATTR_MPATH_METRIC: metric (cost) of this mesh path
355 * @NL80211_ATTR_MPATH_EXPTIME: expiration time for the path, in msec from now
356 * @NL80211_ATTR_MPATH_FLAGS: mesh path flags, enumerated in
357 * &enum nl80211_mpath_flags;
358 * @NL80211_ATTR_MPATH_DISCOVERY_TIMEOUT: total path discovery timeout, in msec
359 * @NL80211_ATTR_MPATH_DISCOVERY_RETRIES: mesh path discovery retries
360 */
361enum nl80211_mpath_info {
362 __NL80211_MPATH_INFO_INVALID,
363 NL80211_MPATH_INFO_FRAME_QLEN,
364 NL80211_MPATH_INFO_DSN,
365 NL80211_MPATH_INFO_METRIC,
366 NL80211_MPATH_INFO_EXPTIME,
367 NL80211_MPATH_INFO_FLAGS,
368 NL80211_MPATH_INFO_DISCOVERY_TIMEOUT,
369 NL80211_MPATH_INFO_DISCOVERY_RETRIES,
370
371 /* keep last */
372 __NL80211_MPATH_INFO_AFTER_LAST,
373 NL80211_MPATH_INFO_MAX = __NL80211_MPATH_INFO_AFTER_LAST - 1
374};
375
376/**
377 * enum nl80211_band_attr - band attributes
378 * @__NL80211_BAND_ATTR_INVALID: attribute number 0 is reserved
379 * @NL80211_BAND_ATTR_FREQS: supported frequencies in this band,
380 * an array of nested frequency attributes
381 * @NL80211_BAND_ATTR_RATES: supported bitrates in this band,
382 * an array of nested bitrate attributes
383 */
384enum nl80211_band_attr {
385 __NL80211_BAND_ATTR_INVALID,
386 NL80211_BAND_ATTR_FREQS,
387 NL80211_BAND_ATTR_RATES,
388
389 /* keep last */
390 __NL80211_BAND_ATTR_AFTER_LAST,
391 NL80211_BAND_ATTR_MAX = __NL80211_BAND_ATTR_AFTER_LAST - 1
392};
393
394/**
395 * enum nl80211_frequency_attr - frequency attributes
396 * @NL80211_FREQUENCY_ATTR_FREQ: Frequency in MHz
397 * @NL80211_FREQUENCY_ATTR_DISABLED: Channel is disabled in current
398 * regulatory domain.
399 * @NL80211_FREQUENCY_ATTR_PASSIVE_SCAN: Only passive scanning is
400 * permitted on this channel in current regulatory domain.
401 * @NL80211_FREQUENCY_ATTR_NO_IBSS: IBSS networks are not permitted
402 * on this channel in current regulatory domain.
403 * @NL80211_FREQUENCY_ATTR_RADAR: Radar detection is mandatory
404 * on this channel in current regulatory domain.
405 */
406enum nl80211_frequency_attr {
407 __NL80211_FREQUENCY_ATTR_INVALID,
408 NL80211_FREQUENCY_ATTR_FREQ,
409 NL80211_FREQUENCY_ATTR_DISABLED,
410 NL80211_FREQUENCY_ATTR_PASSIVE_SCAN,
411 NL80211_FREQUENCY_ATTR_NO_IBSS,
412 NL80211_FREQUENCY_ATTR_RADAR,
413
414 /* keep last */
415 __NL80211_FREQUENCY_ATTR_AFTER_LAST,
416 NL80211_FREQUENCY_ATTR_MAX = __NL80211_FREQUENCY_ATTR_AFTER_LAST - 1
417};
418
419/**
420 * enum nl80211_bitrate_attr - bitrate attributes
421 * @NL80211_BITRATE_ATTR_RATE: Bitrate in units of 100 kbps
422 * @NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE: Short preamble supported
423 * in 2.4 GHz band.
424 */
425enum nl80211_bitrate_attr {
426 __NL80211_BITRATE_ATTR_INVALID,
427 NL80211_BITRATE_ATTR_RATE,
428 NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE,
429
430 /* keep last */
431 __NL80211_BITRATE_ATTR_AFTER_LAST,
432 NL80211_BITRATE_ATTR_MAX = __NL80211_BITRATE_ATTR_AFTER_LAST - 1
433};
434
435/**
436 * enum nl80211_mntr_flags - monitor configuration flags
437 *
438 * Monitor configuration flags.
439 *
440 * @__NL80211_MNTR_FLAG_INVALID: reserved
441 *
442 * @NL80211_MNTR_FLAG_FCSFAIL: pass frames with bad FCS
443 * @NL80211_MNTR_FLAG_PLCPFAIL: pass frames with bad PLCP
444 * @NL80211_MNTR_FLAG_CONTROL: pass control frames
445 * @NL80211_MNTR_FLAG_OTHER_BSS: disable BSSID filtering
446 * @NL80211_MNTR_FLAG_COOK_FRAMES: report frames after processing.
447 * overrides all other flags.
448 *
449 * @__NL80211_MNTR_FLAG_AFTER_LAST: internal use
450 * @NL80211_MNTR_FLAG_MAX: highest possible monitor flag
271 */ 451 */
272enum nl80211_sta_stats { 452enum nl80211_mntr_flags {
273 __NL80211_STA_STAT_INVALID, 453 __NL80211_MNTR_FLAG_INVALID,
274 NL80211_STA_STAT_INACTIVE_TIME, 454 NL80211_MNTR_FLAG_FCSFAIL,
275 NL80211_STA_STAT_RX_BYTES, 455 NL80211_MNTR_FLAG_PLCPFAIL,
276 NL80211_STA_STAT_TX_BYTES, 456 NL80211_MNTR_FLAG_CONTROL,
457 NL80211_MNTR_FLAG_OTHER_BSS,
458 NL80211_MNTR_FLAG_COOK_FRAMES,
277 459
278 /* keep last */ 460 /* keep last */
279 __NL80211_STA_STAT_AFTER_LAST, 461 __NL80211_MNTR_FLAG_AFTER_LAST,
280 NL80211_STA_STAT_MAX = __NL80211_STA_STAT_AFTER_LAST - 1 462 NL80211_MNTR_FLAG_MAX = __NL80211_MNTR_FLAG_AFTER_LAST - 1
281}; 463};
282 464
283#endif /* __LINUX_NL80211_H */ 465#endif /* __LINUX_NL80211_H */
diff --git a/include/linux/seq_file.h b/include/linux/seq_file.h
index 67c2563961f3..5da70c3f4417 100644
--- a/include/linux/seq_file.h
+++ b/include/linux/seq_file.h
@@ -5,6 +5,7 @@
5#include <linux/types.h> 5#include <linux/types.h>
6#include <linux/string.h> 6#include <linux/string.h>
7#include <linux/mutex.h> 7#include <linux/mutex.h>
8#include <net/net_namespace.h>
8 9
9struct seq_operations; 10struct seq_operations;
10struct file; 11struct file;
@@ -62,9 +63,12 @@ extern struct list_head *seq_list_start_head(struct list_head *head,
62extern struct list_head *seq_list_next(void *v, struct list_head *head, 63extern struct list_head *seq_list_next(void *v, struct list_head *head,
63 loff_t *ppos); 64 loff_t *ppos);
64 65
66#ifdef CONFIG_NET
65struct net; 67struct net;
66struct seq_net_private { 68struct seq_net_private {
69#ifdef CONFIG_NET_NS
67 struct net *net; 70 struct net *net;
71#endif
68}; 72};
69 73
70int seq_open_net(struct inode *, struct file *, 74int seq_open_net(struct inode *, struct file *,
@@ -72,8 +76,13 @@ int seq_open_net(struct inode *, struct file *,
72int seq_release_net(struct inode *, struct file *); 76int seq_release_net(struct inode *, struct file *);
73static inline struct net *seq_file_net(struct seq_file *seq) 77static inline struct net *seq_file_net(struct seq_file *seq)
74{ 78{
79#ifdef CONFIG_NET_NS
75 return ((struct seq_net_private *)seq->private)->net; 80 return ((struct seq_net_private *)seq->private)->net;
81#else
82 return &init_net;
83#endif
76} 84}
85#endif /* CONFIG_NET */
77 86
78#endif 87#endif
79#endif 88#endif
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index bbd8d0027e2f..ff72145d5d9e 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -256,7 +256,10 @@ struct sk_buff {
256 ktime_t tstamp; 256 ktime_t tstamp;
257 struct net_device *dev; 257 struct net_device *dev;
258 258
259 struct dst_entry *dst; 259 union {
260 struct dst_entry *dst;
261 struct rtable *rtable;
262 };
260 struct sec_path *sp; 263 struct sec_path *sp;
261 264
262 /* 265 /*
@@ -889,6 +892,7 @@ static inline void skb_set_tail_pointer(struct sk_buff *skb, const int offset)
889/* 892/*
890 * Add data to an sk_buff 893 * Add data to an sk_buff
891 */ 894 */
895extern unsigned char *skb_put(struct sk_buff *skb, unsigned int len);
892static inline unsigned char *__skb_put(struct sk_buff *skb, unsigned int len) 896static inline unsigned char *__skb_put(struct sk_buff *skb, unsigned int len)
893{ 897{
894 unsigned char *tmp = skb_tail_pointer(skb); 898 unsigned char *tmp = skb_tail_pointer(skb);
@@ -898,26 +902,7 @@ static inline unsigned char *__skb_put(struct sk_buff *skb, unsigned int len)
898 return tmp; 902 return tmp;
899} 903}
900 904
901/** 905extern unsigned char *skb_push(struct sk_buff *skb, unsigned int len);
902 * skb_put - add data to a buffer
903 * @skb: buffer to use
904 * @len: amount of data to add
905 *
906 * This function extends the used data area of the buffer. If this would
907 * exceed the total buffer size the kernel will panic. A pointer to the
908 * first byte of the extra data is returned.
909 */
910static inline unsigned char *skb_put(struct sk_buff *skb, unsigned int len)
911{
912 unsigned char *tmp = skb_tail_pointer(skb);
913 SKB_LINEAR_ASSERT(skb);
914 skb->tail += len;
915 skb->len += len;
916 if (unlikely(skb->tail > skb->end))
917 skb_over_panic(skb, len, current_text_addr());
918 return tmp;
919}
920
921static inline unsigned char *__skb_push(struct sk_buff *skb, unsigned int len) 906static inline unsigned char *__skb_push(struct sk_buff *skb, unsigned int len)
922{ 907{
923 skb->data -= len; 908 skb->data -= len;
@@ -925,24 +910,7 @@ static inline unsigned char *__skb_push(struct sk_buff *skb, unsigned int len)
925 return skb->data; 910 return skb->data;
926} 911}
927 912
928/** 913extern unsigned char *skb_pull(struct sk_buff *skb, unsigned int len);
929 * skb_push - add data to the start of a buffer
930 * @skb: buffer to use
931 * @len: amount of data to add
932 *
933 * This function extends the used data area of the buffer at the buffer
934 * start. If this would exceed the total buffer headroom the kernel will
935 * panic. A pointer to the first byte of the extra data is returned.
936 */
937static inline unsigned char *skb_push(struct sk_buff *skb, unsigned int len)
938{
939 skb->data -= len;
940 skb->len += len;
941 if (unlikely(skb->data<skb->head))
942 skb_under_panic(skb, len, current_text_addr());
943 return skb->data;
944}
945
946static inline unsigned char *__skb_pull(struct sk_buff *skb, unsigned int len) 914static inline unsigned char *__skb_pull(struct sk_buff *skb, unsigned int len)
947{ 915{
948 skb->len -= len; 916 skb->len -= len;
@@ -950,21 +918,6 @@ static inline unsigned char *__skb_pull(struct sk_buff *skb, unsigned int len)
950 return skb->data += len; 918 return skb->data += len;
951} 919}
952 920
953/**
954 * skb_pull - remove data from the start of a buffer
955 * @skb: buffer to use
956 * @len: amount of data to remove
957 *
958 * This function removes data from the start of a buffer, returning
959 * the memory to the headroom. A pointer to the next data in the buffer
960 * is returned. Once the data has been pulled future pushes will overwrite
961 * the old data.
962 */
963static inline unsigned char *skb_pull(struct sk_buff *skb, unsigned int len)
964{
965 return unlikely(len > skb->len) ? NULL : __skb_pull(skb, len);
966}
967
968extern unsigned char *__pskb_pull_tail(struct sk_buff *skb, int delta); 921extern unsigned char *__pskb_pull_tail(struct sk_buff *skb, int delta);
969 922
970static inline unsigned char *__pskb_pull(struct sk_buff *skb, unsigned int len) 923static inline unsigned char *__pskb_pull(struct sk_buff *skb, unsigned int len)
@@ -1205,21 +1158,7 @@ static inline void __skb_trim(struct sk_buff *skb, unsigned int len)
1205 skb_set_tail_pointer(skb, len); 1158 skb_set_tail_pointer(skb, len);
1206} 1159}
1207 1160
1208/** 1161extern void skb_trim(struct sk_buff *skb, unsigned int len);
1209 * skb_trim - remove end from a buffer
1210 * @skb: buffer to alter
1211 * @len: new length
1212 *
1213 * Cut the length of a buffer down by removing data from the tail. If
1214 * the buffer is already under the length specified it is not modified.
1215 * The skb must be linear.
1216 */
1217static inline void skb_trim(struct sk_buff *skb, unsigned int len)
1218{
1219 if (skb->len > len)
1220 __skb_trim(skb, len);
1221}
1222
1223 1162
1224static inline int __pskb_trim(struct sk_buff *skb, unsigned int len) 1163static inline int __pskb_trim(struct sk_buff *skb, unsigned int len)
1225{ 1164{
@@ -1302,22 +1241,7 @@ static inline struct sk_buff *__dev_alloc_skb(unsigned int length,
1302 return skb; 1241 return skb;
1303} 1242}
1304 1243
1305/** 1244extern struct sk_buff *dev_alloc_skb(unsigned int length);
1306 * dev_alloc_skb - allocate an skbuff for receiving
1307 * @length: length to allocate
1308 *
1309 * Allocate a new &sk_buff and assign it a usage count of one. The
1310 * buffer has unspecified headroom built in. Users should allocate
1311 * the headroom they think they need without accounting for the
1312 * built in space. The built in space is used for optimisations.
1313 *
1314 * %NULL is returned if there is no free memory. Although this function
1315 * allocates memory it can be called from an interrupt.
1316 */
1317static inline struct sk_buff *dev_alloc_skb(unsigned int length)
1318{
1319 return __dev_alloc_skb(length, GFP_ATOMIC);
1320}
1321 1245
1322extern struct sk_buff *__netdev_alloc_skb(struct net_device *dev, 1246extern struct sk_buff *__netdev_alloc_skb(struct net_device *dev,
1323 unsigned int length, gfp_t gfp_mask); 1247 unsigned int length, gfp_t gfp_mask);
diff --git a/include/linux/smc91x.h b/include/linux/smc91x.h
new file mode 100644
index 000000000000..8e0556b8781c
--- /dev/null
+++ b/include/linux/smc91x.h
@@ -0,0 +1,13 @@
1#ifndef __SMC91X_H__
2#define __SMC91X_H__
3
4#define SMC91X_USE_8BIT (1 << 0)
5#define SMC91X_USE_16BIT (1 << 1)
6#define SMC91X_USE_32BIT (1 << 2)
7
8struct smc91x_platdata {
9 unsigned long flags;
10 unsigned long irq_flags; /* IRQF_... */
11};
12
13#endif /* __SMC91X_H__ */
diff --git a/include/linux/ssb/ssb.h b/include/linux/ssb/ssb.h
index 20add65215af..8644e03cf588 100644
--- a/include/linux/ssb/ssb.h
+++ b/include/linux/ssb/ssb.h
@@ -72,8 +72,10 @@ struct ssb_device;
72/* Lowlevel read/write operations on the device MMIO. 72/* Lowlevel read/write operations on the device MMIO.
73 * Internal, don't use that outside of ssb. */ 73 * Internal, don't use that outside of ssb. */
74struct ssb_bus_ops { 74struct ssb_bus_ops {
75 u8 (*read8)(struct ssb_device *dev, u16 offset);
75 u16 (*read16)(struct ssb_device *dev, u16 offset); 76 u16 (*read16)(struct ssb_device *dev, u16 offset);
76 u32 (*read32)(struct ssb_device *dev, u16 offset); 77 u32 (*read32)(struct ssb_device *dev, u16 offset);
78 void (*write8)(struct ssb_device *dev, u16 offset, u8 value);
77 void (*write16)(struct ssb_device *dev, u16 offset, u16 value); 79 void (*write16)(struct ssb_device *dev, u16 offset, u16 value);
78 void (*write32)(struct ssb_device *dev, u16 offset, u32 value); 80 void (*write32)(struct ssb_device *dev, u16 offset, u32 value);
79}; 81};
@@ -243,9 +245,9 @@ struct ssb_bus {
243 /* Pointer to the PCMCIA device (only if bustype == SSB_BUSTYPE_PCMCIA). */ 245 /* Pointer to the PCMCIA device (only if bustype == SSB_BUSTYPE_PCMCIA). */
244 struct pcmcia_device *host_pcmcia; 246 struct pcmcia_device *host_pcmcia;
245 247
246#ifdef CONFIG_SSB_PCIHOST 248#ifdef CONFIG_SSB_SPROM
247 /* Mutex to protect the SPROM writing. */ 249 /* Mutex to protect the SPROM writing. */
248 struct mutex pci_sprom_mutex; 250 struct mutex sprom_mutex;
249#endif 251#endif
250 252
251 /* ID information about the Chip. */ 253 /* ID information about the Chip. */
@@ -344,6 +346,10 @@ void ssb_device_disable(struct ssb_device *dev, u32 core_specific_flags);
344 346
345 347
346/* Device MMIO register read/write functions. */ 348/* Device MMIO register read/write functions. */
349static inline u8 ssb_read8(struct ssb_device *dev, u16 offset)
350{
351 return dev->ops->read8(dev, offset);
352}
347static inline u16 ssb_read16(struct ssb_device *dev, u16 offset) 353static inline u16 ssb_read16(struct ssb_device *dev, u16 offset)
348{ 354{
349 return dev->ops->read16(dev, offset); 355 return dev->ops->read16(dev, offset);
@@ -352,6 +358,10 @@ static inline u32 ssb_read32(struct ssb_device *dev, u16 offset)
352{ 358{
353 return dev->ops->read32(dev, offset); 359 return dev->ops->read32(dev, offset);
354} 360}
361static inline void ssb_write8(struct ssb_device *dev, u16 offset, u8 value)
362{
363 dev->ops->write8(dev, offset, value);
364}
355static inline void ssb_write16(struct ssb_device *dev, u16 offset, u16 value) 365static inline void ssb_write16(struct ssb_device *dev, u16 offset, u16 value)
356{ 366{
357 dev->ops->write16(dev, offset, value); 367 dev->ops->write16(dev, offset, value);
@@ -412,5 +422,12 @@ extern int ssb_bus_powerup(struct ssb_bus *bus, bool dynamic_pctl);
412extern u32 ssb_admatch_base(u32 adm); 422extern u32 ssb_admatch_base(u32 adm);
413extern u32 ssb_admatch_size(u32 adm); 423extern u32 ssb_admatch_size(u32 adm);
414 424
425/* PCI device mapping and fixup routines.
426 * Called from the architecture pcibios init code.
427 * These are only available on SSB_EMBEDDED configurations. */
428#ifdef CONFIG_SSB_EMBEDDED
429int ssb_pcibios_plat_dev_init(struct pci_dev *dev);
430int ssb_pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin);
431#endif /* CONFIG_SSB_EMBEDDED */
415 432
416#endif /* LINUX_SSB_H_ */ 433#endif /* LINUX_SSB_H_ */
diff --git a/include/linux/ssb/ssb_driver_chipcommon.h b/include/linux/ssb/ssb_driver_chipcommon.h
index 536851b946f6..b548a54ff1f5 100644
--- a/include/linux/ssb/ssb_driver_chipcommon.h
+++ b/include/linux/ssb/ssb_driver_chipcommon.h
@@ -390,6 +390,10 @@ extern void ssb_chipco_set_clockmode(struct ssb_chipcommon *cc,
390extern void ssb_chipco_watchdog_timer_set(struct ssb_chipcommon *cc, 390extern void ssb_chipco_watchdog_timer_set(struct ssb_chipcommon *cc,
391 u32 ticks); 391 u32 ticks);
392 392
393void ssb_chipco_irq_mask(struct ssb_chipcommon *cc, u32 mask, u32 value);
394
395u32 ssb_chipco_irq_status(struct ssb_chipcommon *cc, u32 mask);
396
393/* Chipcommon GPIO pin access. */ 397/* Chipcommon GPIO pin access. */
394u32 ssb_chipco_gpio_in(struct ssb_chipcommon *cc, u32 mask); 398u32 ssb_chipco_gpio_in(struct ssb_chipcommon *cc, u32 mask);
395u32 ssb_chipco_gpio_out(struct ssb_chipcommon *cc, u32 mask, u32 value); 399u32 ssb_chipco_gpio_out(struct ssb_chipcommon *cc, u32 mask, u32 value);
diff --git a/include/linux/ssb/ssb_driver_gige.h b/include/linux/ssb/ssb_driver_gige.h
new file mode 100644
index 000000000000..01fbdf5fef22
--- /dev/null
+++ b/include/linux/ssb/ssb_driver_gige.h
@@ -0,0 +1,174 @@
1#ifndef LINUX_SSB_DRIVER_GIGE_H_
2#define LINUX_SSB_DRIVER_GIGE_H_
3
4#include <linux/ssb/ssb.h>
5#include <linux/pci.h>
6#include <linux/spinlock.h>
7
8
9#ifdef CONFIG_SSB_DRIVER_GIGE
10
11
12#define SSB_GIGE_PCIIO 0x0000 /* PCI I/O Registers (1024 bytes) */
13#define SSB_GIGE_RESERVED 0x0400 /* Reserved (1024 bytes) */
14#define SSB_GIGE_PCICFG 0x0800 /* PCI config space (256 bytes) */
15#define SSB_GIGE_SHIM_FLUSHSTAT 0x0C00 /* PCI to OCP: Flush status control (32bit) */
16#define SSB_GIGE_SHIM_FLUSHRDA 0x0C04 /* PCI to OCP: Flush read address (32bit) */
17#define SSB_GIGE_SHIM_FLUSHTO 0x0C08 /* PCI to OCP: Flush timeout counter (32bit) */
18#define SSB_GIGE_SHIM_BARRIER 0x0C0C /* PCI to OCP: Barrier register (32bit) */
19#define SSB_GIGE_SHIM_MAOCPSI 0x0C10 /* PCI to OCP: MaocpSI Control (32bit) */
20#define SSB_GIGE_SHIM_SIOCPMA 0x0C14 /* PCI to OCP: SiocpMa Control (32bit) */
21
22/* TM Status High flags */
23#define SSB_GIGE_TMSHIGH_RGMII 0x00010000 /* Have an RGMII PHY-bus */
24/* TM Status Low flags */
25#define SSB_GIGE_TMSLOW_TXBYPASS 0x00080000 /* TX bypass (no delay) */
26#define SSB_GIGE_TMSLOW_RXBYPASS 0x00100000 /* RX bypass (no delay) */
27#define SSB_GIGE_TMSLOW_DLLEN 0x01000000 /* Enable DLL controls */
28
29/* Boardflags (low) */
30#define SSB_GIGE_BFL_ROBOSWITCH 0x0010
31
32
33#define SSB_GIGE_MEM_RES_NAME "SSB Broadcom 47xx GigE memory"
34#define SSB_GIGE_IO_RES_NAME "SSB Broadcom 47xx GigE I/O"
35
36struct ssb_gige {
37 struct ssb_device *dev;
38
39 spinlock_t lock;
40
41 /* True, if the device has an RGMII bus.
42 * False, if the device has a GMII bus. */
43 bool has_rgmii;
44
45 /* The PCI controller device. */
46 struct pci_controller pci_controller;
47 struct pci_ops pci_ops;
48 struct resource mem_resource;
49 struct resource io_resource;
50};
51
52/* Check whether a PCI device is a SSB Gigabit Ethernet core. */
53extern bool pdev_is_ssb_gige_core(struct pci_dev *pdev);
54
55/* Convert a pci_dev pointer to a ssb_gige pointer. */
56static inline struct ssb_gige * pdev_to_ssb_gige(struct pci_dev *pdev)
57{
58 if (!pdev_is_ssb_gige_core(pdev))
59 return NULL;
60 return container_of(pdev->bus->ops, struct ssb_gige, pci_ops);
61}
62
63/* Returns whether the PHY is connected by an RGMII bus. */
64static inline bool ssb_gige_is_rgmii(struct pci_dev *pdev)
65{
66 struct ssb_gige *dev = pdev_to_ssb_gige(pdev);
67 return (dev ? dev->has_rgmii : 0);
68}
69
70/* Returns whether we have a Roboswitch. */
71static inline bool ssb_gige_have_roboswitch(struct pci_dev *pdev)
72{
73 struct ssb_gige *dev = pdev_to_ssb_gige(pdev);
74 if (dev)
75 return !!(dev->dev->bus->sprom.boardflags_lo &
76 SSB_GIGE_BFL_ROBOSWITCH);
77 return 0;
78}
79
80/* Returns whether we can only do one DMA at once. */
81static inline bool ssb_gige_one_dma_at_once(struct pci_dev *pdev)
82{
83 struct ssb_gige *dev = pdev_to_ssb_gige(pdev);
84 if (dev)
85 return ((dev->dev->bus->chip_id == 0x4785) &&
86 (dev->dev->bus->chip_rev < 2));
87 return 0;
88}
89
90/* Returns whether we must flush posted writes. */
91static inline bool ssb_gige_must_flush_posted_writes(struct pci_dev *pdev)
92{
93 struct ssb_gige *dev = pdev_to_ssb_gige(pdev);
94 if (dev)
95 return (dev->dev->bus->chip_id == 0x4785);
96 return 0;
97}
98
99extern char * nvram_get(const char *name);
100/* Get the device MAC address */
101static inline void ssb_gige_get_macaddr(struct pci_dev *pdev, u8 *macaddr)
102{
103#ifdef CONFIG_BCM947XX
104 char *res = nvram_get("et0macaddr");
105 if (res)
106 memcpy(macaddr, res, 6);
107#endif
108}
109
110extern int ssb_gige_pcibios_plat_dev_init(struct ssb_device *sdev,
111 struct pci_dev *pdev);
112extern int ssb_gige_map_irq(struct ssb_device *sdev,
113 const struct pci_dev *pdev);
114
115/* The GigE driver is not a standalone module, because we don't have support
116 * for unregistering the driver. So we could not unload the module anyway. */
117extern int ssb_gige_init(void);
118static inline void ssb_gige_exit(void)
119{
120 /* Currently we can not unregister the GigE driver,
121 * because we can not unregister the PCI bridge. */
122 BUG();
123}
124
125
126#else /* CONFIG_SSB_DRIVER_GIGE */
127/* Gigabit Ethernet driver disabled */
128
129
130static inline int ssb_gige_pcibios_plat_dev_init(struct ssb_device *sdev,
131 struct pci_dev *pdev)
132{
133 return -ENOSYS;
134}
135static inline int ssb_gige_map_irq(struct ssb_device *sdev,
136 const struct pci_dev *pdev)
137{
138 return -ENOSYS;
139}
140static inline int ssb_gige_init(void)
141{
142 return 0;
143}
144static inline void ssb_gige_exit(void)
145{
146}
147
148static inline bool pdev_is_ssb_gige_core(struct pci_dev *pdev)
149{
150 return 0;
151}
152static inline struct ssb_gige * pdev_to_ssb_gige(struct pci_dev *pdev)
153{
154 return NULL;
155}
156static inline bool ssb_gige_is_rgmii(struct pci_dev *pdev)
157{
158 return 0;
159}
160static inline bool ssb_gige_have_roboswitch(struct pci_dev *pdev)
161{
162 return 0;
163}
164static inline bool ssb_gige_one_dma_at_once(struct pci_dev *pdev)
165{
166 return 0;
167}
168static inline bool ssb_gige_must_flush_posted_writes(struct pci_dev *pdev)
169{
170 return 0;
171}
172
173#endif /* CONFIG_SSB_DRIVER_GIGE */
174#endif /* LINUX_SSB_DRIVER_GIGE_H_ */
diff --git a/include/linux/ssb/ssb_driver_pci.h b/include/linux/ssb/ssb_driver_pci.h
index 5e25bac4ed31..41e330e51c2a 100644
--- a/include/linux/ssb/ssb_driver_pci.h
+++ b/include/linux/ssb/ssb_driver_pci.h
@@ -1,6 +1,11 @@
1#ifndef LINUX_SSB_PCICORE_H_ 1#ifndef LINUX_SSB_PCICORE_H_
2#define LINUX_SSB_PCICORE_H_ 2#define LINUX_SSB_PCICORE_H_
3 3
4#include <linux/types.h>
5
6struct pci_dev;
7
8
4#ifdef CONFIG_SSB_DRIVER_PCICORE 9#ifdef CONFIG_SSB_DRIVER_PCICORE
5 10
6/* PCI core registers. */ 11/* PCI core registers. */
@@ -88,6 +93,9 @@ extern void ssb_pcicore_init(struct ssb_pcicore *pc);
88extern int ssb_pcicore_dev_irqvecs_enable(struct ssb_pcicore *pc, 93extern int ssb_pcicore_dev_irqvecs_enable(struct ssb_pcicore *pc,
89 struct ssb_device *dev); 94 struct ssb_device *dev);
90 95
96int ssb_pcicore_plat_dev_init(struct pci_dev *d);
97int ssb_pcicore_pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin);
98
91 99
92#else /* CONFIG_SSB_DRIVER_PCICORE */ 100#else /* CONFIG_SSB_DRIVER_PCICORE */
93 101
@@ -107,5 +115,16 @@ int ssb_pcicore_dev_irqvecs_enable(struct ssb_pcicore *pc,
107 return 0; 115 return 0;
108} 116}
109 117
118static inline
119int ssb_pcicore_plat_dev_init(struct pci_dev *d)
120{
121 return -ENODEV;
122}
123static inline
124int ssb_pcicore_pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
125{
126 return -ENODEV;
127}
128
110#endif /* CONFIG_SSB_DRIVER_PCICORE */ 129#endif /* CONFIG_SSB_DRIVER_PCICORE */
111#endif /* LINUX_SSB_PCICORE_H_ */ 130#endif /* LINUX_SSB_PCICORE_H_ */
diff --git a/include/linux/tcp.h b/include/linux/tcp.h
index 08027f1d7f31..d96d9b122304 100644
--- a/include/linux/tcp.h
+++ b/include/linux/tcp.h
@@ -239,6 +239,11 @@ static inline struct tcp_request_sock *tcp_rsk(const struct request_sock *req)
239 return (struct tcp_request_sock *)req; 239 return (struct tcp_request_sock *)req;
240} 240}
241 241
242struct tcp_deferred_accept_info {
243 struct sock *listen_sk;
244 struct request_sock *request;
245};
246
242struct tcp_sock { 247struct tcp_sock {
243 /* inet_connection_sock has to be the first member of tcp_sock */ 248 /* inet_connection_sock has to be the first member of tcp_sock */
244 struct inet_connection_sock inet_conn; 249 struct inet_connection_sock inet_conn;
@@ -374,6 +379,8 @@ struct tcp_sock {
374 unsigned int keepalive_intvl; /* time interval between keep alive probes */ 379 unsigned int keepalive_intvl; /* time interval between keep alive probes */
375 int linger2; 380 int linger2;
376 381
382 struct tcp_deferred_accept_info defer_tcp_accept;
383
377 unsigned long last_synq_overflow; 384 unsigned long last_synq_overflow;
378 385
379 u32 tso_deferred; 386 u32 tso_deferred;
diff --git a/include/linux/udp.h b/include/linux/udp.h
index 8ec703f462da..581ca2c14c52 100644
--- a/include/linux/udp.h
+++ b/include/linux/udp.h
@@ -26,15 +26,6 @@ struct udphdr {
26 __sum16 check; 26 __sum16 check;
27}; 27};
28 28
29#ifdef __KERNEL__
30#include <linux/skbuff.h>
31
32static inline struct udphdr *udp_hdr(const struct sk_buff *skb)
33{
34 return (struct udphdr *)skb_transport_header(skb);
35}
36#endif
37
38/* UDP socket options */ 29/* UDP socket options */
39#define UDP_CORK 1 /* Never send partially complete segments */ 30#define UDP_CORK 1 /* Never send partially complete segments */
40#define UDP_ENCAP 100 /* Set the socket to accept encapsulated packets */ 31#define UDP_ENCAP 100 /* Set the socket to accept encapsulated packets */
@@ -45,9 +36,14 @@ static inline struct udphdr *udp_hdr(const struct sk_buff *skb)
45#define UDP_ENCAP_L2TPINUDP 3 /* rfc2661 */ 36#define UDP_ENCAP_L2TPINUDP 3 /* rfc2661 */
46 37
47#ifdef __KERNEL__ 38#ifdef __KERNEL__
48#include <linux/types.h>
49
50#include <net/inet_sock.h> 39#include <net/inet_sock.h>
40#include <linux/skbuff.h>
41
42static inline struct udphdr *udp_hdr(const struct sk_buff *skb)
43{
44 return (struct udphdr *)skb_transport_header(skb);
45}
46
51#define UDP_HTABLE_SIZE 128 47#define UDP_HTABLE_SIZE 128
52 48
53struct udp_sock { 49struct udp_sock {
@@ -82,6 +78,7 @@ static inline struct udp_sock *udp_sk(const struct sock *sk)
82{ 78{
83 return (struct udp_sock *)sk; 79 return (struct udp_sock *)sk;
84} 80}
81
85#define IS_UDPLITE(__sk) (udp_sk(__sk)->pcflag) 82#define IS_UDPLITE(__sk) (udp_sk(__sk)->pcflag)
86 83
87#endif 84#endif
diff --git a/include/linux/wireless.h b/include/linux/wireless.h
index 3160dfed73ca..2864b1699ecc 100644
--- a/include/linux/wireless.h
+++ b/include/linux/wireless.h
@@ -455,6 +455,7 @@
455#define IW_MODE_REPEAT 4 /* Wireless Repeater (forwarder) */ 455#define IW_MODE_REPEAT 4 /* Wireless Repeater (forwarder) */
456#define IW_MODE_SECOND 5 /* Secondary master/repeater (backup) */ 456#define IW_MODE_SECOND 5 /* Secondary master/repeater (backup) */
457#define IW_MODE_MONITOR 6 /* Passive monitor (listen only) */ 457#define IW_MODE_MONITOR 6 /* Passive monitor (listen only) */
458#define IW_MODE_MESH 7 /* Mesh (IEEE 802.11s) network */
458 459
459/* Statistics flags (bitmask in updated) */ 460/* Statistics flags (bitmask in updated) */
460#define IW_QUAL_QUAL_UPDATED 0x01 /* Value was updated since last read */ 461#define IW_QUAL_QUAL_UPDATED 0x01 /* Value was updated since last read */
diff --git a/include/linux/xfrm.h b/include/linux/xfrm.h
index e31b8c84f2c9..0c82c80b277f 100644
--- a/include/linux/xfrm.h
+++ b/include/linux/xfrm.h
@@ -113,7 +113,8 @@ enum
113{ 113{
114 XFRM_POLICY_TYPE_MAIN = 0, 114 XFRM_POLICY_TYPE_MAIN = 0,
115 XFRM_POLICY_TYPE_SUB = 1, 115 XFRM_POLICY_TYPE_SUB = 1,
116 XFRM_POLICY_TYPE_MAX = 2 116 XFRM_POLICY_TYPE_MAX = 2,
117 XFRM_POLICY_TYPE_ANY = 255
117}; 118};
118 119
119enum 120enum
diff --git a/include/net/addrconf.h b/include/net/addrconf.h
index 496503c03846..d0c47c306046 100644
--- a/include/net/addrconf.h
+++ b/include/net/addrconf.h
@@ -55,9 +55,12 @@ struct prefix_info {
55extern int addrconf_init(void); 55extern int addrconf_init(void);
56extern void addrconf_cleanup(void); 56extern void addrconf_cleanup(void);
57 57
58extern int addrconf_add_ifaddr(void __user *arg); 58extern int addrconf_add_ifaddr(struct net *net,
59extern int addrconf_del_ifaddr(void __user *arg); 59 void __user *arg);
60extern int addrconf_set_dstaddr(void __user *arg); 60extern int addrconf_del_ifaddr(struct net *net,
61 void __user *arg);
62extern int addrconf_set_dstaddr(struct net *net,
63 void __user *arg);
61 64
62extern int ipv6_chk_addr(struct net *net, 65extern int ipv6_chk_addr(struct net *net,
63 struct in6_addr *addr, 66 struct in6_addr *addr,
@@ -73,11 +76,9 @@ extern struct inet6_ifaddr *ipv6_get_ifaddr(struct net *net,
73 struct net_device *dev, 76 struct net_device *dev,
74 int strict); 77 int strict);
75 78
76extern int ipv6_get_saddr(struct dst_entry *dst,
77 struct in6_addr *daddr,
78 struct in6_addr *saddr);
79extern int ipv6_dev_get_saddr(struct net_device *dev, 79extern int ipv6_dev_get_saddr(struct net_device *dev,
80 struct in6_addr *daddr, 80 struct in6_addr *daddr,
81 unsigned int srcprefs,
81 struct in6_addr *saddr); 82 struct in6_addr *saddr);
82extern int ipv6_get_lladdr(struct net_device *dev, 83extern int ipv6_get_lladdr(struct net_device *dev,
83 struct in6_addr *addr, 84 struct in6_addr *addr,
@@ -123,8 +124,6 @@ extern int ipv6_is_mld(struct sk_buff *skb, int nexthdr);
123 124
124extern void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len); 125extern void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len);
125 126
126extern int ipv6_get_hoplimit(struct net_device *dev);
127
128/* 127/*
129 * anycast prototypes (anycast.c) 128 * anycast prototypes (anycast.c)
130 */ 129 */
@@ -135,7 +134,8 @@ extern int inet6_ac_check(struct sock *sk, struct in6_addr *addr, int ifindex);
135 134
136extern int ipv6_dev_ac_inc(struct net_device *dev, struct in6_addr *addr); 135extern int ipv6_dev_ac_inc(struct net_device *dev, struct in6_addr *addr);
137extern int __ipv6_dev_ac_dec(struct inet6_dev *idev, struct in6_addr *addr); 136extern int __ipv6_dev_ac_dec(struct inet6_dev *idev, struct in6_addr *addr);
138extern int ipv6_chk_acast_addr(struct net_device *dev, struct in6_addr *addr); 137extern int ipv6_chk_acast_addr(struct net *net, struct net_device *dev,
138 struct in6_addr *addr);
139 139
140 140
141/* Device notifier */ 141/* Device notifier */
@@ -214,29 +214,25 @@ static inline void addrconf_addr_solict_mult(const struct in6_addr *addr,
214 struct in6_addr *solicited) 214 struct in6_addr *solicited)
215{ 215{
216 ipv6_addr_set(solicited, 216 ipv6_addr_set(solicited,
217 __constant_htonl(0xFF020000), 0, 217 htonl(0xFF020000), 0,
218 __constant_htonl(0x1), 218 htonl(0x1),
219 __constant_htonl(0xFF000000) | addr->s6_addr32[3]); 219 htonl(0xFF000000) | addr->s6_addr32[3]);
220} 220}
221 221
222 222
223static inline void ipv6_addr_all_nodes(struct in6_addr *addr) 223static inline void ipv6_addr_all_nodes(struct in6_addr *addr)
224{ 224{
225 ipv6_addr_set(addr, 225 ipv6_addr_set(addr, htonl(0xFF020000), 0, 0, htonl(0x1));
226 __constant_htonl(0xFF020000), 0, 0,
227 __constant_htonl(0x1));
228} 226}
229 227
230static inline void ipv6_addr_all_routers(struct in6_addr *addr) 228static inline void ipv6_addr_all_routers(struct in6_addr *addr)
231{ 229{
232 ipv6_addr_set(addr, 230 ipv6_addr_set(addr, htonl(0xFF020000), 0, 0, htonl(0x2));
233 __constant_htonl(0xFF020000), 0, 0,
234 __constant_htonl(0x2));
235} 231}
236 232
237static inline int ipv6_addr_is_multicast(const struct in6_addr *addr) 233static inline int ipv6_addr_is_multicast(const struct in6_addr *addr)
238{ 234{
239 return (addr->s6_addr32[0] & __constant_htonl(0xFF000000)) == __constant_htonl(0xFF000000); 235 return (addr->s6_addr32[0] & htonl(0xFF000000)) == htonl(0xFF000000);
240} 236}
241 237
242static inline int ipv6_addr_is_ll_all_nodes(const struct in6_addr *addr) 238static inline int ipv6_addr_is_ll_all_nodes(const struct in6_addr *addr)
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index bcc480b8892a..e00750836ba5 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -12,6 +12,16 @@
12 * Copyright 2006, 2007 Johannes Berg <johannes@sipsolutions.net> 12 * Copyright 2006, 2007 Johannes Berg <johannes@sipsolutions.net>
13 */ 13 */
14 14
15/**
16 * struct vif_params - describes virtual interface parameters
17 * @mesh_id: mesh ID to use
18 * @mesh_id_len: length of the mesh ID
19 */
20struct vif_params {
21 u8 *mesh_id;
22 int mesh_id_len;
23};
24
15/* Radiotap header iteration 25/* Radiotap header iteration
16 * implemented in net/wireless/radiotap.c 26 * implemented in net/wireless/radiotap.c
17 * docs in Documentation/networking/radiotap-headers.txt 27 * docs in Documentation/networking/radiotap-headers.txt
@@ -109,6 +119,19 @@ enum station_flags {
109}; 119};
110 120
111/** 121/**
122 * enum plink_action - actions to perform in mesh peers
123 *
124 * @PLINK_ACTION_INVALID: action 0 is reserved
125 * @PLINK_ACTION_OPEN: start mesh peer link establishment
126 * @PLINK_ACTION_BLOCL: block traffic from this mesh peer
127 */
128enum plink_actions {
129 PLINK_ACTION_INVALID,
130 PLINK_ACTION_OPEN,
131 PLINK_ACTION_BLOCK,
132};
133
134/**
112 * struct station_parameters - station parameters 135 * struct station_parameters - station parameters
113 * 136 *
114 * Used to change and create a new station. 137 * Used to change and create a new station.
@@ -128,41 +151,124 @@ struct station_parameters {
128 int listen_interval; 151 int listen_interval;
129 u16 aid; 152 u16 aid;
130 u8 supported_rates_len; 153 u8 supported_rates_len;
154 u8 plink_action;
131}; 155};
132 156
133/** 157/**
134 * enum station_stats_flags - station statistics flags 158 * enum station_info_flags - station information flags
135 * 159 *
136 * Used by the driver to indicate which info in &struct station_stats 160 * Used by the driver to indicate which info in &struct station_info
137 * it has filled in during get_station(). 161 * it has filled in during get_station() or dump_station().
138 * 162 *
139 * @STATION_STAT_INACTIVE_TIME: @inactive_time filled 163 * @STATION_INFO_INACTIVE_TIME: @inactive_time filled
140 * @STATION_STAT_RX_BYTES: @rx_bytes filled 164 * @STATION_INFO_RX_BYTES: @rx_bytes filled
141 * @STATION_STAT_TX_BYTES: @tx_bytes filled 165 * @STATION_INFO_TX_BYTES: @tx_bytes filled
166 * @STATION_INFO_LLID: @llid filled
167 * @STATION_INFO_PLID: @plid filled
168 * @STATION_INFO_PLINK_STATE: @plink_state filled
142 */ 169 */
143enum station_stats_flags { 170enum station_info_flags {
144 STATION_STAT_INACTIVE_TIME = 1<<0, 171 STATION_INFO_INACTIVE_TIME = 1<<0,
145 STATION_STAT_RX_BYTES = 1<<1, 172 STATION_INFO_RX_BYTES = 1<<1,
146 STATION_STAT_TX_BYTES = 1<<2, 173 STATION_INFO_TX_BYTES = 1<<2,
174 STATION_INFO_LLID = 1<<3,
175 STATION_INFO_PLID = 1<<4,
176 STATION_INFO_PLINK_STATE = 1<<5,
147}; 177};
148 178
149/** 179/**
150 * struct station_stats - station statistics 180 * struct station_info - station information
151 * 181 *
152 * Station information filled by driver for get_station(). 182 * Station information filled by driver for get_station() and dump_station.
153 * 183 *
154 * @filled: bitflag of flags from &enum station_stats_flags 184 * @filled: bitflag of flags from &enum station_info_flags
155 * @inactive_time: time since last station activity (tx/rx) in milliseconds 185 * @inactive_time: time since last station activity (tx/rx) in milliseconds
156 * @rx_bytes: bytes received from this station 186 * @rx_bytes: bytes received from this station
157 * @tx_bytes: bytes transmitted to this station 187 * @tx_bytes: bytes transmitted to this station
188 * @llid: mesh local link id
189 * @plid: mesh peer link id
190 * @plink_state: mesh peer link state
158 */ 191 */
159struct station_stats { 192struct station_info {
160 u32 filled; 193 u32 filled;
161 u32 inactive_time; 194 u32 inactive_time;
162 u32 rx_bytes; 195 u32 rx_bytes;
163 u32 tx_bytes; 196 u32 tx_bytes;
197 u16 llid;
198 u16 plid;
199 u8 plink_state;
200};
201
202/**
203 * enum monitor_flags - monitor flags
204 *
205 * Monitor interface configuration flags. Note that these must be the bits
206 * according to the nl80211 flags.
207 *
208 * @MONITOR_FLAG_FCSFAIL: pass frames with bad FCS
209 * @MONITOR_FLAG_PLCPFAIL: pass frames with bad PLCP
210 * @MONITOR_FLAG_CONTROL: pass control frames
211 * @MONITOR_FLAG_OTHER_BSS: disable BSSID filtering
212 * @MONITOR_FLAG_COOK_FRAMES: report frames after processing
213 */
214enum monitor_flags {
215 MONITOR_FLAG_FCSFAIL = 1<<NL80211_MNTR_FLAG_FCSFAIL,
216 MONITOR_FLAG_PLCPFAIL = 1<<NL80211_MNTR_FLAG_PLCPFAIL,
217 MONITOR_FLAG_CONTROL = 1<<NL80211_MNTR_FLAG_CONTROL,
218 MONITOR_FLAG_OTHER_BSS = 1<<NL80211_MNTR_FLAG_OTHER_BSS,
219 MONITOR_FLAG_COOK_FRAMES = 1<<NL80211_MNTR_FLAG_COOK_FRAMES,
164}; 220};
165 221
222/**
223 * enum mpath_info_flags - mesh path information flags
224 *
225 * Used by the driver to indicate which info in &struct mpath_info it has filled
226 * in during get_station() or dump_station().
227 *
228 * MPATH_INFO_FRAME_QLEN: @frame_qlen filled
229 * MPATH_INFO_DSN: @dsn filled
230 * MPATH_INFO_METRIC: @metric filled
231 * MPATH_INFO_EXPTIME: @exptime filled
232 * MPATH_INFO_DISCOVERY_TIMEOUT: @discovery_timeout filled
233 * MPATH_INFO_DISCOVERY_RETRIES: @discovery_retries filled
234 * MPATH_INFO_FLAGS: @flags filled
235 */
236enum mpath_info_flags {
237 MPATH_INFO_FRAME_QLEN = BIT(0),
238 MPATH_INFO_DSN = BIT(1),
239 MPATH_INFO_METRIC = BIT(2),
240 MPATH_INFO_EXPTIME = BIT(3),
241 MPATH_INFO_DISCOVERY_TIMEOUT = BIT(4),
242 MPATH_INFO_DISCOVERY_RETRIES = BIT(5),
243 MPATH_INFO_FLAGS = BIT(6),
244};
245
246/**
247 * struct mpath_info - mesh path information
248 *
249 * Mesh path information filled by driver for get_mpath() and dump_mpath().
250 *
251 * @filled: bitfield of flags from &enum mpath_info_flags
252 * @frame_qlen: number of queued frames for this destination
253 * @dsn: destination sequence number
254 * @metric: metric (cost) of this mesh path
255 * @exptime: expiration time for the mesh path from now, in msecs
256 * @flags: mesh path flags
257 * @discovery_timeout: total mesh path discovery timeout, in msecs
258 * @discovery_retries: mesh path discovery retries
259 */
260struct mpath_info {
261 u32 filled;
262 u32 frame_qlen;
263 u32 dsn;
264 u32 metric;
265 u32 exptime;
266 u32 discovery_timeout;
267 u8 discovery_retries;
268 u8 flags;
269};
270
271
166/* from net/wireless.h */ 272/* from net/wireless.h */
167struct wiphy; 273struct wiphy;
168 274
@@ -210,13 +316,17 @@ struct wiphy;
210 * @del_station: Remove a station; @mac may be NULL to remove all stations. 316 * @del_station: Remove a station; @mac may be NULL to remove all stations.
211 * 317 *
212 * @change_station: Modify a given station. 318 * @change_station: Modify a given station.
319 *
320 * @set_mesh_cfg: set mesh parameters (by now, just mesh id)
213 */ 321 */
214struct cfg80211_ops { 322struct cfg80211_ops {
215 int (*add_virtual_intf)(struct wiphy *wiphy, char *name, 323 int (*add_virtual_intf)(struct wiphy *wiphy, char *name,
216 enum nl80211_iftype type); 324 enum nl80211_iftype type, u32 *flags,
325 struct vif_params *params);
217 int (*del_virtual_intf)(struct wiphy *wiphy, int ifindex); 326 int (*del_virtual_intf)(struct wiphy *wiphy, int ifindex);
218 int (*change_virtual_intf)(struct wiphy *wiphy, int ifindex, 327 int (*change_virtual_intf)(struct wiphy *wiphy, int ifindex,
219 enum nl80211_iftype type); 328 enum nl80211_iftype type, u32 *flags,
329 struct vif_params *params);
220 330
221 int (*add_key)(struct wiphy *wiphy, struct net_device *netdev, 331 int (*add_key)(struct wiphy *wiphy, struct net_device *netdev,
222 u8 key_index, u8 *mac_addr, 332 u8 key_index, u8 *mac_addr,
@@ -244,7 +354,22 @@ struct cfg80211_ops {
244 int (*change_station)(struct wiphy *wiphy, struct net_device *dev, 354 int (*change_station)(struct wiphy *wiphy, struct net_device *dev,
245 u8 *mac, struct station_parameters *params); 355 u8 *mac, struct station_parameters *params);
246 int (*get_station)(struct wiphy *wiphy, struct net_device *dev, 356 int (*get_station)(struct wiphy *wiphy, struct net_device *dev,
247 u8 *mac, struct station_stats *stats); 357 u8 *mac, struct station_info *sinfo);
358 int (*dump_station)(struct wiphy *wiphy, struct net_device *dev,
359 int idx, u8 *mac, struct station_info *sinfo);
360
361 int (*add_mpath)(struct wiphy *wiphy, struct net_device *dev,
362 u8 *dst, u8 *next_hop);
363 int (*del_mpath)(struct wiphy *wiphy, struct net_device *dev,
364 u8 *dst);
365 int (*change_mpath)(struct wiphy *wiphy, struct net_device *dev,
366 u8 *dst, u8 *next_hop);
367 int (*get_mpath)(struct wiphy *wiphy, struct net_device *dev,
368 u8 *dst, u8 *next_hop,
369 struct mpath_info *pinfo);
370 int (*dump_mpath)(struct wiphy *wiphy, struct net_device *dev,
371 int idx, u8 *dst, u8 *next_hop,
372 struct mpath_info *pinfo);
248}; 373};
249 374
250#endif /* __NET_CFG80211_H */ 375#endif /* __NET_CFG80211_H */
diff --git a/include/net/dst.h b/include/net/dst.h
index ae13370e8484..002500e631f5 100644
--- a/include/net/dst.h
+++ b/include/net/dst.h
@@ -163,15 +163,7 @@ struct dst_entry * dst_clone(struct dst_entry * dst)
163 return dst; 163 return dst;
164} 164}
165 165
166static inline 166extern void dst_release(struct dst_entry *dst);
167void dst_release(struct dst_entry * dst)
168{
169 if (dst) {
170 WARN_ON(atomic_read(&dst->__refcnt) < 1);
171 smp_mb__before_atomic_dec();
172 atomic_dec(&dst->__refcnt);
173 }
174}
175 167
176/* Children define the path of the packet through the 168/* Children define the path of the packet through the
177 * Linux networking. Thus, destinations are stackable. 169 * Linux networking. Thus, destinations are stackable.
diff --git a/include/net/icmp.h b/include/net/icmp.h
index 9f7ef3c8baef..dddb839ff4b5 100644
--- a/include/net/icmp.h
+++ b/include/net/icmp.h
@@ -48,7 +48,7 @@ struct sk_buff;
48extern void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info); 48extern void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info);
49extern int icmp_rcv(struct sk_buff *skb); 49extern int icmp_rcv(struct sk_buff *skb);
50extern int icmp_ioctl(struct sock *sk, int cmd, unsigned long arg); 50extern int icmp_ioctl(struct sock *sk, int cmd, unsigned long arg);
51extern void icmp_init(struct net_proto_family *ops); 51extern int icmp_init(void);
52extern void icmp_out_count(unsigned char type); 52extern void icmp_out_count(unsigned char type);
53 53
54/* Move into dst.h ? */ 54/* Move into dst.h ? */
@@ -65,11 +65,4 @@ static inline struct raw_sock *raw_sk(const struct sock *sk)
65 return (struct raw_sock *)sk; 65 return (struct raw_sock *)sk;
66} 66}
67 67
68extern int sysctl_icmp_echo_ignore_all;
69extern int sysctl_icmp_echo_ignore_broadcasts;
70extern int sysctl_icmp_ignore_bogus_error_responses;
71extern int sysctl_icmp_errors_use_inbound_ifaddr;
72extern int sysctl_icmp_ratelimit;
73extern int sysctl_icmp_ratemask;
74
75#endif /* _ICMP_H */ 68#endif /* _ICMP_H */
diff --git a/include/net/ieee80211.h b/include/net/ieee80211.h
index 285b2adfa648..529816bfbc52 100644
--- a/include/net/ieee80211.h
+++ b/include/net/ieee80211.h
@@ -183,7 +183,6 @@ const char *escape_essid(const char *essid, u8 essid_len);
183#define IEEE80211_DEBUG_RX(f, a...) IEEE80211_DEBUG(IEEE80211_DL_RX, f, ## a) 183#define IEEE80211_DEBUG_RX(f, a...) IEEE80211_DEBUG(IEEE80211_DL_RX, f, ## a)
184#define IEEE80211_DEBUG_QOS(f, a...) IEEE80211_DEBUG(IEEE80211_DL_QOS, f, ## a) 184#define IEEE80211_DEBUG_QOS(f, a...) IEEE80211_DEBUG(IEEE80211_DL_QOS, f, ## a)
185#include <linux/netdevice.h> 185#include <linux/netdevice.h>
186#include <linux/wireless.h>
187#include <linux/if_arp.h> /* ARPHRD_ETHER */ 186#include <linux/if_arp.h> /* ARPHRD_ETHER */
188 187
189#ifndef WIRELESS_SPY 188#ifndef WIRELESS_SPY
diff --git a/include/net/ieee80211softmac.h b/include/net/ieee80211softmac.h
deleted file mode 100644
index 1ef6282fdded..000000000000
--- a/include/net/ieee80211softmac.h
+++ /dev/null
@@ -1,373 +0,0 @@
1/*
2 * ieee80211softmac.h - public interface to the softmac
3 *
4 * Copyright (c) 2005 Johannes Berg <johannes@sipsolutions.net>
5 * Joseph Jezak <josejx@gentoo.org>
6 * Larry Finger <Larry.Finger@lwfinger.net>
7 * Danny van Dyk <kugelfang@gentoo.org>
8 * Michael Buesch <mbuesch@freenet.de>
9 *
10 * This program is free software; you can redistribute it and/or modify it
11 * under the terms of version 2 of the GNU General Public License as
12 * published by the Free Software Foundation.
13 *
14 * This program is distributed in the hope that it will be useful, but WITHOUT
15 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
17 * more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22 *
23 * The full GNU General Public License is included in this distribution in the
24 * file called COPYING.
25 */
26
27#ifndef IEEE80211SOFTMAC_H_
28#define IEEE80211SOFTMAC_H_
29
30#include <linux/kernel.h>
31#include <linux/spinlock.h>
32#include <linux/workqueue.h>
33#include <linux/list.h>
34#include <net/ieee80211.h>
35
36/* Once the API is considered more or less stable,
37 * this should be incremented on API incompatible changes.
38 */
39#define IEEE80211SOFTMAC_API 0
40
41#define IEEE80211SOFTMAC_MAX_RATES_LEN 8
42#define IEEE80211SOFTMAC_MAX_EX_RATES_LEN 255
43
44struct ieee80211softmac_ratesinfo {
45 u8 count;
46 u8 rates[IEEE80211SOFTMAC_MAX_RATES_LEN + IEEE80211SOFTMAC_MAX_EX_RATES_LEN];
47};
48
49/* internal structures */
50struct ieee80211softmac_network;
51struct ieee80211softmac_scaninfo;
52
53struct ieee80211softmac_essid {
54 u8 len;
55 char data[IW_ESSID_MAX_SIZE+1];
56};
57
58struct ieee80211softmac_wpa {
59 char *IE;
60 int IElen;
61 int IEbuflen;
62};
63
64/*
65 * Information about association
66 */
67struct ieee80211softmac_assoc_info {
68
69 struct mutex mutex;
70
71 /*
72 * This is the requested ESSID. It is written
73 * only by the WX handlers.
74 *
75 */
76 struct ieee80211softmac_essid req_essid;
77 /*
78 * the ESSID of the network we're currently
79 * associated (or trying) to. This is
80 * updated to the network's actual ESSID
81 * even if the requested ESSID was 'ANY'
82 */
83 struct ieee80211softmac_essid associate_essid;
84
85 /* BSSID we're trying to associate to */
86 char bssid[ETH_ALEN];
87
88 /* some flags.
89 * static_essid is valid if the essid is constant,
90 * this is for use by the wx handlers only.
91 *
92 * associating is true, if the network has been
93 * auth'ed on and we are in the process of associating.
94 *
95 * bssvalid is true if we found a matching network
96 * and saved it's BSSID into the bssid above.
97 *
98 * bssfixed is used for SIOCSIWAP.
99 */
100 u8 static_essid;
101 u8 short_preamble_available;
102 u8 associating;
103 u8 associated;
104 u8 assoc_wait;
105 u8 bssvalid;
106 u8 bssfixed;
107
108 /* Scan retries remaining */
109 int scan_retry;
110
111 struct delayed_work work;
112 struct delayed_work timeout;
113};
114
115struct ieee80211softmac_bss_info {
116 /* Rates supported by the network */
117 struct ieee80211softmac_ratesinfo supported_rates;
118
119 /* This indicates whether frames can currently be transmitted with
120 * short preamble (only use this variable during TX at CCK rates) */
121 u8 short_preamble:1;
122
123 /* This indicates whether protection (e.g. self-CTS) should be used
124 * when transmitting with OFDM modulation */
125 u8 use_protection:1;
126};
127
128enum {
129 IEEE80211SOFTMAC_AUTH_OPEN_REQUEST = 1,
130 IEEE80211SOFTMAC_AUTH_OPEN_RESPONSE = 2,
131};
132
133enum {
134 IEEE80211SOFTMAC_AUTH_SHARED_REQUEST = 1,
135 IEEE80211SOFTMAC_AUTH_SHARED_CHALLENGE = 2,
136 IEEE80211SOFTMAC_AUTH_SHARED_RESPONSE = 3,
137 IEEE80211SOFTMAC_AUTH_SHARED_PASS = 4,
138};
139
140/* We should make these tunable
141 * AUTH_TIMEOUT seems really long, but that's what it is in BSD */
142#define IEEE80211SOFTMAC_AUTH_TIMEOUT (12 * HZ)
143#define IEEE80211SOFTMAC_AUTH_RETRY_LIMIT 5
144#define IEEE80211SOFTMAC_ASSOC_SCAN_RETRY_LIMIT 3
145
146struct ieee80211softmac_txrates {
147 /* The Bit-Rate to be used for multicast frames. */
148 u8 mcast_rate;
149
150 /* The Bit-Rate to be used for multicast management frames. */
151 u8 mgt_mcast_rate;
152
153 /* The Bit-Rate to be used for any other (normal) data packet. */
154 u8 default_rate;
155 /* The Bit-Rate to be used for default fallback
156 * (If the device supports fallback and hardware-retry)
157 */
158 u8 default_fallback;
159
160 /* This is the rate that the user asked for */
161 u8 user_rate;
162};
163
164/* Bits for txrates_change callback. */
165#define IEEE80211SOFTMAC_TXRATECHG_DEFAULT (1 << 0) /* default_rate */
166#define IEEE80211SOFTMAC_TXRATECHG_DEFAULT_FBACK (1 << 1) /* default_fallback */
167#define IEEE80211SOFTMAC_TXRATECHG_MCAST (1 << 2) /* mcast_rate */
168#define IEEE80211SOFTMAC_TXRATECHG_MGT_MCAST (1 << 3) /* mgt_mcast_rate */
169
170#define IEEE80211SOFTMAC_BSSINFOCHG_RATES (1 << 0) /* supported_rates */
171#define IEEE80211SOFTMAC_BSSINFOCHG_SHORT_PREAMBLE (1 << 1) /* short_preamble */
172#define IEEE80211SOFTMAC_BSSINFOCHG_PROTECTION (1 << 2) /* use_protection */
173
174struct ieee80211softmac_device {
175 /* 802.11 structure for data stuff */
176 struct ieee80211_device *ieee;
177 struct net_device *dev;
178
179 /* only valid if associated, then holds the Association ID */
180 u16 association_id;
181
182 /* the following methods are callbacks that the driver
183 * using this framework has to assign
184 */
185
186 /* always assign these */
187 void (*set_bssid_filter)(struct net_device *dev, const u8 *bssid);
188 void (*set_channel)(struct net_device *dev, u8 channel);
189
190 /* assign if you need it, informational only */
191 void (*link_change)(struct net_device *dev);
192
193 /* If the hardware can do scanning, assign _all_ three of these callbacks.
194 * When the scan finishes, call ieee80211softmac_scan_finished().
195 */
196
197 /* when called, start_scan is guaranteed to not be called again
198 * until you call ieee80211softmac_scan_finished.
199 * Return 0 if scanning could start, error otherwise.
200 * SOFTMAC AUTHORS: don't call this, use ieee80211softmac_start_scan */
201 int (*start_scan)(struct net_device *dev);
202 /* this should block until after ieee80211softmac_scan_finished was called
203 * SOFTMAC AUTHORS: don't call this, use ieee80211softmac_wait_for_scan */
204 void (*wait_for_scan)(struct net_device *dev);
205 /* stop_scan aborts a scan, but is asynchronous.
206 * if you want to wait for it too, use wait_for_scan
207 * SOFTMAC AUTHORS: don't call this, use ieee80211softmac_stop_scan */
208 void (*stop_scan)(struct net_device *dev);
209
210 /* we'll need something about beacons here too, for AP or ad-hoc modes */
211
212 /* Transmission rates to be used by the driver.
213 * The SoftMAC figures out the best possible rates.
214 * The driver just needs to read them.
215 */
216 struct ieee80211softmac_txrates txrates;
217
218 /* If the driver needs to do stuff on TX rate changes, assign this
219 * callback. See IEEE80211SOFTMAC_TXRATECHG for change flags. */
220 void (*txrates_change)(struct net_device *dev,
221 u32 changes);
222
223 /* If the driver needs to do stuff when BSS properties change, assign
224 * this callback. see IEEE80211SOFTMAC_BSSINFOCHG for change flags. */
225 void (*bssinfo_change)(struct net_device *dev,
226 u32 changes);
227
228 /* private stuff follows */
229 /* this lock protects this structure */
230 spinlock_t lock;
231
232 struct workqueue_struct *wq;
233
234 u8 running; /* SoftMAC started? */
235 u8 scanning;
236
237 struct ieee80211softmac_scaninfo *scaninfo;
238 struct ieee80211softmac_assoc_info associnfo;
239 struct ieee80211softmac_bss_info bssinfo;
240
241 struct list_head auth_queue;
242 struct list_head events;
243
244 struct ieee80211softmac_ratesinfo ratesinfo;
245 int txrate_badness;
246
247 /* WPA stuff */
248 struct ieee80211softmac_wpa wpa;
249
250 /* we need to keep a list of network structs we copied */
251 struct list_head network_list;
252
253 /* This must be the last item so that it points to the data
254 * allocated beyond this structure by alloc_ieee80211 */
255 u8 priv[0];
256};
257
258extern void ieee80211softmac_scan_finished(struct ieee80211softmac_device *sm);
259
260static inline void * ieee80211softmac_priv(struct net_device *dev)
261{
262 return ((struct ieee80211softmac_device *)ieee80211_priv(dev))->priv;
263}
264
265extern struct net_device * alloc_ieee80211softmac(int sizeof_priv);
266extern void free_ieee80211softmac(struct net_device *dev);
267
268/* Call this function if you detect a lost TX fragment.
269 * (If the device indicates failure of ACK RX, for example.)
270 * It is wise to call this function if you are able to detect lost packets,
271 * because it contributes to the TX Rates auto adjustment.
272 */
273extern void ieee80211softmac_fragment_lost(struct net_device *dev,
274 u16 wireless_sequence_number);
275/* Call this function before _start to tell the softmac what rates
276 * the hw supports. The rates parameter is copied, so you can
277 * free it right after calling this function.
278 * Note that the rates need to be sorted. */
279extern void ieee80211softmac_set_rates(struct net_device *dev, u8 count, u8 *rates);
280
281/* Finds the highest rate which is:
282 * 1. Present in ri (optionally a basic rate)
283 * 2. Supported by the device
284 * 3. Less than or equal to the user-defined rate
285 */
286extern u8 ieee80211softmac_highest_supported_rate(struct ieee80211softmac_device *mac,
287 struct ieee80211softmac_ratesinfo *ri, int basic_only);
288
289/* Helper function which advises you the rate at which a frame should be
290 * transmitted at. */
291static inline u8 ieee80211softmac_suggest_txrate(struct ieee80211softmac_device *mac,
292 int is_multicast,
293 int is_mgt)
294{
295 struct ieee80211softmac_txrates *txrates = &mac->txrates;
296
297 if (!mac->associnfo.associated)
298 return txrates->mgt_mcast_rate;
299
300 /* We are associated, sending unicast frame */
301 if (!is_multicast)
302 return txrates->default_rate;
303
304 /* We are associated, sending multicast frame */
305 if (is_mgt)
306 return txrates->mgt_mcast_rate;
307 else
308 return txrates->mcast_rate;
309}
310
311/* Helper function which advises you when it is safe to transmit with short
312 * preamble.
313 * You should only call this function when transmitting at CCK rates. */
314static inline int ieee80211softmac_short_preamble_ok(struct ieee80211softmac_device *mac,
315 int is_multicast,
316 int is_mgt)
317{
318 return (is_multicast && is_mgt) ? 0 : mac->bssinfo.short_preamble;
319}
320
321/* Helper function which advises you whether protection (e.g. self-CTS) is
322 * needed. 1 = protection needed, 0 = no protection needed
323 * Only use this function when transmitting with OFDM modulation. */
324static inline int ieee80211softmac_protection_needed(struct ieee80211softmac_device *mac)
325{
326 return mac->bssinfo.use_protection;
327}
328
329/* Start the SoftMAC. Call this after you initialized the device
330 * and it is ready to run.
331 */
332extern void ieee80211softmac_start(struct net_device *dev);
333/* Stop the SoftMAC. Call this before you shutdown the device. */
334extern void ieee80211softmac_stop(struct net_device *dev);
335
336/*
337 * Event system
338 */
339
340/* valid event types */
341#define IEEE80211SOFTMAC_EVENT_ANY -1 /*private use only*/
342#define IEEE80211SOFTMAC_EVENT_SCAN_FINISHED 0
343#define IEEE80211SOFTMAC_EVENT_ASSOCIATED 1
344#define IEEE80211SOFTMAC_EVENT_ASSOCIATE_FAILED 2
345#define IEEE80211SOFTMAC_EVENT_ASSOCIATE_TIMEOUT 3
346#define IEEE80211SOFTMAC_EVENT_AUTHENTICATED 4
347#define IEEE80211SOFTMAC_EVENT_AUTH_FAILED 5
348#define IEEE80211SOFTMAC_EVENT_AUTH_TIMEOUT 6
349#define IEEE80211SOFTMAC_EVENT_ASSOCIATE_NET_NOT_FOUND 7
350#define IEEE80211SOFTMAC_EVENT_DISASSOCIATED 8
351/* keep this updated! */
352#define IEEE80211SOFTMAC_EVENT_LAST 8
353/*
354 * If you want to be notified of certain events, you can call
355 * ieee80211softmac_notify[_atomic] with
356 * - event set to one of the constants below
357 * - fun set to a function pointer of the appropriate type
358 * - context set to the context data you want passed
359 * The return value is 0, or an error.
360 */
361typedef void (*notify_function_ptr)(struct net_device *dev, int event_type, void *context);
362
363#define ieee80211softmac_notify(dev, event, fun, context) ieee80211softmac_notify_gfp(dev, event, fun, context, GFP_KERNEL);
364#define ieee80211softmac_notify_atomic(dev, event, fun, context) ieee80211softmac_notify_gfp(dev, event, fun, context, GFP_ATOMIC);
365
366extern int ieee80211softmac_notify_gfp(struct net_device *dev,
367 int event, notify_function_ptr fun, void *context, gfp_t gfp_mask);
368
369/* To clear pending work (for ifconfig down, etc.) */
370extern void
371ieee80211softmac_clear_pending_work(struct ieee80211softmac_device *sm);
372
373#endif /* IEEE80211SOFTMAC_H_ */
diff --git a/include/net/ieee80211softmac_wx.h b/include/net/ieee80211softmac_wx.h
deleted file mode 100644
index 4ee3ad57283f..000000000000
--- a/include/net/ieee80211softmac_wx.h
+++ /dev/null
@@ -1,99 +0,0 @@
1/*
2 * This file contains the prototypes for the wireless extension
3 * handlers that the softmac API provides. Include this file to
4 * use the wx handlers, you can assign these directly.
5 *
6 * Copyright (c) 2005 Johannes Berg <johannes@sipsolutions.net>
7 * Joseph Jezak <josejx@gentoo.org>
8 * Larry Finger <Larry.Finger@lwfinger.net>
9 * Danny van Dyk <kugelfang@gentoo.org>
10 * Michael Buesch <mbuesch@freenet.de>
11 *
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of version 2 of the GNU General Public License as
14 * published by the Free Software Foundation.
15 *
16 * This program is distributed in the hope that it will be useful, but WITHOUT
17 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
19 * more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
24 *
25 * The full GNU General Public License is included in this distribution in the
26 * file called COPYING.
27 */
28
29#ifndef _IEEE80211SOFTMAC_WX_H
30#define _IEEE80211SOFTMAC_WX_H
31
32#include <net/ieee80211softmac.h>
33#include <net/iw_handler.h>
34
35extern int
36ieee80211softmac_wx_trigger_scan(struct net_device *net_dev,
37 struct iw_request_info *info,
38 union iwreq_data *data,
39 char *extra);
40
41extern int
42ieee80211softmac_wx_get_scan_results(struct net_device *net_dev,
43 struct iw_request_info *info,
44 union iwreq_data *data,
45 char *extra);
46
47extern int
48ieee80211softmac_wx_set_essid(struct net_device *net_dev,
49 struct iw_request_info *info,
50 union iwreq_data *data,
51 char *extra);
52
53extern int
54ieee80211softmac_wx_get_essid(struct net_device *net_dev,
55 struct iw_request_info *info,
56 union iwreq_data *data,
57 char *extra);
58
59extern int
60ieee80211softmac_wx_set_rate(struct net_device *net_dev,
61 struct iw_request_info *info,
62 union iwreq_data *data,
63 char *extra);
64
65extern int
66ieee80211softmac_wx_get_rate(struct net_device *net_dev,
67 struct iw_request_info *info,
68 union iwreq_data *data,
69 char *extra);
70
71extern int
72ieee80211softmac_wx_get_wap(struct net_device *net_dev,
73 struct iw_request_info *info,
74 union iwreq_data *data,
75 char *extra);
76
77extern int
78ieee80211softmac_wx_set_wap(struct net_device *net_dev,
79 struct iw_request_info *info,
80 union iwreq_data *data,
81 char *extra);
82
83extern int
84ieee80211softmac_wx_set_genie(struct net_device *dev,
85 struct iw_request_info *info,
86 union iwreq_data *wrqu,
87 char *extra);
88
89extern int
90ieee80211softmac_wx_get_genie(struct net_device *dev,
91 struct iw_request_info *info,
92 union iwreq_data *wrqu,
93 char *extra);
94extern int
95ieee80211softmac_wx_set_mlme(struct net_device *dev,
96 struct iw_request_info *info,
97 union iwreq_data *wrqu,
98 char *extra);
99#endif /* _IEEE80211SOFTMAC_WX */
diff --git a/include/net/inet_hashtables.h b/include/net/inet_hashtables.h
index 97dc35ad09be..5525227c5e92 100644
--- a/include/net/inet_hashtables.h
+++ b/include/net/inet_hashtables.h
@@ -223,7 +223,7 @@ static inline int inet_sk_listen_hashfn(const struct sock *sk)
223/* Caller must disable local BH processing. */ 223/* Caller must disable local BH processing. */
224static inline void __inet_inherit_port(struct sock *sk, struct sock *child) 224static inline void __inet_inherit_port(struct sock *sk, struct sock *child)
225{ 225{
226 struct inet_hashinfo *table = sk->sk_prot->hashinfo; 226 struct inet_hashinfo *table = sk->sk_prot->h.hashinfo;
227 const int bhash = inet_bhashfn(inet_sk(child)->num, table->bhash_size); 227 const int bhash = inet_bhashfn(inet_sk(child)->num, table->bhash_size);
228 struct inet_bind_hashbucket *head = &table->bhash[bhash]; 228 struct inet_bind_hashbucket *head = &table->bhash[bhash];
229 struct inet_bind_bucket *tb; 229 struct inet_bind_bucket *tb;
@@ -314,25 +314,25 @@ typedef __u64 __bitwise __addrpair;
314 ((__force __u64)(__be32)(__saddr))); 314 ((__force __u64)(__be32)(__saddr)));
315#endif /* __BIG_ENDIAN */ 315#endif /* __BIG_ENDIAN */
316#define INET_MATCH(__sk, __net, __hash, __cookie, __saddr, __daddr, __ports, __dif)\ 316#define INET_MATCH(__sk, __net, __hash, __cookie, __saddr, __daddr, __ports, __dif)\
317 (((__sk)->sk_hash == (__hash)) && ((__sk)->sk_net == (__net)) && \ 317 (((__sk)->sk_hash == (__hash)) && sock_net((__sk)) == (__net) && \
318 ((*((__addrpair *)&(inet_sk(__sk)->daddr))) == (__cookie)) && \ 318 ((*((__addrpair *)&(inet_sk(__sk)->daddr))) == (__cookie)) && \
319 ((*((__portpair *)&(inet_sk(__sk)->dport))) == (__ports)) && \ 319 ((*((__portpair *)&(inet_sk(__sk)->dport))) == (__ports)) && \
320 (!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if == (__dif)))) 320 (!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if == (__dif))))
321#define INET_TW_MATCH(__sk, __net, __hash, __cookie, __saddr, __daddr, __ports, __dif)\ 321#define INET_TW_MATCH(__sk, __net, __hash, __cookie, __saddr, __daddr, __ports, __dif)\
322 (((__sk)->sk_hash == (__hash)) && ((__sk)->sk_net == (__net)) && \ 322 (((__sk)->sk_hash == (__hash)) && sock_net((__sk)) == (__net) && \
323 ((*((__addrpair *)&(inet_twsk(__sk)->tw_daddr))) == (__cookie)) && \ 323 ((*((__addrpair *)&(inet_twsk(__sk)->tw_daddr))) == (__cookie)) && \
324 ((*((__portpair *)&(inet_twsk(__sk)->tw_dport))) == (__ports)) && \ 324 ((*((__portpair *)&(inet_twsk(__sk)->tw_dport))) == (__ports)) && \
325 (!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if == (__dif)))) 325 (!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if == (__dif))))
326#else /* 32-bit arch */ 326#else /* 32-bit arch */
327#define INET_ADDR_COOKIE(__name, __saddr, __daddr) 327#define INET_ADDR_COOKIE(__name, __saddr, __daddr)
328#define INET_MATCH(__sk, __net, __hash, __cookie, __saddr, __daddr, __ports, __dif) \ 328#define INET_MATCH(__sk, __net, __hash, __cookie, __saddr, __daddr, __ports, __dif) \
329 (((__sk)->sk_hash == (__hash)) && ((__sk)->sk_net == (__net)) && \ 329 (((__sk)->sk_hash == (__hash)) && sock_net((__sk)) == (__net) && \
330 (inet_sk(__sk)->daddr == (__saddr)) && \ 330 (inet_sk(__sk)->daddr == (__saddr)) && \
331 (inet_sk(__sk)->rcv_saddr == (__daddr)) && \ 331 (inet_sk(__sk)->rcv_saddr == (__daddr)) && \
332 ((*((__portpair *)&(inet_sk(__sk)->dport))) == (__ports)) && \ 332 ((*((__portpair *)&(inet_sk(__sk)->dport))) == (__ports)) && \
333 (!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if == (__dif)))) 333 (!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if == (__dif))))
334#define INET_TW_MATCH(__sk, __net, __hash,__cookie, __saddr, __daddr, __ports, __dif) \ 334#define INET_TW_MATCH(__sk, __net, __hash,__cookie, __saddr, __daddr, __ports, __dif) \
335 (((__sk)->sk_hash == (__hash)) && ((__sk)->sk_net == (__net)) && \ 335 (((__sk)->sk_hash == (__hash)) && sock_net((__sk)) == (__net) && \
336 (inet_twsk(__sk)->tw_daddr == (__saddr)) && \ 336 (inet_twsk(__sk)->tw_daddr == (__saddr)) && \
337 (inet_twsk(__sk)->tw_rcv_saddr == (__daddr)) && \ 337 (inet_twsk(__sk)->tw_rcv_saddr == (__daddr)) && \
338 ((*((__portpair *)&(inet_twsk(__sk)->tw_dport))) == (__ports)) && \ 338 ((*((__portpair *)&(inet_twsk(__sk)->tw_dport))) == (__ports)) && \
diff --git a/include/net/inet_sock.h b/include/net/inet_sock.h
index 89cd011edb99..a42cd63d241a 100644
--- a/include/net/inet_sock.h
+++ b/include/net/inet_sock.h
@@ -43,8 +43,7 @@ struct ip_options {
43 unsigned char srr; 43 unsigned char srr;
44 unsigned char rr; 44 unsigned char rr;
45 unsigned char ts; 45 unsigned char ts;
46 unsigned char is_data:1, 46 unsigned char is_strictroute:1,
47 is_strictroute:1,
48 srr_is_hit:1, 47 srr_is_hit:1,
49 is_changed:1, 48 is_changed:1,
50 rr_needaddr:1, 49 rr_needaddr:1,
@@ -137,7 +136,7 @@ struct inet_sock {
137 unsigned int flags; 136 unsigned int flags;
138 unsigned int fragsize; 137 unsigned int fragsize;
139 struct ip_options *opt; 138 struct ip_options *opt;
140 struct rtable *rt; 139 struct dst_entry *dst;
141 int length; /* Total length of all frames */ 140 int length; /* Total length of all frames */
142 __be32 addr; 141 __be32 addr;
143 struct flowi fl; 142 struct flowi fl;
@@ -195,7 +194,7 @@ static inline int inet_sk_ehashfn(const struct sock *sk)
195 194
196static inline int inet_iif(const struct sk_buff *skb) 195static inline int inet_iif(const struct sk_buff *skb)
197{ 196{
198 return ((struct rtable *)skb->dst)->rt_iif; 197 return skb->rtable->rt_iif;
199} 198}
200 199
201#endif /* _INET_SOCK_H */ 200#endif /* _INET_SOCK_H */
diff --git a/include/net/inet_timewait_sock.h b/include/net/inet_timewait_sock.h
index 296547bfb0b7..95c660c9719b 100644
--- a/include/net/inet_timewait_sock.h
+++ b/include/net/inet_timewait_sock.h
@@ -207,4 +207,22 @@ extern void inet_twsk_schedule(struct inet_timewait_sock *tw,
207 const int timeo, const int timewait_len); 207 const int timeo, const int timewait_len);
208extern void inet_twsk_deschedule(struct inet_timewait_sock *tw, 208extern void inet_twsk_deschedule(struct inet_timewait_sock *tw,
209 struct inet_timewait_death_row *twdr); 209 struct inet_timewait_death_row *twdr);
210
211static inline
212struct net *twsk_net(const struct inet_timewait_sock *twsk)
213{
214#ifdef CONFIG_NET_NS
215 return twsk->tw_net;
216#else
217 return &init_net;
218#endif
219}
220
221static inline
222void twsk_net_set(struct inet_timewait_sock *twsk, struct net *net)
223{
224#ifdef CONFIG_NET_NS
225 twsk->tw_net = net;
226#endif
227}
210#endif /* _INET_TIMEWAIT_SOCK_ */ 228#endif /* _INET_TIMEWAIT_SOCK_ */
diff --git a/include/net/ip.h b/include/net/ip.h
index 9f50d4f1f157..6d7bcd5e62d4 100644
--- a/include/net/ip.h
+++ b/include/net/ip.h
@@ -347,10 +347,11 @@ extern int ip_forward(struct sk_buff *skb);
347extern void ip_options_build(struct sk_buff *skb, struct ip_options *opt, __be32 daddr, struct rtable *rt, int is_frag); 347extern void ip_options_build(struct sk_buff *skb, struct ip_options *opt, __be32 daddr, struct rtable *rt, int is_frag);
348extern int ip_options_echo(struct ip_options *dopt, struct sk_buff *skb); 348extern int ip_options_echo(struct ip_options *dopt, struct sk_buff *skb);
349extern void ip_options_fragment(struct sk_buff *skb); 349extern void ip_options_fragment(struct sk_buff *skb);
350extern int ip_options_compile(struct ip_options *opt, struct sk_buff *skb); 350extern int ip_options_compile(struct net *net,
351extern int ip_options_get(struct ip_options **optp, 351 struct ip_options *opt, struct sk_buff *skb);
352extern int ip_options_get(struct net *net, struct ip_options **optp,
352 unsigned char *data, int optlen); 353 unsigned char *data, int optlen);
353extern int ip_options_get_from_user(struct ip_options **optp, 354extern int ip_options_get_from_user(struct net *net, struct ip_options **optp,
354 unsigned char __user *data, int optlen); 355 unsigned char __user *data, int optlen);
355extern void ip_options_undo(struct ip_options * opt); 356extern void ip_options_undo(struct ip_options * opt);
356extern void ip_forward_options(struct sk_buff *skb); 357extern void ip_forward_options(struct sk_buff *skb);
@@ -361,7 +362,8 @@ extern int ip_options_rcv_srr(struct sk_buff *skb);
361 */ 362 */
362 363
363extern void ip_cmsg_recv(struct msghdr *msg, struct sk_buff *skb); 364extern void ip_cmsg_recv(struct msghdr *msg, struct sk_buff *skb);
364extern int ip_cmsg_send(struct msghdr *msg, struct ipcm_cookie *ipc); 365extern int ip_cmsg_send(struct net *net,
366 struct msghdr *msg, struct ipcm_cookie *ipc);
365extern int ip_setsockopt(struct sock *sk, int level, int optname, char __user *optval, int optlen); 367extern int ip_setsockopt(struct sock *sk, int level, int optname, char __user *optval, int optlen);
366extern int ip_getsockopt(struct sock *sk, int level, int optname, char __user *optval, int __user *optlen); 368extern int ip_getsockopt(struct sock *sk, int level, int optname, char __user *optval, int __user *optlen);
367extern int compat_ip_setsockopt(struct sock *sk, int level, 369extern int compat_ip_setsockopt(struct sock *sk, int level,
diff --git a/include/net/ip6_fib.h b/include/net/ip6_fib.h
index 953d6040ff50..7c5c0f79168a 100644
--- a/include/net/ip6_fib.h
+++ b/include/net/ip6_fib.h
@@ -174,17 +174,19 @@ struct fib6_table {
174#define RT6_TABLE_LOCAL RT6_TABLE_MAIN 174#define RT6_TABLE_LOCAL RT6_TABLE_MAIN
175#endif 175#endif
176 176
177typedef struct rt6_info *(*pol_lookup_t)(struct fib6_table *, 177typedef struct rt6_info *(*pol_lookup_t)(struct net *,
178 struct fib6_table *,
178 struct flowi *, int); 179 struct flowi *, int);
179 180
180/* 181/*
181 * exported functions 182 * exported functions
182 */ 183 */
183 184
184extern struct fib6_table * fib6_get_table(u32 id); 185extern struct fib6_table *fib6_get_table(struct net *net, u32 id);
185extern struct fib6_table * fib6_new_table(u32 id); 186extern struct fib6_table *fib6_new_table(struct net *net, u32 id);
186extern struct dst_entry * fib6_rule_lookup(struct flowi *fl, int flags, 187extern struct dst_entry *fib6_rule_lookup(struct net *net,
187 pol_lookup_t lookup); 188 struct flowi *fl, int flags,
189 pol_lookup_t lookup);
188 190
189extern struct fib6_node *fib6_lookup(struct fib6_node *root, 191extern struct fib6_node *fib6_lookup(struct fib6_node *root,
190 struct in6_addr *daddr, 192 struct in6_addr *daddr,
@@ -194,7 +196,8 @@ struct fib6_node *fib6_locate(struct fib6_node *root,
194 struct in6_addr *daddr, int dst_len, 196 struct in6_addr *daddr, int dst_len,
195 struct in6_addr *saddr, int src_len); 197 struct in6_addr *saddr, int src_len);
196 198
197extern void fib6_clean_all(int (*func)(struct rt6_info *, void *arg), 199extern void fib6_clean_all(struct net *net,
200 int (*func)(struct rt6_info *, void *arg),
198 int prune, void *arg); 201 int prune, void *arg);
199 202
200extern int fib6_add(struct fib6_node *root, 203extern int fib6_add(struct fib6_node *root,
@@ -207,7 +210,8 @@ extern int fib6_del(struct rt6_info *rt,
207extern void inet6_rt_notify(int event, struct rt6_info *rt, 210extern void inet6_rt_notify(int event, struct rt6_info *rt,
208 struct nl_info *info); 211 struct nl_info *info);
209 212
210extern void fib6_run_gc(unsigned long dummy); 213extern void fib6_run_gc(unsigned long expires,
214 struct net *net);
211 215
212extern void fib6_gc_cleanup(void); 216extern void fib6_gc_cleanup(void);
213 217
diff --git a/include/net/ip6_route.h b/include/net/ip6_route.h
index f99e4f0f568f..3ae6799c2b14 100644
--- a/include/net/ip6_route.h
+++ b/include/net/ip6_route.h
@@ -30,26 +30,32 @@ struct route_info {
30#include <linux/ip.h> 30#include <linux/ip.h>
31#include <linux/ipv6.h> 31#include <linux/ipv6.h>
32 32
33#define RT6_LOOKUP_F_IFACE 0x1 33#define RT6_LOOKUP_F_IFACE 0x00000001
34#define RT6_LOOKUP_F_REACHABLE 0x2 34#define RT6_LOOKUP_F_REACHABLE 0x00000002
35#define RT6_LOOKUP_F_HAS_SADDR 0x4 35#define RT6_LOOKUP_F_HAS_SADDR 0x00000004
36#define RT6_LOOKUP_F_SRCPREF_TMP 0x00000008
37#define RT6_LOOKUP_F_SRCPREF_PUBLIC 0x00000010
38#define RT6_LOOKUP_F_SRCPREF_COA 0x00000020
36 39
37extern struct rt6_info ip6_null_entry; 40extern struct rt6_info *ip6_null_entry;
38 41
39#ifdef CONFIG_IPV6_MULTIPLE_TABLES 42#ifdef CONFIG_IPV6_MULTIPLE_TABLES
40extern struct rt6_info ip6_prohibit_entry; 43extern struct rt6_info *ip6_prohibit_entry;
41extern struct rt6_info ip6_blk_hole_entry; 44extern struct rt6_info *ip6_blk_hole_entry;
42#endif 45#endif
43 46
44extern void ip6_route_input(struct sk_buff *skb); 47extern void ip6_route_input(struct sk_buff *skb);
45 48
46extern struct dst_entry * ip6_route_output(struct sock *sk, 49extern struct dst_entry * ip6_route_output(struct net *net,
50 struct sock *sk,
47 struct flowi *fl); 51 struct flowi *fl);
48 52
49extern int ip6_route_init(void); 53extern int ip6_route_init(void);
50extern void ip6_route_cleanup(void); 54extern void ip6_route_cleanup(void);
51 55
52extern int ipv6_route_ioctl(unsigned int cmd, void __user *arg); 56extern int ipv6_route_ioctl(struct net *net,
57 unsigned int cmd,
58 void __user *arg);
53 59
54extern int ip6_route_add(struct fib6_config *cfg); 60extern int ip6_route_add(struct fib6_config *cfg);
55extern int ip6_ins_rt(struct rt6_info *); 61extern int ip6_ins_rt(struct rt6_info *);
@@ -69,21 +75,24 @@ extern void rt6_sndmsg(int type, struct in6_addr *dst,
69 int dstlen, int srclen, 75 int dstlen, int srclen,
70 int metric, __u32 flags); 76 int metric, __u32 flags);
71 77
72extern struct rt6_info *rt6_lookup(struct in6_addr *daddr, 78extern struct rt6_info *rt6_lookup(struct net *net,
79 struct in6_addr *daddr,
73 struct in6_addr *saddr, 80 struct in6_addr *saddr,
74 int oif, int flags); 81 int oif, int flags);
75 82
76extern struct dst_entry *ndisc_dst_alloc(struct net_device *dev, 83extern struct dst_entry *icmp6_dst_alloc(struct net_device *dev,
77 struct neighbour *neigh, 84 struct neighbour *neigh,
78 struct in6_addr *addr, 85 struct in6_addr *addr);
79 int (*output)(struct sk_buff *)); 86extern int icmp6_dst_gc(int *more);
80extern int ndisc_dst_gc(int *more); 87
81extern void fib6_force_start_gc(void); 88extern void fib6_force_start_gc(struct net *net);
82 89
83extern struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev, 90extern struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev,
84 const struct in6_addr *addr, 91 const struct in6_addr *addr,
85 int anycast); 92 int anycast);
86 93
94extern int ip6_dst_hoplimit(struct dst_entry *dst);
95
87/* 96/*
88 * support functions for ND 97 * support functions for ND
89 * 98 *
@@ -94,7 +103,7 @@ extern struct rt6_info * rt6_add_dflt_router(struct in6_addr *gwaddr,
94 struct net_device *dev, 103 struct net_device *dev,
95 unsigned int pref); 104 unsigned int pref);
96 105
97extern void rt6_purge_dflt_routers(void); 106extern void rt6_purge_dflt_routers(struct net *net);
98 107
99extern int rt6_route_rcv(struct net_device *dev, 108extern int rt6_route_rcv(struct net_device *dev,
100 u8 *opt, int len, 109 u8 *opt, int len,
@@ -121,7 +130,7 @@ struct rt6_rtnl_dump_arg
121}; 130};
122 131
123extern int rt6_dump_route(struct rt6_info *rt, void *p_arg); 132extern int rt6_dump_route(struct rt6_info *rt, void *p_arg);
124extern void rt6_ifdown(struct net_device *dev); 133extern void rt6_ifdown(struct net *net, struct net_device *dev);
125extern void rt6_mtu_change(struct net_device *dev, unsigned mtu); 134extern void rt6_mtu_change(struct net_device *dev, unsigned mtu);
126 135
127extern rwlock_t rt6_lock; 136extern rwlock_t rt6_lock;
diff --git a/include/net/ipv6.h b/include/net/ipv6.h
index c0c019f72ba9..5738c1c73ac1 100644
--- a/include/net/ipv6.h
+++ b/include/net/ipv6.h
@@ -202,6 +202,7 @@ struct ip6_flowlabel
202 u32 owner; 202 u32 owner;
203 unsigned long lastuse; 203 unsigned long lastuse;
204 unsigned long expires; 204 unsigned long expires;
205 struct net *fl_net;
205}; 206};
206 207
207#define IPV6_FLOWINFO_MASK __constant_htonl(0x0FFFFFFF) 208#define IPV6_FLOWINFO_MASK __constant_htonl(0x0FFFFFFF)
@@ -249,15 +250,6 @@ int ip6_frag_mem(struct net *net);
249 250
250#define IPV6_FRAG_TIMEOUT (60*HZ) /* 60 seconds */ 251#define IPV6_FRAG_TIMEOUT (60*HZ) /* 60 seconds */
251 252
252/*
253 * Function prototype for build_xmit
254 */
255
256typedef int (*inet_getfrag_t) (const void *data,
257 struct in6_addr *addr,
258 char *,
259 unsigned int, unsigned int);
260
261extern int __ipv6_addr_type(const struct in6_addr *addr); 253extern int __ipv6_addr_type(const struct in6_addr *addr);
262static inline int ipv6_addr_type(const struct in6_addr *addr) 254static inline int ipv6_addr_type(const struct in6_addr *addr)
263{ 255{
@@ -384,6 +376,16 @@ static inline int ipv6_addr_v4mapped(const struct in6_addr *a)
384} 376}
385 377
386/* 378/*
379 * Check for a RFC 4843 ORCHID address
380 * (Overlay Routable Cryptographic Hash Identifiers)
381 */
382static inline int ipv6_addr_orchid(const struct in6_addr *a)
383{
384 return ((a->s6_addr32[0] & htonl(0xfffffff0))
385 == htonl(0x20010010));
386}
387
388/*
387 * find the first different bit between two addresses 389 * find the first different bit between two addresses
388 * length of address must be a multiple of 32bits 390 * length of address must be a multiple of 32bits
389 */ 391 */
@@ -499,14 +501,6 @@ extern int ip6_local_out(struct sk_buff *skb);
499 * Extension header (options) processing 501 * Extension header (options) processing
500 */ 502 */
501 503
502extern u8 * ipv6_build_nfrag_opts(struct sk_buff *skb,
503 u8 *prev_hdr,
504 struct ipv6_txoptions *opt,
505 struct in6_addr *daddr,
506 u32 jumbolen);
507extern u8 * ipv6_build_frag_opts(struct sk_buff *skb,
508 u8 *prev_hdr,
509 struct ipv6_txoptions *opt);
510extern void ipv6_push_nfrag_opts(struct sk_buff *skb, 504extern void ipv6_push_nfrag_opts(struct sk_buff *skb,
511 struct ipv6_txoptions *opt, 505 struct ipv6_txoptions *opt,
512 u8 *proto, 506 u8 *proto,
@@ -545,10 +539,6 @@ extern int compat_ipv6_getsockopt(struct sock *sk,
545 char __user *optval, 539 char __user *optval,
546 int __user *optlen); 540 int __user *optlen);
547 541
548extern int ipv6_packet_init(void);
549
550extern void ipv6_packet_cleanup(void);
551
552extern int ip6_datagram_connect(struct sock *sk, 542extern int ip6_datagram_connect(struct sock *sk,
553 struct sockaddr *addr, int addr_len); 543 struct sockaddr *addr, int addr_len);
554 544
@@ -585,14 +575,14 @@ extern int ip6_mc_msfget(struct sock *sk, struct group_filter *gsf,
585 int __user *optlen); 575 int __user *optlen);
586 576
587#ifdef CONFIG_PROC_FS 577#ifdef CONFIG_PROC_FS
588extern int ac6_proc_init(void); 578extern int ac6_proc_init(struct net *net);
589extern void ac6_proc_exit(void); 579extern void ac6_proc_exit(struct net *net);
590extern int raw6_proc_init(void); 580extern int raw6_proc_init(void);
591extern void raw6_proc_exit(void); 581extern void raw6_proc_exit(void);
592extern int tcp6_proc_init(void); 582extern int tcp6_proc_init(struct net *net);
593extern void tcp6_proc_exit(void); 583extern void tcp6_proc_exit(struct net *net);
594extern int udp6_proc_init(void); 584extern int udp6_proc_init(struct net *net);
595extern void udp6_proc_exit(void); 585extern void udp6_proc_exit(struct net *net);
596extern int udplite6_proc_init(void); 586extern int udplite6_proc_init(void);
597extern void udplite6_proc_exit(void); 587extern void udplite6_proc_exit(void);
598extern int ipv6_misc_proc_init(void); 588extern int ipv6_misc_proc_init(void);
@@ -600,17 +590,11 @@ extern void ipv6_misc_proc_exit(void);
600extern int snmp6_register_dev(struct inet6_dev *idev); 590extern int snmp6_register_dev(struct inet6_dev *idev);
601extern int snmp6_unregister_dev(struct inet6_dev *idev); 591extern int snmp6_unregister_dev(struct inet6_dev *idev);
602 592
603extern struct rt6_statistics rt6_stats;
604#else 593#else
605static inline int snmp6_register_dev(struct inet6_dev *idev) 594static inline int ac6_proc_init(struct net *net) { return 0; }
606{ 595static inline void ac6_proc_exit(struct net *net) { }
607 return 0; 596static inline int snmp6_register_dev(struct inet6_dev *idev) { return 0; }
608} 597static inline int snmp6_unregister_dev(struct inet6_dev *idev) { return 0; }
609
610static inline int snmp6_unregister_dev(struct inet6_dev *idev)
611{
612 return 0;
613}
614#endif 598#endif
615 599
616#ifdef CONFIG_SYSCTL 600#ifdef CONFIG_SYSCTL
diff --git a/include/net/llc_if.h b/include/net/llc_if.h
index c608812a8e89..b595a004d31b 100644
--- a/include/net/llc_if.h
+++ b/include/net/llc_if.h
@@ -74,11 +74,6 @@ static inline int llc_mac_null(const u8 *mac)
74 return is_zero_ether_addr(mac); 74 return is_zero_ether_addr(mac);
75} 75}
76 76
77static inline int llc_addrany(const struct llc_addr *addr)
78{
79 return llc_mac_null(addr->mac) && !addr->lsap;
80}
81
82static inline int llc_mac_multicast(const u8 *mac) 77static inline int llc_mac_multicast(const u8 *mac)
83{ 78{
84 return is_multicast_ether_addr(mac); 79 return is_multicast_ether_addr(mac);
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index 9083bafb63ca..48428a6b9109 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -38,7 +38,11 @@
38 * called in hardware interrupt context. The low-level driver must not call any 38 * called in hardware interrupt context. The low-level driver must not call any
39 * other functions in hardware interrupt context. If there is a need for such 39 * other functions in hardware interrupt context. If there is a need for such
40 * call, the low-level driver should first ACK the interrupt and perform the 40 * call, the low-level driver should first ACK the interrupt and perform the
41 * IEEE 802.11 code call after this, e.g. from a scheduled workqueue function. 41 * IEEE 802.11 code call after this, e.g. from a scheduled workqueue or even
42 * tasklet function.
43 *
44 * NOTE: If the driver opts to use the _irqsafe() functions, it may not also
45 * use the non-irqsafe functions!
42 */ 46 */
43 47
44/** 48/**
@@ -69,95 +73,6 @@
69 * not do so then mac80211 may add this under certain circumstances. 73 * not do so then mac80211 may add this under certain circumstances.
70 */ 74 */
71 75
72#define IEEE80211_CHAN_W_SCAN 0x00000001
73#define IEEE80211_CHAN_W_ACTIVE_SCAN 0x00000002
74#define IEEE80211_CHAN_W_IBSS 0x00000004
75
76/* Channel information structure. Low-level driver is expected to fill in chan,
77 * freq, and val fields. Other fields will be filled in by 80211.o based on
78 * hostapd information and low-level driver does not need to use them. The
79 * limits for each channel will be provided in 'struct ieee80211_conf' when
80 * configuring the low-level driver with hw->config callback. If a device has
81 * a default regulatory domain, IEEE80211_HW_DEFAULT_REG_DOMAIN_CONFIGURED
82 * can be set to let the driver configure all fields */
83struct ieee80211_channel {
84 short chan; /* channel number (IEEE 802.11) */
85 short freq; /* frequency in MHz */
86 int val; /* hw specific value for the channel */
87 int flag; /* flag for hostapd use (IEEE80211_CHAN_*) */
88 unsigned char power_level;
89 unsigned char antenna_max;
90};
91
92#define IEEE80211_RATE_ERP 0x00000001
93#define IEEE80211_RATE_BASIC 0x00000002
94#define IEEE80211_RATE_PREAMBLE2 0x00000004
95#define IEEE80211_RATE_SUPPORTED 0x00000010
96#define IEEE80211_RATE_OFDM 0x00000020
97#define IEEE80211_RATE_CCK 0x00000040
98#define IEEE80211_RATE_MANDATORY 0x00000100
99
100#define IEEE80211_RATE_CCK_2 (IEEE80211_RATE_CCK | IEEE80211_RATE_PREAMBLE2)
101#define IEEE80211_RATE_MODULATION(f) \
102 (f & (IEEE80211_RATE_CCK | IEEE80211_RATE_OFDM))
103
104/* Low-level driver should set PREAMBLE2, OFDM and CCK flags.
105 * BASIC, SUPPORTED, ERP, and MANDATORY flags are set in 80211.o based on the
106 * configuration. */
107struct ieee80211_rate {
108 int rate; /* rate in 100 kbps */
109 int val; /* hw specific value for the rate */
110 int flags; /* IEEE80211_RATE_ flags */
111 int val2; /* hw specific value for the rate when using short preamble
112 * (only when IEEE80211_RATE_PREAMBLE2 flag is set, i.e., for
113 * 2, 5.5, and 11 Mbps) */
114 signed char min_rssi_ack;
115 unsigned char min_rssi_ack_delta;
116
117 /* following fields are set by 80211.o and need not be filled by the
118 * low-level driver */
119 int rate_inv; /* inverse of the rate (LCM(all rates) / rate) for
120 * optimizing channel utilization estimates */
121};
122
123/**
124 * enum ieee80211_phymode - PHY modes
125 *
126 * @MODE_IEEE80211A: 5GHz as defined by 802.11a/802.11h
127 * @MODE_IEEE80211B: 2.4 GHz as defined by 802.11b
128 * @MODE_IEEE80211G: 2.4 GHz as defined by 802.11g (with OFDM),
129 * backwards compatible with 11b mode
130 * @NUM_IEEE80211_MODES: internal
131 */
132enum ieee80211_phymode {
133 MODE_IEEE80211A,
134 MODE_IEEE80211B,
135 MODE_IEEE80211G,
136
137 /* keep last */
138 NUM_IEEE80211_MODES
139};
140
141/**
142 * struct ieee80211_ht_info - describing STA's HT capabilities
143 *
144 * This structure describes most essential parameters needed
145 * to describe 802.11n HT capabilities for an STA.
146 *
147 * @ht_supported: is HT supported by STA, 0: no, 1: yes
148 * @cap: HT capabilities map as described in 802.11n spec
149 * @ampdu_factor: Maximum A-MPDU length factor
150 * @ampdu_density: Minimum A-MPDU spacing
151 * @supp_mcs_set: Supported MCS set as described in 802.11n spec
152 */
153struct ieee80211_ht_info {
154 u8 ht_supported;
155 u16 cap; /* use IEEE80211_HT_CAP_ */
156 u8 ampdu_factor;
157 u8 ampdu_density;
158 u8 supp_mcs_set[16];
159};
160
161/** 76/**
162 * struct ieee80211_ht_bss_info - describing BSS's HT characteristics 77 * struct ieee80211_ht_bss_info - describing BSS's HT characteristics
163 * 78 *
@@ -175,46 +90,22 @@ struct ieee80211_ht_bss_info {
175}; 90};
176 91
177/** 92/**
178 * struct ieee80211_hw_mode - PHY mode definition
179 *
180 * This structure describes the capabilities supported by the device
181 * in a single PHY mode.
182 *
183 * @list: internal
184 * @channels: pointer to array of supported channels
185 * @rates: pointer to array of supported bitrates
186 * @mode: the PHY mode for this definition
187 * @num_channels: number of supported channels
188 * @num_rates: number of supported bitrates
189 * @ht_info: PHY's 802.11n HT abilities for this mode
190 */
191struct ieee80211_hw_mode {
192 struct list_head list;
193 struct ieee80211_channel *channels;
194 struct ieee80211_rate *rates;
195 enum ieee80211_phymode mode;
196 int num_channels;
197 int num_rates;
198 struct ieee80211_ht_info ht_info;
199};
200
201/**
202 * struct ieee80211_tx_queue_params - transmit queue configuration 93 * struct ieee80211_tx_queue_params - transmit queue configuration
203 * 94 *
204 * The information provided in this structure is required for QoS 95 * The information provided in this structure is required for QoS
205 * transmit queue configuration. 96 * transmit queue configuration. Cf. IEEE 802.11 7.3.2.29.
206 * 97 *
207 * @aifs: arbitration interface space [0..255, -1: use default] 98 * @aifs: arbitration interface space [0..255, -1: use default]
208 * @cw_min: minimum contention window [will be a value of the form 99 * @cw_min: minimum contention window [will be a value of the form
209 * 2^n-1 in the range 1..1023; 0: use default] 100 * 2^n-1 in the range 1..1023; 0: use default]
210 * @cw_max: maximum contention window [like @cw_min] 101 * @cw_max: maximum contention window [like @cw_min]
211 * @burst_time: maximum burst time in units of 0.1ms, 0 meaning disabled 102 * @txop: maximum burst time in units of 32 usecs, 0 meaning disabled
212 */ 103 */
213struct ieee80211_tx_queue_params { 104struct ieee80211_tx_queue_params {
214 int aifs; 105 s16 aifs;
215 int cw_min; 106 u16 cw_min;
216 int cw_max; 107 u16 cw_max;
217 int burst_time; 108 u16 txop;
218}; 109};
219 110
220/** 111/**
@@ -246,6 +137,7 @@ struct ieee80211_tx_queue_stats_data {
246 * @IEEE80211_TX_QUEUE_AFTER_BEACON: transmit queue for frames to be 137 * @IEEE80211_TX_QUEUE_AFTER_BEACON: transmit queue for frames to be
247 * sent after a beacon 138 * sent after a beacon
248 * @IEEE80211_TX_QUEUE_BEACON: transmit queue for beacon frames 139 * @IEEE80211_TX_QUEUE_BEACON: transmit queue for beacon frames
140 * @NUM_TX_DATA_QUEUES_AMPDU: adding more queues for A-MPDU
249 */ 141 */
250enum ieee80211_tx_queue { 142enum ieee80211_tx_queue {
251 IEEE80211_TX_QUEUE_DATA0, 143 IEEE80211_TX_QUEUE_DATA0,
@@ -261,11 +153,12 @@ enum ieee80211_tx_queue {
261 * this struct need to have fixed values. As soon as it is removed, we can 153 * this struct need to have fixed values. As soon as it is removed, we can
262 * fix these entries. */ 154 * fix these entries. */
263 IEEE80211_TX_QUEUE_AFTER_BEACON = 6, 155 IEEE80211_TX_QUEUE_AFTER_BEACON = 6,
264 IEEE80211_TX_QUEUE_BEACON = 7 156 IEEE80211_TX_QUEUE_BEACON = 7,
157 NUM_TX_DATA_QUEUES_AMPDU = 16
265}; 158};
266 159
267struct ieee80211_tx_queue_stats { 160struct ieee80211_tx_queue_stats {
268 struct ieee80211_tx_queue_stats_data data[NUM_TX_DATA_QUEUES]; 161 struct ieee80211_tx_queue_stats_data data[NUM_TX_DATA_QUEUES_AMPDU];
269}; 162};
270 163
271struct ieee80211_low_level_stats { 164struct ieee80211_low_level_stats {
@@ -312,63 +205,88 @@ struct ieee80211_bss_conf {
312 bool use_short_preamble; 205 bool use_short_preamble;
313}; 206};
314 207
208/**
209 * enum mac80211_tx_control_flags - flags to describe Tx configuration for
210 * the Tx frame
211 *
212 * These flags are used with the @flags member of &ieee80211_tx_control
213 *
214 * @IEEE80211_TXCTL_REQ_TX_STATUS: request TX status callback for this frame.
215 * @IEEE80211_TXCTL_DO_NOT_ENCRYPT: send this frame without encryption;
216 * e.g., for EAPOL frame
217 * @IEEE80211_TXCTL_USE_RTS_CTS: use RTS-CTS before sending frame
218 * @IEEE80211_TXCTL_USE_CTS_PROTECT: use CTS protection for the frame (e.g.,
219 * for combined 802.11g / 802.11b networks)
220 * @IEEE80211_TXCTL_NO_ACK: tell the low level not to wait for an ack
221 * @IEEE80211_TXCTL_RATE_CTRL_PROBE
222 * @EEE80211_TXCTL_CLEAR_PS_FILT: clear powersave filter
223 * for destination station
224 * @IEEE80211_TXCTL_REQUEUE:
225 * @IEEE80211_TXCTL_FIRST_FRAGMENT: this is a first fragment of the frame
226 * @IEEE80211_TXCTL_LONG_RETRY_LIMIT: this frame should be send using the
227 * through set_retry_limit configured long
228 * retry value
229 * @IEEE80211_TXCTL_EAPOL_FRAME: internal to mac80211
230 * @IEEE80211_TXCTL_SEND_AFTER_DTIM: send this frame after DTIM beacon
231 * @IEEE80211_TXCTL_AMPDU: this frame should be sent as part of an A-MPDU
232 * @IEEE80211_TXCTL_OFDM_HT: this frame can be sent in HT OFDM rates. number
233 * of streams when this flag is on can be extracted
234 * from antenna_sel_tx, so if 1 antenna is marked
235 * use SISO, 2 antennas marked use MIMO, n antennas
236 * marked use MIMO_n.
237 * @IEEE80211_TXCTL_GREEN_FIELD: use green field protection for this frame
238 * @IEEE80211_TXCTL_40_MHZ_WIDTH: send this frame using 40 Mhz channel width
239 * @IEEE80211_TXCTL_DUP_DATA: duplicate data frame on both 20 Mhz channels
240 * @IEEE80211_TXCTL_SHORT_GI: send this frame using short guard interval
241 */
242enum mac80211_tx_control_flags {
243 IEEE80211_TXCTL_REQ_TX_STATUS = (1<<0),
244 IEEE80211_TXCTL_DO_NOT_ENCRYPT = (1<<1),
245 IEEE80211_TXCTL_USE_RTS_CTS = (1<<2),
246 IEEE80211_TXCTL_USE_CTS_PROTECT = (1<<3),
247 IEEE80211_TXCTL_NO_ACK = (1<<4),
248 IEEE80211_TXCTL_RATE_CTRL_PROBE = (1<<5),
249 IEEE80211_TXCTL_CLEAR_PS_FILT = (1<<6),
250 IEEE80211_TXCTL_REQUEUE = (1<<7),
251 IEEE80211_TXCTL_FIRST_FRAGMENT = (1<<8),
252 IEEE80211_TXCTL_SHORT_PREAMBLE = (1<<9),
253 IEEE80211_TXCTL_LONG_RETRY_LIMIT = (1<<10),
254 IEEE80211_TXCTL_EAPOL_FRAME = (1<<11),
255 IEEE80211_TXCTL_SEND_AFTER_DTIM = (1<<12),
256 IEEE80211_TXCTL_AMPDU = (1<<13),
257 IEEE80211_TXCTL_OFDM_HT = (1<<14),
258 IEEE80211_TXCTL_GREEN_FIELD = (1<<15),
259 IEEE80211_TXCTL_40_MHZ_WIDTH = (1<<16),
260 IEEE80211_TXCTL_DUP_DATA = (1<<17),
261 IEEE80211_TXCTL_SHORT_GI = (1<<18),
262};
263
315/* Transmit control fields. This data structure is passed to low-level driver 264/* Transmit control fields. This data structure is passed to low-level driver
316 * with each TX frame. The low-level driver is responsible for configuring 265 * with each TX frame. The low-level driver is responsible for configuring
317 * the hardware to use given values (depending on what is supported). */ 266 * the hardware to use given values (depending on what is supported). */
318 267
319struct ieee80211_tx_control { 268struct ieee80211_tx_control {
320 struct ieee80211_vif *vif; 269 struct ieee80211_vif *vif;
321 int tx_rate; /* Transmit rate, given as the hw specific value for the 270 struct ieee80211_rate *tx_rate;
322 * rate (from struct ieee80211_rate) */ 271
323 int rts_cts_rate; /* Transmit rate for RTS/CTS frame, given as the hw 272 /* Transmit rate for RTS/CTS frame */
324 * specific value for the rate (from 273 struct ieee80211_rate *rts_cts_rate;
325 * struct ieee80211_rate) */ 274
326 275 /* retry rate for the last retries */
327#define IEEE80211_TXCTL_REQ_TX_STATUS (1<<0)/* request TX status callback for 276 struct ieee80211_rate *alt_retry_rate;
328 * this frame */ 277
329#define IEEE80211_TXCTL_DO_NOT_ENCRYPT (1<<1) /* send this frame without 278 u32 flags; /* tx control flags defined above */
330 * encryption; e.g., for EAPOL
331 * frames */
332#define IEEE80211_TXCTL_USE_RTS_CTS (1<<2) /* use RTS-CTS before sending
333 * frame */
334#define IEEE80211_TXCTL_USE_CTS_PROTECT (1<<3) /* use CTS protection for the
335 * frame (e.g., for combined
336 * 802.11g / 802.11b networks) */
337#define IEEE80211_TXCTL_NO_ACK (1<<4) /* tell the low level not to
338 * wait for an ack */
339#define IEEE80211_TXCTL_RATE_CTRL_PROBE (1<<5)
340#define IEEE80211_TXCTL_CLEAR_DST_MASK (1<<6)
341#define IEEE80211_TXCTL_REQUEUE (1<<7)
342#define IEEE80211_TXCTL_FIRST_FRAGMENT (1<<8) /* this is a first fragment of
343 * the frame */
344#define IEEE80211_TXCTL_LONG_RETRY_LIMIT (1<<10) /* this frame should be send
345 * using the through
346 * set_retry_limit configured
347 * long retry value */
348#define IEEE80211_TXCTL_EAPOL_FRAME (1<<11) /* internal to mac80211 */
349#define IEEE80211_TXCTL_SEND_AFTER_DTIM (1<<12) /* send this frame after DTIM
350 * beacon */
351 u32 flags; /* tx control flags defined
352 * above */
353 u8 key_idx; /* keyidx from hw->set_key(), undefined if 279 u8 key_idx; /* keyidx from hw->set_key(), undefined if
354 * IEEE80211_TXCTL_DO_NOT_ENCRYPT is set */ 280 * IEEE80211_TXCTL_DO_NOT_ENCRYPT is set */
355 u8 retry_limit; /* 1 = only first attempt, 2 = one retry, .. 281 u8 retry_limit; /* 1 = only first attempt, 2 = one retry, ..
356 * This could be used when set_retry_limit 282 * This could be used when set_retry_limit
357 * is not implemented by the driver */ 283 * is not implemented by the driver */
358 u8 power_level; /* per-packet transmit power level, in dBm */ 284 u8 antenna_sel_tx; /* 0 = default/diversity, otherwise bit
359 u8 antenna_sel_tx; /* 0 = default/diversity, 1 = Ant0, 2 = Ant1 */ 285 * position represents antenna number used */
360 u8 icv_len; /* length of the ICV/MIC field in octets */ 286 u8 icv_len; /* length of the ICV/MIC field in octets */
361 u8 iv_len; /* length of the IV field in octets */ 287 u8 iv_len; /* length of the IV field in octets */
362 u8 queue; /* hardware queue to use for this frame; 288 u8 queue; /* hardware queue to use for this frame;
363 * 0 = highest, hw->queues-1 = lowest */ 289 * 0 = highest, hw->queues-1 = lowest */
364 struct ieee80211_rate *rate; /* internal 80211.o rate */
365 struct ieee80211_rate *rts_rate; /* internal 80211.o rate
366 * for RTS/CTS */
367 int alt_retry_rate; /* retry rate for the last retries, given as the
368 * hw specific value for the rate (from
369 * struct ieee80211_rate). To be used to limit
370 * packet dropping when probing higher rates, if hw
371 * supports multiple retry rates. -1 = not used */
372 int type; /* internal */ 290 int type; /* internal */
373}; 291};
374 292
@@ -391,7 +309,8 @@ struct ieee80211_tx_control {
391 * @RX_FLAG_FAILED_PLCP_CRC: Set this flag if the PCLP check failed on 309 * @RX_FLAG_FAILED_PLCP_CRC: Set this flag if the PCLP check failed on
392 * the frame. 310 * the frame.
393 * @RX_FLAG_TSFT: The timestamp passed in the RX status (@mactime field) 311 * @RX_FLAG_TSFT: The timestamp passed in the RX status (@mactime field)
394 * is valid. 312 * is valid. This is useful in monitor mode and necessary for beacon frames
313 * to enable IBSS merging.
395 */ 314 */
396enum mac80211_rx_flags { 315enum mac80211_rx_flags {
397 RX_FLAG_MMIC_ERROR = 1<<0, 316 RX_FLAG_MMIC_ERROR = 1<<0,
@@ -410,27 +329,26 @@ enum mac80211_rx_flags {
410 * The low-level driver should provide this information (the subset 329 * The low-level driver should provide this information (the subset
411 * supported by hardware) to the 802.11 code with each received 330 * supported by hardware) to the 802.11 code with each received
412 * frame. 331 * frame.
413 * @mactime: MAC timestamp as defined by 802.11 332 * @mactime: value in microseconds of the 64-bit Time Synchronization Function
333 * (TSF) timer when the first data symbol (MPDU) arrived at the hardware.
334 * @band: the active band when this frame was received
414 * @freq: frequency the radio was tuned to when receiving this frame, in MHz 335 * @freq: frequency the radio was tuned to when receiving this frame, in MHz
415 * @channel: channel the radio was tuned to
416 * @phymode: active PHY mode
417 * @ssi: signal strength when receiving this frame 336 * @ssi: signal strength when receiving this frame
418 * @signal: used as 'qual' in statistics reporting 337 * @signal: used as 'qual' in statistics reporting
419 * @noise: PHY noise when receiving this frame 338 * @noise: PHY noise when receiving this frame
420 * @antenna: antenna used 339 * @antenna: antenna used
421 * @rate: data rate 340 * @rate_idx: index of data rate into band's supported rates
422 * @flag: %RX_FLAG_* 341 * @flag: %RX_FLAG_*
423 */ 342 */
424struct ieee80211_rx_status { 343struct ieee80211_rx_status {
425 u64 mactime; 344 u64 mactime;
345 enum ieee80211_band band;
426 int freq; 346 int freq;
427 int channel;
428 enum ieee80211_phymode phymode;
429 int ssi; 347 int ssi;
430 int signal; 348 int signal;
431 int noise; 349 int noise;
432 int antenna; 350 int antenna;
433 int rate; 351 int rate_idx;
434 int flag; 352 int flag;
435}; 353};
436 354
@@ -441,12 +359,14 @@ struct ieee80211_rx_status {
441 * 359 *
442 * @IEEE80211_TX_STATUS_TX_FILTERED: The frame was not transmitted 360 * @IEEE80211_TX_STATUS_TX_FILTERED: The frame was not transmitted
443 * because the destination STA was in powersave mode. 361 * because the destination STA was in powersave mode.
444 *
445 * @IEEE80211_TX_STATUS_ACK: Frame was acknowledged 362 * @IEEE80211_TX_STATUS_ACK: Frame was acknowledged
363 * @IEEE80211_TX_STATUS_AMPDU: The frame was aggregated, so status
364 * is for the whole aggregation.
446 */ 365 */
447enum ieee80211_tx_status_flags { 366enum ieee80211_tx_status_flags {
448 IEEE80211_TX_STATUS_TX_FILTERED = 1<<0, 367 IEEE80211_TX_STATUS_TX_FILTERED = 1<<0,
449 IEEE80211_TX_STATUS_ACK = 1<<1, 368 IEEE80211_TX_STATUS_ACK = 1<<1,
369 IEEE80211_TX_STATUS_AMPDU = 1<<2,
450}; 370};
451 371
452/** 372/**
@@ -457,24 +377,25 @@ enum ieee80211_tx_status_flags {
457 * 377 *
458 * @control: a copy of the &struct ieee80211_tx_control passed to the driver 378 * @control: a copy of the &struct ieee80211_tx_control passed to the driver
459 * in the tx() callback. 379 * in the tx() callback.
460 *
461 * @flags: transmit status flags, defined above 380 * @flags: transmit status flags, defined above
462 * 381 * @retry_count: number of retries
463 * @ack_signal: signal strength of the ACK frame
464 *
465 * @excessive_retries: set to 1 if the frame was retried many times 382 * @excessive_retries: set to 1 if the frame was retried many times
466 * but not acknowledged 383 * but not acknowledged
467 * 384 * @ampdu_ack_len: number of aggregated frames.
468 * @retry_count: number of retries 385 * relevant only if IEEE80211_TX_STATUS_AMPDU was set.
469 * 386 * @ampdu_ack_map: block ack bit map for the aggregation.
387 * relevant only if IEEE80211_TX_STATUS_AMPDU was set.
388 * @ack_signal: signal strength of the ACK frame
470 * @queue_length: ?? REMOVE 389 * @queue_length: ?? REMOVE
471 * @queue_number: ?? REMOVE 390 * @queue_number: ?? REMOVE
472 */ 391 */
473struct ieee80211_tx_status { 392struct ieee80211_tx_status {
474 struct ieee80211_tx_control control; 393 struct ieee80211_tx_control control;
475 u8 flags; 394 u8 flags;
476 bool excessive_retries;
477 u8 retry_count; 395 u8 retry_count;
396 bool excessive_retries;
397 u8 ampdu_ack_len;
398 u64 ampdu_ack_map;
478 int ack_signal; 399 int ack_signal;
479 int queue_length; 400 int queue_length;
480 int queue_number; 401 int queue_number;
@@ -502,41 +423,29 @@ enum ieee80211_conf_flags {
502 * 423 *
503 * @radio_enabled: when zero, driver is required to switch off the radio. 424 * @radio_enabled: when zero, driver is required to switch off the radio.
504 * TODO make a flag 425 * TODO make a flag
505 * @channel: IEEE 802.11 channel number
506 * @freq: frequency in MHz
507 * @channel_val: hardware specific channel value for the channel
508 * @phymode: PHY mode to activate (REMOVE)
509 * @chan: channel to switch to, pointer to the channel information
510 * @mode: pointer to mode definition
511 * @regulatory_domain: ??
512 * @beacon_int: beacon interval (TODO make interface config) 426 * @beacon_int: beacon interval (TODO make interface config)
513 * @flags: configuration flags defined above 427 * @flags: configuration flags defined above
514 * @power_level: transmit power limit for current regulatory domain in dBm 428 * @power_level: requested transmit power (in dBm)
515 * @antenna_max: maximum antenna gain 429 * @max_antenna_gain: maximum antenna gain (in dBi)
516 * @antenna_sel_tx: transmit antenna selection, 0: default/diversity, 430 * @antenna_sel_tx: transmit antenna selection, 0: default/diversity,
517 * 1/2: antenna 0/1 431 * 1/2: antenna 0/1
518 * @antenna_sel_rx: receive antenna selection, like @antenna_sel_tx 432 * @antenna_sel_rx: receive antenna selection, like @antenna_sel_tx
519 * @ht_conf: describes current self configuration of 802.11n HT capabilies 433 * @ht_conf: describes current self configuration of 802.11n HT capabilies
520 * @ht_bss_conf: describes current BSS configuration of 802.11n HT parameters 434 * @ht_bss_conf: describes current BSS configuration of 802.11n HT parameters
435 * @channel: the channel to tune to
521 */ 436 */
522struct ieee80211_conf { 437struct ieee80211_conf {
523 int channel; /* IEEE 802.11 channel number */
524 int freq; /* MHz */
525 int channel_val; /* hw specific value for the channel */
526
527 enum ieee80211_phymode phymode;
528 struct ieee80211_channel *chan;
529 struct ieee80211_hw_mode *mode;
530 unsigned int regulatory_domain;
531 int radio_enabled; 438 int radio_enabled;
532 439
533 int beacon_int; 440 int beacon_int;
534 u32 flags; 441 u32 flags;
535 u8 power_level; 442 int power_level;
536 u8 antenna_max; 443 int max_antenna_gain;
537 u8 antenna_sel_tx; 444 u8 antenna_sel_tx;
538 u8 antenna_sel_rx; 445 u8 antenna_sel_rx;
539 446
447 struct ieee80211_channel *channel;
448
540 struct ieee80211_ht_info ht_conf; 449 struct ieee80211_ht_info ht_conf;
541 struct ieee80211_ht_bss_info ht_bss_conf; 450 struct ieee80211_ht_bss_info ht_bss_conf;
542}; 451};
@@ -555,12 +464,14 @@ struct ieee80211_conf {
555 * @IEEE80211_IF_TYPE_WDS: interface in WDS mode. 464 * @IEEE80211_IF_TYPE_WDS: interface in WDS mode.
556 * @IEEE80211_IF_TYPE_VLAN: VLAN interface bound to an AP, drivers 465 * @IEEE80211_IF_TYPE_VLAN: VLAN interface bound to an AP, drivers
557 * will never see this type. 466 * will never see this type.
467 * @IEEE80211_IF_TYPE_MESH_POINT: 802.11s mesh point
558 */ 468 */
559enum ieee80211_if_types { 469enum ieee80211_if_types {
560 IEEE80211_IF_TYPE_INVALID, 470 IEEE80211_IF_TYPE_INVALID,
561 IEEE80211_IF_TYPE_AP, 471 IEEE80211_IF_TYPE_AP,
562 IEEE80211_IF_TYPE_STA, 472 IEEE80211_IF_TYPE_STA,
563 IEEE80211_IF_TYPE_IBSS, 473 IEEE80211_IF_TYPE_IBSS,
474 IEEE80211_IF_TYPE_MESH_POINT,
564 IEEE80211_IF_TYPE_MNTR, 475 IEEE80211_IF_TYPE_MNTR,
565 IEEE80211_IF_TYPE_WDS, 476 IEEE80211_IF_TYPE_WDS,
566 IEEE80211_IF_TYPE_VLAN, 477 IEEE80211_IF_TYPE_VLAN,
@@ -582,6 +493,14 @@ struct ieee80211_vif {
582 u8 drv_priv[0] __attribute__((__aligned__(sizeof(void *)))); 493 u8 drv_priv[0] __attribute__((__aligned__(sizeof(void *))));
583}; 494};
584 495
496static inline bool ieee80211_vif_is_mesh(struct ieee80211_vif *vif)
497{
498#ifdef CONFIG_MAC80211_MESH
499 return vif->type == IEEE80211_IF_TYPE_MESH_POINT;
500#endif
501 return false;
502}
503
585/** 504/**
586 * struct ieee80211_if_init_conf - initial configuration of an interface 505 * struct ieee80211_if_init_conf - initial configuration of an interface
587 * 506 *
@@ -725,6 +644,21 @@ enum sta_notify_cmd {
725}; 644};
726 645
727/** 646/**
647 * enum ieee80211_tkip_key_type - get tkip key
648 *
649 * Used by drivers which need to get a tkip key for skb. Some drivers need a
650 * phase 1 key, others need a phase 2 key. A single function allows the driver
651 * to get the key, this enum indicates what type of key is required.
652 *
653 * @IEEE80211_TKIP_P1_KEY: the driver needs a phase 1 key
654 * @IEEE80211_TKIP_P2_KEY: the driver needs a phase 2 key
655 */
656enum ieee80211_tkip_key_type {
657 IEEE80211_TKIP_P1_KEY,
658 IEEE80211_TKIP_P2_KEY,
659};
660
661/**
728 * enum ieee80211_hw_flags - hardware flags 662 * enum ieee80211_hw_flags - hardware flags
729 * 663 *
730 * These flags are used to indicate hardware capabilities to 664 * These flags are used to indicate hardware capabilities to
@@ -757,15 +691,19 @@ enum sta_notify_cmd {
757 * %IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE is also not set because 691 * %IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE is also not set because
758 * otherwise the stack will not know when the DTIM beacon was sent. 692 * otherwise the stack will not know when the DTIM beacon was sent.
759 * 693 *
760 * @IEEE80211_HW_DEFAULT_REG_DOMAIN_CONFIGURED: 694 * @IEEE80211_HW_2GHZ_SHORT_SLOT_INCAPABLE:
761 * Channels are already configured to the default regulatory domain 695 * Hardware is not capable of short slot operation on the 2.4 GHz band.
762 * specified in the device's EEPROM 696 *
697 * @IEEE80211_HW_2GHZ_SHORT_PREAMBLE_INCAPABLE:
698 * Hardware is not capable of receiving frames with short preamble on
699 * the 2.4 GHz band.
763 */ 700 */
764enum ieee80211_hw_flags { 701enum ieee80211_hw_flags {
765 IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE = 1<<0, 702 IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE = 1<<0,
766 IEEE80211_HW_RX_INCLUDES_FCS = 1<<1, 703 IEEE80211_HW_RX_INCLUDES_FCS = 1<<1,
767 IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING = 1<<2, 704 IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING = 1<<2,
768 IEEE80211_HW_DEFAULT_REG_DOMAIN_CONFIGURED = 1<<3, 705 IEEE80211_HW_2GHZ_SHORT_SLOT_INCAPABLE = 1<<3,
706 IEEE80211_HW_2GHZ_SHORT_PREAMBLE_INCAPABLE = 1<<4,
769}; 707};
770 708
771/** 709/**
@@ -777,7 +715,8 @@ enum ieee80211_hw_flags {
777 * @wiphy: This points to the &struct wiphy allocated for this 715 * @wiphy: This points to the &struct wiphy allocated for this
778 * 802.11 PHY. You must fill in the @perm_addr and @dev 716 * 802.11 PHY. You must fill in the @perm_addr and @dev
779 * members of this structure using SET_IEEE80211_DEV() 717 * members of this structure using SET_IEEE80211_DEV()
780 * and SET_IEEE80211_PERM_ADDR(). 718 * and SET_IEEE80211_PERM_ADDR(). Additionally, all supported
719 * bands (with channels, bitrates) are registered here.
781 * 720 *
782 * @conf: &struct ieee80211_conf, device configuration, don't use. 721 * @conf: &struct ieee80211_conf, device configuration, don't use.
783 * 722 *
@@ -888,6 +827,16 @@ static inline void SET_IEEE80211_PERM_ADDR(struct ieee80211_hw *hw, u8 *addr)
888 * parameter is guaranteed to be valid until another call to set_key() 827 * parameter is guaranteed to be valid until another call to set_key()
889 * removes it, but it can only be used as a cookie to differentiate 828 * removes it, but it can only be used as a cookie to differentiate
890 * keys. 829 * keys.
830 *
831 * In TKIP some HW need to be provided a phase 1 key, for RX decryption
832 * acceleration (i.e. iwlwifi). Those drivers should provide update_tkip_key
833 * handler.
834 * The update_tkip_key() call updates the driver with the new phase 1 key.
835 * This happens everytime the iv16 wraps around (every 65536 packets). The
836 * set_key() call will happen only once for each key (unless the AP did
837 * rekeying), it will not include a valid phase 1 key. The valid phase 1 key is
838 * provided by udpate_tkip_key only. The trigger that makes mac80211 call this
839 * handler is software decryption with wrap around of iv16.
891 */ 840 */
892 841
893/** 842/**
@@ -913,8 +862,18 @@ static inline void SET_IEEE80211_PERM_ADDR(struct ieee80211_hw *hw, u8 *addr)
913 * parameter to see whether multicast frames should be accepted 862 * parameter to see whether multicast frames should be accepted
914 * or dropped. 863 * or dropped.
915 * 864 *
916 * All unsupported flags in @total_flags must be cleared, i.e. you 865 * All unsupported flags in @total_flags must be cleared.
917 * should clear all bits except those you honoured. 866 * Hardware does not support a flag if it is incapable of _passing_
867 * the frame to the stack. Otherwise the driver must ignore
868 * the flag, but not clear it.
869 * You must _only_ clear the flag (announce no support for the
870 * flag to mac80211) if you are not able to pass the packet type
871 * to the stack (so the hardware always filters it).
872 * So for example, you should clear @FIF_CONTROL, if your hardware
873 * always filters control frames. If your hardware always passes
874 * control frames to the kernel and is incapable of filtering them,
875 * you do _not_ clear the @FIF_CONTROL flag.
876 * This rule applies to all other FIF flags as well.
918 */ 877 */
919 878
920/** 879/**
@@ -967,10 +926,14 @@ enum ieee80211_filter_flags {
967 * &struct ieee80211_ops to indicate which action is needed. 926 * &struct ieee80211_ops to indicate which action is needed.
968 * @IEEE80211_AMPDU_RX_START: start Rx aggregation 927 * @IEEE80211_AMPDU_RX_START: start Rx aggregation
969 * @IEEE80211_AMPDU_RX_STOP: stop Rx aggregation 928 * @IEEE80211_AMPDU_RX_STOP: stop Rx aggregation
929 * @IEEE80211_AMPDU_TX_START: start Tx aggregation
930 * @IEEE80211_AMPDU_TX_STOP: stop Tx aggregation
970 */ 931 */
971enum ieee80211_ampdu_mlme_action { 932enum ieee80211_ampdu_mlme_action {
972 IEEE80211_AMPDU_RX_START, 933 IEEE80211_AMPDU_RX_START,
973 IEEE80211_AMPDU_RX_STOP, 934 IEEE80211_AMPDU_RX_STOP,
935 IEEE80211_AMPDU_TX_START,
936 IEEE80211_AMPDU_TX_STOP,
974}; 937};
975 938
976/** 939/**
@@ -1050,8 +1013,14 @@ enum ieee80211_ampdu_mlme_action {
1050 * and remove_interface calls, i.e. while the interface with the 1013 * and remove_interface calls, i.e. while the interface with the
1051 * given local_address is enabled. 1014 * given local_address is enabled.
1052 * 1015 *
1016 * @update_tkip_key: See the section "Hardware crypto acceleration"
1017 * This callback will be called in the context of Rx. Called for drivers
1018 * which set IEEE80211_KEY_FLAG_TKIP_REQ_RX_P1_KEY.
1019 *
1053 * @hw_scan: Ask the hardware to service the scan request, no need to start 1020 * @hw_scan: Ask the hardware to service the scan request, no need to start
1054 * the scan state machine in stack. 1021 * the scan state machine in stack. The scan must honour the channel
1022 * configuration done by the regulatory agent in the wiphy's registered
1023 * bands.
1055 * 1024 *
1056 * @get_stats: return low-level statistics 1025 * @get_stats: return low-level statistics
1057 * 1026 *
@@ -1111,7 +1080,8 @@ enum ieee80211_ampdu_mlme_action {
1111 * The RA/TID combination determines the destination and TID we want 1080 * The RA/TID combination determines the destination and TID we want
1112 * the ampdu action to be performed for. The action is defined through 1081 * the ampdu action to be performed for. The action is defined through
1113 * ieee80211_ampdu_mlme_action. Starting sequence number (@ssn) 1082 * ieee80211_ampdu_mlme_action. Starting sequence number (@ssn)
1114 * is the first frame we expect to perform the action on. 1083 * is the first frame we expect to perform the action on. notice
1084 * that TX/RX_STOP can pass NULL for this parameter.
1115 */ 1085 */
1116struct ieee80211_ops { 1086struct ieee80211_ops {
1117 int (*tx)(struct ieee80211_hw *hw, struct sk_buff *skb, 1087 int (*tx)(struct ieee80211_hw *hw, struct sk_buff *skb,
@@ -1138,6 +1108,9 @@ struct ieee80211_ops {
1138 int (*set_key)(struct ieee80211_hw *hw, enum set_key_cmd cmd, 1108 int (*set_key)(struct ieee80211_hw *hw, enum set_key_cmd cmd,
1139 const u8 *local_address, const u8 *address, 1109 const u8 *local_address, const u8 *address,
1140 struct ieee80211_key_conf *key); 1110 struct ieee80211_key_conf *key);
1111 void (*update_tkip_key)(struct ieee80211_hw *hw,
1112 struct ieee80211_key_conf *conf, const u8 *address,
1113 u32 iv32, u16 *phase1key);
1141 int (*hw_scan)(struct ieee80211_hw *hw, u8 *ssid, size_t len); 1114 int (*hw_scan)(struct ieee80211_hw *hw, u8 *ssid, size_t len);
1142 int (*get_stats)(struct ieee80211_hw *hw, 1115 int (*get_stats)(struct ieee80211_hw *hw,
1143 struct ieee80211_low_level_stats *stats); 1116 struct ieee80211_low_level_stats *stats);
@@ -1162,7 +1135,7 @@ struct ieee80211_ops {
1162 int (*conf_ht)(struct ieee80211_hw *hw, struct ieee80211_conf *conf); 1135 int (*conf_ht)(struct ieee80211_hw *hw, struct ieee80211_conf *conf);
1163 int (*ampdu_action)(struct ieee80211_hw *hw, 1136 int (*ampdu_action)(struct ieee80211_hw *hw,
1164 enum ieee80211_ampdu_mlme_action action, 1137 enum ieee80211_ampdu_mlme_action action,
1165 const u8 *ra, u16 tid, u16 ssn); 1138 const u8 *addr, u16 tid, u16 *ssn);
1166}; 1139};
1167 1140
1168/** 1141/**
@@ -1183,8 +1156,9 @@ struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len,
1183/** 1156/**
1184 * ieee80211_register_hw - Register hardware device 1157 * ieee80211_register_hw - Register hardware device
1185 * 1158 *
1186 * You must call this function before any other functions 1159 * You must call this function before any other functions in
1187 * except ieee80211_register_hwmode. 1160 * mac80211. Note that before a hardware can be registered, you
1161 * need to fill the contained wiphy's information.
1188 * 1162 *
1189 * @hw: the device to register as returned by ieee80211_alloc_hw() 1163 * @hw: the device to register as returned by ieee80211_alloc_hw()
1190 */ 1164 */
@@ -1272,10 +1246,6 @@ static inline char *ieee80211_get_radio_led_name(struct ieee80211_hw *hw)
1272#endif 1246#endif
1273} 1247}
1274 1248
1275/* Register a new hardware PHYMODE capability to the stack. */
1276int ieee80211_register_hwmode(struct ieee80211_hw *hw,
1277 struct ieee80211_hw_mode *mode);
1278
1279/** 1249/**
1280 * ieee80211_unregister_hw - Unregister a hardware device 1250 * ieee80211_unregister_hw - Unregister a hardware device
1281 * 1251 *
@@ -1308,7 +1278,10 @@ void __ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb,
1308 * buffer in @skb must start with an IEEE 802.11 header or a radiotap 1278 * buffer in @skb must start with an IEEE 802.11 header or a radiotap
1309 * header if %RX_FLAG_RADIOTAP is set in the @status flags. 1279 * header if %RX_FLAG_RADIOTAP is set in the @status flags.
1310 * 1280 *
1311 * This function may not be called in IRQ context. 1281 * This function may not be called in IRQ context. Calls to this function
1282 * for a single hardware must be synchronized against each other. Calls
1283 * to this function and ieee80211_rx_irqsafe() may not be mixed for a
1284 * single hardware.
1312 * 1285 *
1313 * @hw: the hardware this frame came in on 1286 * @hw: the hardware this frame came in on
1314 * @skb: the buffer to receive, owned by mac80211 after this call 1287 * @skb: the buffer to receive, owned by mac80211 after this call
@@ -1325,7 +1298,10 @@ static inline void ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb,
1325 * ieee80211_rx_irqsafe - receive frame 1298 * ieee80211_rx_irqsafe - receive frame
1326 * 1299 *
1327 * Like ieee80211_rx() but can be called in IRQ context 1300 * Like ieee80211_rx() but can be called in IRQ context
1328 * (internally defers to a workqueue.) 1301 * (internally defers to a tasklet.)
1302 *
1303 * Calls to this function and ieee80211_rx() may not be mixed for a
1304 * single hardware.
1329 * 1305 *
1330 * @hw: the hardware this frame came in on 1306 * @hw: the hardware this frame came in on
1331 * @skb: the buffer to receive, owned by mac80211 after this call 1307 * @skb: the buffer to receive, owned by mac80211 after this call
@@ -1344,6 +1320,11 @@ void ieee80211_rx_irqsafe(struct ieee80211_hw *hw,
1344 * transmitted. It is permissible to not call this function for 1320 * transmitted. It is permissible to not call this function for
1345 * multicast frames but this can affect statistics. 1321 * multicast frames but this can affect statistics.
1346 * 1322 *
1323 * This function may not be called in IRQ context. Calls to this function
1324 * for a single hardware must be synchronized against each other. Calls
1325 * to this function and ieee80211_tx_status_irqsafe() may not be mixed
1326 * for a single hardware.
1327 *
1347 * @hw: the hardware the frame was transmitted by 1328 * @hw: the hardware the frame was transmitted by
1348 * @skb: the frame that was transmitted, owned by mac80211 after this call 1329 * @skb: the frame that was transmitted, owned by mac80211 after this call
1349 * @status: status information for this frame; the status pointer need not 1330 * @status: status information for this frame; the status pointer need not
@@ -1353,6 +1334,22 @@ void ieee80211_rx_irqsafe(struct ieee80211_hw *hw,
1353void ieee80211_tx_status(struct ieee80211_hw *hw, 1334void ieee80211_tx_status(struct ieee80211_hw *hw,
1354 struct sk_buff *skb, 1335 struct sk_buff *skb,
1355 struct ieee80211_tx_status *status); 1336 struct ieee80211_tx_status *status);
1337
1338/**
1339 * ieee80211_tx_status_irqsafe - irq-safe transmit status callback
1340 *
1341 * Like ieee80211_tx_status() but can be called in IRQ context
1342 * (internally defers to a tasklet.)
1343 *
1344 * Calls to this function and ieee80211_tx_status() may not be mixed for a
1345 * single hardware.
1346 *
1347 * @hw: the hardware the frame was transmitted by
1348 * @skb: the frame that was transmitted, owned by mac80211 after this call
1349 * @status: status information for this frame; the status pointer need not
1350 * be valid after this function returns and is not freed by mac80211,
1351 * it is recommended that it points to a stack area
1352 */
1356void ieee80211_tx_status_irqsafe(struct ieee80211_hw *hw, 1353void ieee80211_tx_status_irqsafe(struct ieee80211_hw *hw,
1357 struct sk_buff *skb, 1354 struct sk_buff *skb,
1358 struct ieee80211_tx_status *status); 1355 struct ieee80211_tx_status *status);
@@ -1449,7 +1446,7 @@ __le16 ieee80211_ctstoself_duration(struct ieee80211_hw *hw,
1449 * @hw: pointer obtained from ieee80211_alloc_hw(). 1446 * @hw: pointer obtained from ieee80211_alloc_hw().
1450 * @vif: &struct ieee80211_vif pointer from &struct ieee80211_if_init_conf. 1447 * @vif: &struct ieee80211_vif pointer from &struct ieee80211_if_init_conf.
1451 * @frame_len: the length of the frame. 1448 * @frame_len: the length of the frame.
1452 * @rate: the rate (in 100kbps) at which the frame is going to be transmitted. 1449 * @rate: the rate at which the frame is going to be transmitted.
1453 * 1450 *
1454 * Calculate the duration field of some generic frame, given its 1451 * Calculate the duration field of some generic frame, given its
1455 * length and transmission rate (in 100kbps). 1452 * length and transmission rate (in 100kbps).
@@ -1457,7 +1454,7 @@ __le16 ieee80211_ctstoself_duration(struct ieee80211_hw *hw,
1457__le16 ieee80211_generic_frame_duration(struct ieee80211_hw *hw, 1454__le16 ieee80211_generic_frame_duration(struct ieee80211_hw *hw,
1458 struct ieee80211_vif *vif, 1455 struct ieee80211_vif *vif,
1459 size_t frame_len, 1456 size_t frame_len,
1460 int rate); 1457 struct ieee80211_rate *rate);
1461 1458
1462/** 1459/**
1463 * ieee80211_get_buffered_bc - accessing buffered broadcast and multicast frames 1460 * ieee80211_get_buffered_bc - accessing buffered broadcast and multicast frames
@@ -1507,6 +1504,21 @@ int ieee80211_get_hdrlen_from_skb(const struct sk_buff *skb);
1507int ieee80211_get_hdrlen(u16 fc); 1504int ieee80211_get_hdrlen(u16 fc);
1508 1505
1509/** 1506/**
1507 * ieee80211_get_tkip_key - get a TKIP rc4 for skb
1508 *
1509 * This function computes a TKIP rc4 key for an skb. It computes
1510 * a phase 1 key if needed (iv16 wraps around). This function is to
1511 * be used by drivers which can do HW encryption but need to compute
1512 * to phase 1/2 key in SW.
1513 *
1514 * @keyconf: the parameter passed with the set key
1515 * @skb: the skb for which the key is needed
1516 * @rc4key: a buffer to which the key will be written
1517 */
1518void ieee80211_get_tkip_key(struct ieee80211_key_conf *keyconf,
1519 struct sk_buff *skb,
1520 enum ieee80211_tkip_key_type type, u8 *key);
1521/**
1510 * ieee80211_wake_queue - wake specific queue 1522 * ieee80211_wake_queue - wake specific queue
1511 * @hw: pointer as obtained from ieee80211_alloc_hw(). 1523 * @hw: pointer as obtained from ieee80211_alloc_hw().
1512 * @queue: queue number (counted from zero). 1524 * @queue: queue number (counted from zero).
@@ -1574,4 +1586,81 @@ void ieee80211_iterate_active_interfaces(struct ieee80211_hw *hw,
1574 struct ieee80211_vif *vif), 1586 struct ieee80211_vif *vif),
1575 void *data); 1587 void *data);
1576 1588
1589/**
1590 * ieee80211_start_tx_ba_session - Start a tx Block Ack session.
1591 * @hw: pointer as obtained from ieee80211_alloc_hw().
1592 * @ra: receiver address of the BA session recipient
1593 * @tid: the TID to BA on.
1594 * @return: success if addBA request was sent, failure otherwise
1595 *
1596 * Although mac80211/low level driver/user space application can estimate
1597 * the need to start aggregation on a certain RA/TID, the session level
1598 * will be managed by the mac80211.
1599 */
1600int ieee80211_start_tx_ba_session(struct ieee80211_hw *hw, u8 *ra, u16 tid);
1601
1602/**
1603 * ieee80211_start_tx_ba_cb - low level driver ready to aggregate.
1604 * @hw: pointer as obtained from ieee80211_alloc_hw().
1605 * @ra: receiver address of the BA session recipient.
1606 * @tid: the TID to BA on.
1607 *
1608 * This function must be called by low level driver once it has
1609 * finished with preparations for the BA session.
1610 */
1611void ieee80211_start_tx_ba_cb(struct ieee80211_hw *hw, u8 *ra, u16 tid);
1612
1613/**
1614 * ieee80211_start_tx_ba_cb_irqsafe - low level driver ready to aggregate.
1615 * @hw: pointer as obtained from ieee80211_alloc_hw().
1616 * @ra: receiver address of the BA session recipient.
1617 * @tid: the TID to BA on.
1618 *
1619 * This function must be called by low level driver once it has
1620 * finished with preparations for the BA session.
1621 * This version of the function is irq safe.
1622 */
1623void ieee80211_start_tx_ba_cb_irqsafe(struct ieee80211_hw *hw, const u8 *ra,
1624 u16 tid);
1625
1626/**
1627 * ieee80211_stop_tx_ba_session - Stop a Block Ack session.
1628 * @hw: pointer as obtained from ieee80211_alloc_hw().
1629 * @ra: receiver address of the BA session recipient
1630 * @tid: the TID to stop BA.
1631 * @initiator: if indicates initiator DELBA frame will be sent.
1632 * @return: error if no sta with matching da found, success otherwise
1633 *
1634 * Although mac80211/low level driver/user space application can estimate
1635 * the need to stop aggregation on a certain RA/TID, the session level
1636 * will be managed by the mac80211.
1637 */
1638int ieee80211_stop_tx_ba_session(struct ieee80211_hw *hw,
1639 u8 *ra, u16 tid,
1640 enum ieee80211_back_parties initiator);
1641
1642/**
1643 * ieee80211_stop_tx_ba_cb - low level driver ready to stop aggregate.
1644 * @hw: pointer as obtained from ieee80211_alloc_hw().
1645 * @ra: receiver address of the BA session recipient.
1646 * @tid: the desired TID to BA on.
1647 *
1648 * This function must be called by low level driver once it has
1649 * finished with preparations for the BA session tear down.
1650 */
1651void ieee80211_stop_tx_ba_cb(struct ieee80211_hw *hw, u8 *ra, u8 tid);
1652
1653/**
1654 * ieee80211_stop_tx_ba_cb_irqsafe - low level driver ready to stop aggregate.
1655 * @hw: pointer as obtained from ieee80211_alloc_hw().
1656 * @ra: receiver address of the BA session recipient.
1657 * @tid: the desired TID to BA on.
1658 *
1659 * This function must be called by low level driver once it has
1660 * finished with preparations for the BA session tear down.
1661 * This version of the function is irq safe.
1662 */
1663void ieee80211_stop_tx_ba_cb_irqsafe(struct ieee80211_hw *hw, const u8 *ra,
1664 u16 tid);
1665
1577#endif /* MAC80211_H */ 1666#endif /* MAC80211_H */
diff --git a/include/net/ndisc.h b/include/net/ndisc.h
index 59b70624b056..5aedf324de66 100644
--- a/include/net/ndisc.h
+++ b/include/net/ndisc.h
@@ -77,7 +77,7 @@ struct nd_opt_hdr {
77} __attribute__((__packed__)); 77} __attribute__((__packed__));
78 78
79 79
80extern int ndisc_init(struct net_proto_family *ops); 80extern int ndisc_init(void);
81 81
82extern void ndisc_cleanup(void); 82extern void ndisc_cleanup(void);
83 83
@@ -107,7 +107,7 @@ extern int ndisc_mc_map(struct in6_addr *addr, char *buf, struct net_device *d
107/* 107/*
108 * IGMP 108 * IGMP
109 */ 109 */
110extern int igmp6_init(struct net_proto_family *ops); 110extern int igmp6_init(void);
111 111
112extern void igmp6_cleanup(void); 112extern void igmp6_cleanup(void);
113 113
diff --git a/include/net/neighbour.h b/include/net/neighbour.h
index 64a5f0120b52..dc420fecafb9 100644
--- a/include/net/neighbour.h
+++ b/include/net/neighbour.h
@@ -38,7 +38,9 @@ struct neighbour;
38 38
39struct neigh_parms 39struct neigh_parms
40{ 40{
41#ifdef CONFIG_NET_NS
41 struct net *net; 42 struct net *net;
43#endif
42 struct net_device *dev; 44 struct net_device *dev;
43 struct neigh_parms *next; 45 struct neigh_parms *next;
44 int (*neigh_setup)(struct neighbour *); 46 int (*neigh_setup)(struct neighbour *);
@@ -131,7 +133,9 @@ struct neigh_ops
131struct pneigh_entry 133struct pneigh_entry
132{ 134{
133 struct pneigh_entry *next; 135 struct pneigh_entry *next;
136#ifdef CONFIG_NET_NS
134 struct net *net; 137 struct net *net;
138#endif
135 struct net_device *dev; 139 struct net_device *dev;
136 u8 flags; 140 u8 flags;
137 u8 key[0]; 141 u8 key[0];
@@ -213,6 +217,17 @@ extern struct neighbour *neigh_event_ns(struct neigh_table *tbl,
213 217
214extern struct neigh_parms *neigh_parms_alloc(struct net_device *dev, struct neigh_table *tbl); 218extern struct neigh_parms *neigh_parms_alloc(struct net_device *dev, struct neigh_table *tbl);
215extern void neigh_parms_release(struct neigh_table *tbl, struct neigh_parms *parms); 219extern void neigh_parms_release(struct neigh_table *tbl, struct neigh_parms *parms);
220
221static inline
222struct net *neigh_parms_net(const struct neigh_parms *parms)
223{
224#ifdef CONFIG_NET_NS
225 return parms->net;
226#else
227 return &init_net;
228#endif
229}
230
216extern unsigned long neigh_rand_reach_time(unsigned long base); 231extern unsigned long neigh_rand_reach_time(unsigned long base);
217 232
218extern void pneigh_enqueue(struct neigh_table *tbl, struct neigh_parms *p, 233extern void pneigh_enqueue(struct neigh_table *tbl, struct neigh_parms *p,
@@ -224,6 +239,16 @@ extern struct pneigh_entry *__pneigh_lookup(struct neigh_table *tbl,
224 struct net_device *dev); 239 struct net_device *dev);
225extern int pneigh_delete(struct neigh_table *tbl, struct net *net, const void *key, struct net_device *dev); 240extern int pneigh_delete(struct neigh_table *tbl, struct net *net, const void *key, struct net_device *dev);
226 241
242static inline
243struct net *pneigh_net(const struct pneigh_entry *pneigh)
244{
245#ifdef CONFIG_NET_NS
246 return pneigh->net;
247#else
248 return &init_net;
249#endif
250}
251
227extern void neigh_app_ns(struct neighbour *n); 252extern void neigh_app_ns(struct neighbour *n);
228extern void neigh_for_each(struct neigh_table *tbl, void (*cb)(struct neighbour *, void *), void *cookie); 253extern void neigh_for_each(struct neigh_table *tbl, void (*cb)(struct neighbour *, void *), void *cookie);
229extern void __neigh_for_each_release(struct neigh_table *tbl, int (*cb)(struct neighbour *)); 254extern void __neigh_for_each_release(struct neigh_table *tbl, int (*cb)(struct neighbour *));
@@ -288,12 +313,6 @@ static inline void neigh_confirm(struct neighbour *neigh)
288 neigh->confirmed = jiffies; 313 neigh->confirmed = jiffies;
289} 314}
290 315
291static inline int neigh_is_connected(struct neighbour *neigh)
292{
293 return neigh->nud_state&NUD_CONNECTED;
294}
295
296
297static inline int neigh_event_send(struct neighbour *neigh, struct sk_buff *skb) 316static inline int neigh_event_send(struct neighbour *neigh, struct sk_buff *skb)
298{ 317{
299 neigh->used = jiffies; 318 neigh->used = jiffies;
diff --git a/include/net/net_namespace.h b/include/net/net_namespace.h
index 923f2b8b9096..f8f3d1a5fc35 100644
--- a/include/net/net_namespace.h
+++ b/include/net/net_namespace.h
@@ -118,6 +118,12 @@ static inline void release_net(struct net *net)
118{ 118{
119 atomic_dec(&net->use_count); 119 atomic_dec(&net->use_count);
120} 120}
121
122static inline
123int net_eq(const struct net *net1, const struct net *net2)
124{
125 return net1 == net2;
126}
121#else 127#else
122static inline struct net *get_net(struct net *net) 128static inline struct net *get_net(struct net *net)
123{ 129{
@@ -141,6 +147,12 @@ static inline struct net *maybe_get_net(struct net *net)
141{ 147{
142 return net; 148 return net;
143} 149}
150
151static inline
152int net_eq(const struct net *net1, const struct net *net2)
153{
154 return 1;
155}
144#endif 156#endif
145 157
146#define for_each_net(VAR) \ 158#define for_each_net(VAR) \
diff --git a/include/net/netfilter/nf_conntrack.h b/include/net/netfilter/nf_conntrack.h
index 90b3e7f5df5f..a3567a7a6d67 100644
--- a/include/net/netfilter/nf_conntrack.h
+++ b/include/net/netfilter/nf_conntrack.h
@@ -46,6 +46,7 @@ union nf_conntrack_expect_proto {
46#include <linux/netfilter/nf_conntrack_pptp.h> 46#include <linux/netfilter/nf_conntrack_pptp.h>
47#include <linux/netfilter/nf_conntrack_h323.h> 47#include <linux/netfilter/nf_conntrack_h323.h>
48#include <linux/netfilter/nf_conntrack_sane.h> 48#include <linux/netfilter/nf_conntrack_sane.h>
49#include <linux/netfilter/nf_conntrack_sip.h>
49 50
50/* per conntrack: application helper private data */ 51/* per conntrack: application helper private data */
51union nf_conntrack_help { 52union nf_conntrack_help {
@@ -54,6 +55,7 @@ union nf_conntrack_help {
54 struct nf_ct_pptp_master ct_pptp_info; 55 struct nf_ct_pptp_master ct_pptp_info;
55 struct nf_ct_h323_master ct_h323_info; 56 struct nf_ct_h323_master ct_h323_info;
56 struct nf_ct_sane_master ct_sane_info; 57 struct nf_ct_sane_master ct_sane_info;
58 struct nf_ct_sip_master ct_sip_info;
57}; 59};
58 60
59#include <linux/types.h> 61#include <linux/types.h>
@@ -75,6 +77,9 @@ do { \
75 77
76struct nf_conntrack_helper; 78struct nf_conntrack_helper;
77 79
80/* Must be kept in sync with the classes defined by helpers */
81#define NF_CT_MAX_EXPECT_CLASSES 3
82
78/* nf_conn feature for connections that have a helper */ 83/* nf_conn feature for connections that have a helper */
79struct nf_conn_help { 84struct nf_conn_help {
80 /* Helper. if any */ 85 /* Helper. if any */
@@ -85,7 +90,7 @@ struct nf_conn_help {
85 struct hlist_head expectations; 90 struct hlist_head expectations;
86 91
87 /* Current number of expected connections */ 92 /* Current number of expected connections */
88 unsigned int expecting; 93 u8 expecting[NF_CT_MAX_EXPECT_CLASSES];
89}; 94};
90 95
91 96
diff --git a/include/net/netfilter/nf_conntrack_expect.h b/include/net/netfilter/nf_conntrack_expect.h
index cb608a1b44e5..dfdf4b459475 100644
--- a/include/net/netfilter/nf_conntrack_expect.h
+++ b/include/net/netfilter/nf_conntrack_expect.h
@@ -41,6 +41,9 @@ struct nf_conntrack_expect
41 /* Flags */ 41 /* Flags */
42 unsigned int flags; 42 unsigned int flags;
43 43
44 /* Expectation class */
45 unsigned int class;
46
44#ifdef CONFIG_NF_NAT_NEEDED 47#ifdef CONFIG_NF_NAT_NEEDED
45 __be32 saved_ip; 48 __be32 saved_ip;
46 /* This is the original per-proto part, used to map the 49 /* This is the original per-proto part, used to map the
@@ -53,7 +56,16 @@ struct nf_conntrack_expect
53 struct rcu_head rcu; 56 struct rcu_head rcu;
54}; 57};
55 58
56#define NF_CT_EXPECT_PERMANENT 0x1 59struct nf_conntrack_expect_policy
60{
61 unsigned int max_expected;
62 unsigned int timeout;
63};
64
65#define NF_CT_EXPECT_CLASS_DEFAULT 0
66
67#define NF_CT_EXPECT_PERMANENT 0x1
68#define NF_CT_EXPECT_INACTIVE 0x2
57 69
58int nf_conntrack_expect_init(void); 70int nf_conntrack_expect_init(void);
59void nf_conntrack_expect_fini(void); 71void nf_conntrack_expect_fini(void);
@@ -74,10 +86,10 @@ void nf_ct_unexpect_related(struct nf_conntrack_expect *exp);
74/* Allocate space for an expectation: this is mandatory before calling 86/* Allocate space for an expectation: this is mandatory before calling
75 nf_ct_expect_related. You will have to call put afterwards. */ 87 nf_ct_expect_related. You will have to call put afterwards. */
76struct nf_conntrack_expect *nf_ct_expect_alloc(struct nf_conn *me); 88struct nf_conntrack_expect *nf_ct_expect_alloc(struct nf_conn *me);
77void nf_ct_expect_init(struct nf_conntrack_expect *, int, 89void nf_ct_expect_init(struct nf_conntrack_expect *, unsigned int, int,
78 union nf_inet_addr *, 90 const union nf_inet_addr *,
79 union nf_inet_addr *, 91 const union nf_inet_addr *,
80 u_int8_t, __be16 *, __be16 *); 92 u_int8_t, const __be16 *, const __be16 *);
81void nf_ct_expect_put(struct nf_conntrack_expect *exp); 93void nf_ct_expect_put(struct nf_conntrack_expect *exp);
82int nf_ct_expect_related(struct nf_conntrack_expect *expect); 94int nf_ct_expect_related(struct nf_conntrack_expect *expect);
83 95
diff --git a/include/net/netfilter/nf_conntrack_helper.h b/include/net/netfilter/nf_conntrack_helper.h
index 4ca125e9b3ce..f8060ab5a083 100644
--- a/include/net/netfilter/nf_conntrack_helper.h
+++ b/include/net/netfilter/nf_conntrack_helper.h
@@ -20,9 +20,7 @@ struct nf_conntrack_helper
20 20
21 const char *name; /* name of the module */ 21 const char *name; /* name of the module */
22 struct module *me; /* pointer to self */ 22 struct module *me; /* pointer to self */
23 unsigned int max_expected; /* Maximum number of concurrent 23 const struct nf_conntrack_expect_policy *expect_policy;
24 * expected connections */
25 unsigned int timeout; /* timeout for expecteds */
26 24
27 /* Tuple of things we will help (compared against server response) */ 25 /* Tuple of things we will help (compared against server response) */
28 struct nf_conntrack_tuple tuple; 26 struct nf_conntrack_tuple tuple;
@@ -37,6 +35,7 @@ struct nf_conntrack_helper
37 void (*destroy)(struct nf_conn *ct); 35 void (*destroy)(struct nf_conn *ct);
38 36
39 int (*to_nlattr)(struct sk_buff *skb, const struct nf_conn *ct); 37 int (*to_nlattr)(struct sk_buff *skb, const struct nf_conn *ct);
38 unsigned int expect_class_max;
40}; 39};
41 40
42extern struct nf_conntrack_helper * 41extern struct nf_conntrack_helper *
diff --git a/include/net/netfilter/nf_conntrack_tuple.h b/include/net/netfilter/nf_conntrack_tuple.h
index e69ab2e87597..168c91754d89 100644
--- a/include/net/netfilter/nf_conntrack_tuple.h
+++ b/include/net/netfilter/nf_conntrack_tuple.h
@@ -113,11 +113,39 @@ struct nf_conntrack_tuple_mask
113 113
114#ifdef __KERNEL__ 114#ifdef __KERNEL__
115 115
116#define NF_CT_DUMP_TUPLE(tp) \ 116static inline void nf_ct_dump_tuple_ip(const struct nf_conntrack_tuple *t)
117pr_debug("tuple %p: %u %u " NIP6_FMT " %hu -> " NIP6_FMT " %hu\n", \ 117{
118 (tp), (tp)->src.l3num, (tp)->dst.protonum, \ 118#ifdef DEBUG
119 NIP6(*(struct in6_addr *)(tp)->src.u3.all), ntohs((tp)->src.u.all), \ 119 printk("tuple %p: %u " NIPQUAD_FMT ":%hu -> " NIPQUAD_FMT ":%hu\n",
120 NIP6(*(struct in6_addr *)(tp)->dst.u3.all), ntohs((tp)->dst.u.all)) 120 t, t->dst.protonum,
121 NIPQUAD(t->src.u3.ip), ntohs(t->src.u.all),
122 NIPQUAD(t->dst.u3.ip), ntohs(t->dst.u.all));
123#endif
124}
125
126static inline void nf_ct_dump_tuple_ipv6(const struct nf_conntrack_tuple *t)
127{
128#ifdef DEBUG
129 printk("tuple %p: %u " NIP6_FMT " %hu -> " NIP6_FMT " %hu\n",
130 t, t->dst.protonum,
131 NIP6(*(struct in6_addr *)t->src.u3.all), ntohs(t->src.u.all),
132 NIP6(*(struct in6_addr *)t->dst.u3.all), ntohs(t->dst.u.all));
133#endif
134}
135
136static inline void nf_ct_dump_tuple(const struct nf_conntrack_tuple *t)
137{
138 switch (t->src.l3num) {
139 case AF_INET:
140 nf_ct_dump_tuple_ip(t);
141 break;
142 case AF_INET6:
143 nf_ct_dump_tuple_ipv6(t);
144 break;
145 }
146}
147
148#define NF_CT_DUMP_TUPLE(tp) nf_ct_dump_tuple(tp)
121 149
122/* If we're the first tuple, it's the original dir. */ 150/* If we're the first tuple, it's the original dir. */
123#define NF_CT_DIRECTION(h) \ 151#define NF_CT_DIRECTION(h) \
@@ -135,10 +163,7 @@ struct nf_conntrack_tuple_hash
135static inline int __nf_ct_tuple_src_equal(const struct nf_conntrack_tuple *t1, 163static inline int __nf_ct_tuple_src_equal(const struct nf_conntrack_tuple *t1,
136 const struct nf_conntrack_tuple *t2) 164 const struct nf_conntrack_tuple *t2)
137{ 165{
138 return (t1->src.u3.all[0] == t2->src.u3.all[0] && 166 return (nf_inet_addr_cmp(&t1->src.u3, &t2->src.u3) &&
139 t1->src.u3.all[1] == t2->src.u3.all[1] &&
140 t1->src.u3.all[2] == t2->src.u3.all[2] &&
141 t1->src.u3.all[3] == t2->src.u3.all[3] &&
142 t1->src.u.all == t2->src.u.all && 167 t1->src.u.all == t2->src.u.all &&
143 t1->src.l3num == t2->src.l3num); 168 t1->src.l3num == t2->src.l3num);
144} 169}
@@ -146,10 +171,7 @@ static inline int __nf_ct_tuple_src_equal(const struct nf_conntrack_tuple *t1,
146static inline int __nf_ct_tuple_dst_equal(const struct nf_conntrack_tuple *t1, 171static inline int __nf_ct_tuple_dst_equal(const struct nf_conntrack_tuple *t1,
147 const struct nf_conntrack_tuple *t2) 172 const struct nf_conntrack_tuple *t2)
148{ 173{
149 return (t1->dst.u3.all[0] == t2->dst.u3.all[0] && 174 return (nf_inet_addr_cmp(&t1->dst.u3, &t2->dst.u3) &&
150 t1->dst.u3.all[1] == t2->dst.u3.all[1] &&
151 t1->dst.u3.all[2] == t2->dst.u3.all[2] &&
152 t1->dst.u3.all[3] == t2->dst.u3.all[3] &&
153 t1->dst.u.all == t2->dst.u.all && 175 t1->dst.u.all == t2->dst.u.all &&
154 t1->dst.protonum == t2->dst.protonum); 176 t1->dst.protonum == t2->dst.protonum);
155} 177}
@@ -164,10 +186,7 @@ static inline int nf_ct_tuple_equal(const struct nf_conntrack_tuple *t1,
164static inline int nf_ct_tuple_mask_equal(const struct nf_conntrack_tuple_mask *m1, 186static inline int nf_ct_tuple_mask_equal(const struct nf_conntrack_tuple_mask *m1,
165 const struct nf_conntrack_tuple_mask *m2) 187 const struct nf_conntrack_tuple_mask *m2)
166{ 188{
167 return (m1->src.u3.all[0] == m2->src.u3.all[0] && 189 return (nf_inet_addr_cmp(&m1->src.u3, &m2->src.u3) &&
168 m1->src.u3.all[1] == m2->src.u3.all[1] &&
169 m1->src.u3.all[2] == m2->src.u3.all[2] &&
170 m1->src.u3.all[3] == m2->src.u3.all[3] &&
171 m1->src.u.all == m2->src.u.all); 190 m1->src.u.all == m2->src.u.all);
172} 191}
173 192
diff --git a/include/net/netns/ipv4.h b/include/net/netns/ipv4.h
index a9b4f6086294..af685f71f4b5 100644
--- a/include/net/netns/ipv4.h
+++ b/include/net/netns/ipv4.h
@@ -17,6 +17,7 @@ struct netns_ipv4 {
17#ifdef CONFIG_SYSCTL 17#ifdef CONFIG_SYSCTL
18 struct ctl_table_header *forw_hdr; 18 struct ctl_table_header *forw_hdr;
19 struct ctl_table_header *frags_hdr; 19 struct ctl_table_header *frags_hdr;
20 struct ctl_table_header *ipv4_hdr;
20#endif 21#endif
21 struct ipv4_devconf *devconf_all; 22 struct ipv4_devconf *devconf_all;
22 struct ipv4_devconf *devconf_dflt; 23 struct ipv4_devconf *devconf_dflt;
@@ -26,6 +27,8 @@ struct netns_ipv4 {
26 struct hlist_head *fib_table_hash; 27 struct hlist_head *fib_table_hash;
27 struct sock *fibnl; 28 struct sock *fibnl;
28 29
30 struct sock **icmp_sk;
31
29 struct netns_frags frags; 32 struct netns_frags frags;
30#ifdef CONFIG_NETFILTER 33#ifdef CONFIG_NETFILTER
31 struct xt_table *iptable_filter; 34 struct xt_table *iptable_filter;
@@ -33,5 +36,12 @@ struct netns_ipv4 {
33 struct xt_table *iptable_raw; 36 struct xt_table *iptable_raw;
34 struct xt_table *arptable_filter; 37 struct xt_table *arptable_filter;
35#endif 38#endif
39
40 int sysctl_icmp_echo_ignore_all;
41 int sysctl_icmp_echo_ignore_broadcasts;
42 int sysctl_icmp_ignore_bogus_error_responses;
43 int sysctl_icmp_ratelimit;
44 int sysctl_icmp_ratemask;
45 int sysctl_icmp_errors_use_inbound_ifaddr;
36}; 46};
37#endif 47#endif
diff --git a/include/net/netns/ipv6.h b/include/net/netns/ipv6.h
index 1dd7de4e4195..ac053be6c256 100644
--- a/include/net/netns/ipv6.h
+++ b/include/net/netns/ipv6.h
@@ -36,5 +36,23 @@ struct netns_ipv6 {
36 struct xt_table *ip6table_mangle; 36 struct xt_table *ip6table_mangle;
37 struct xt_table *ip6table_raw; 37 struct xt_table *ip6table_raw;
38#endif 38#endif
39 struct rt6_info *ip6_null_entry;
40 struct rt6_statistics *rt6_stats;
41 struct timer_list *ip6_fib_timer;
42 struct hlist_head *fib_table_hash;
43 struct fib6_table *fib6_main_tbl;
44 struct dst_ops *ip6_dst_ops;
45 unsigned int ip6_rt_gc_expire;
46 unsigned long ip6_rt_last_gc;
47#ifdef CONFIG_IPV6_MULTIPLE_TABLES
48 struct rt6_info *ip6_prohibit_entry;
49 struct rt6_info *ip6_blk_hole_entry;
50 struct fib6_table *fib6_local_tbl;
51 struct fib_rules_ops *fib6_rules_ops;
52#endif
53 struct sock **icmp_sk;
54 struct sock *ndisc_sk;
55 struct sock *tcp_sk;
56 struct sock *igmp_sk;
39}; 57};
40#endif 58#endif
diff --git a/include/net/pkt_cls.h b/include/net/pkt_cls.h
index d349c66ef828..aa9e282db485 100644
--- a/include/net/pkt_cls.h
+++ b/include/net/pkt_cls.h
@@ -353,7 +353,7 @@ tcf_match_indev(struct sk_buff *skb, char *indev)
353 if (indev[0]) { 353 if (indev[0]) {
354 if (!skb->iif) 354 if (!skb->iif)
355 return 0; 355 return 0;
356 dev = __dev_get_by_index(&init_net, skb->iif); 356 dev = __dev_get_by_index(dev_net(skb->dev), skb->iif);
357 if (!dev || strcmp(indev, dev->name)) 357 if (!dev || strcmp(indev, dev->name))
358 return 0; 358 return 0;
359 } 359 }
diff --git a/include/net/protocol.h b/include/net/protocol.h
index ad8c584233a6..8d024d7cb741 100644
--- a/include/net/protocol.h
+++ b/include/net/protocol.h
@@ -39,7 +39,8 @@ struct net_protocol {
39 int (*gso_send_check)(struct sk_buff *skb); 39 int (*gso_send_check)(struct sk_buff *skb);
40 struct sk_buff *(*gso_segment)(struct sk_buff *skb, 40 struct sk_buff *(*gso_segment)(struct sk_buff *skb,
41 int features); 41 int features);
42 int no_policy; 42 unsigned int no_policy:1,
43 netns_ok:1;
43}; 44};
44 45
45#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE) 46#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
diff --git a/include/net/raw.h b/include/net/raw.h
index 1828f81fe374..6c14a656357a 100644
--- a/include/net/raw.h
+++ b/include/net/raw.h
@@ -53,7 +53,7 @@ int raw_seq_open(struct inode *ino, struct file *file,
53 53
54#endif 54#endif
55 55
56void raw_hash_sk(struct sock *sk, struct raw_hashinfo *h); 56void raw_hash_sk(struct sock *sk);
57void raw_unhash_sk(struct sock *sk, struct raw_hashinfo *h); 57void raw_unhash_sk(struct sock *sk);
58 58
59#endif /* _RAW_H */ 59#endif /* _RAW_H */
diff --git a/include/net/request_sock.h b/include/net/request_sock.h
index cff4608179c1..0369f98e9f3a 100644
--- a/include/net/request_sock.h
+++ b/include/net/request_sock.h
@@ -31,8 +31,7 @@ struct request_sock_ops {
31 int obj_size; 31 int obj_size;
32 struct kmem_cache *slab; 32 struct kmem_cache *slab;
33 int (*rtx_syn_ack)(struct sock *sk, 33 int (*rtx_syn_ack)(struct sock *sk,
34 struct request_sock *req, 34 struct request_sock *req);
35 struct dst_entry *dst);
36 void (*send_ack)(struct sk_buff *skb, 35 void (*send_ack)(struct sk_buff *skb,
37 struct request_sock *req); 36 struct request_sock *req);
38 void (*send_reset)(struct sock *sk, 37 void (*send_reset)(struct sock *sk,
@@ -116,8 +115,8 @@ struct request_sock_queue {
116 struct request_sock *rskq_accept_head; 115 struct request_sock *rskq_accept_head;
117 struct request_sock *rskq_accept_tail; 116 struct request_sock *rskq_accept_tail;
118 rwlock_t syn_wait_lock; 117 rwlock_t syn_wait_lock;
119 u8 rskq_defer_accept; 118 u16 rskq_defer_accept;
120 /* 3 bytes hole, try to pack */ 119 /* 2 bytes hole, try to pack */
121 struct listen_sock *listen_opt; 120 struct listen_sock *listen_opt;
122}; 121};
123 122
diff --git a/include/net/route.h b/include/net/route.h
index eadad5901429..c6338802e8f1 100644
--- a/include/net/route.h
+++ b/include/net/route.h
@@ -34,7 +34,6 @@
34#include <linux/ip.h> 34#include <linux/ip.h>
35#include <linux/cache.h> 35#include <linux/cache.h>
36#include <linux/security.h> 36#include <linux/security.h>
37#include <net/sock.h>
38 37
39#ifndef __KERNEL__ 38#ifndef __KERNEL__
40#warning This file is not supposed to be used outside of kernel. 39#warning This file is not supposed to be used outside of kernel.
@@ -161,7 +160,7 @@ static inline int ip_route_connect(struct rtable **rp, __be32 dst,
161 .dport = dport } } }; 160 .dport = dport } } };
162 161
163 int err; 162 int err;
164 struct net *net = sk->sk_net; 163 struct net *net = sock_net(sk);
165 if (!dst || !src) { 164 if (!dst || !src) {
166 err = __ip_route_output_key(net, rp, &fl); 165 err = __ip_route_output_key(net, rp, &fl);
167 if (err) 166 if (err)
@@ -189,7 +188,7 @@ static inline int ip_route_newports(struct rtable **rp, u8 protocol,
189 ip_rt_put(*rp); 188 ip_rt_put(*rp);
190 *rp = NULL; 189 *rp = NULL;
191 security_sk_classify_flow(sk, &fl); 190 security_sk_classify_flow(sk, &fl);
192 return ip_route_output_flow(sk->sk_net, rp, &fl, sk, 0); 191 return ip_route_output_flow(sock_net(sk), rp, &fl, sk, 0);
193 } 192 }
194 return 0; 193 return 0;
195} 194}
diff --git a/include/net/sctp/command.h b/include/net/sctp/command.h
index 10ae2da6f93b..4263af857794 100644
--- a/include/net/sctp/command.h
+++ b/include/net/sctp/command.h
@@ -205,12 +205,11 @@ typedef struct {
205int sctp_init_cmd_seq(sctp_cmd_seq_t *seq); 205int sctp_init_cmd_seq(sctp_cmd_seq_t *seq);
206 206
207/* Add a command to an sctp_cmd_seq_t. 207/* Add a command to an sctp_cmd_seq_t.
208 * Return 0 if the command sequence is full.
209 * 208 *
210 * Use the SCTP_* constructors defined by SCTP_ARG_CONSTRUCTOR() above 209 * Use the SCTP_* constructors defined by SCTP_ARG_CONSTRUCTOR() above
211 * to wrap data which goes in the obj argument. 210 * to wrap data which goes in the obj argument.
212 */ 211 */
213int sctp_add_cmd(sctp_cmd_seq_t *seq, sctp_verb_t verb, sctp_arg_t obj); 212void sctp_add_cmd_sf(sctp_cmd_seq_t *seq, sctp_verb_t verb, sctp_arg_t obj);
214 213
215/* Return the next command structure in an sctp_cmd_seq. 214/* Return the next command structure in an sctp_cmd_seq.
216 * Return NULL at the end of the sequence. 215 * Return NULL at the end of the sequence.
diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h
index ea806732b084..90b1e8d23b16 100644
--- a/include/net/sctp/sctp.h
+++ b/include/net/sctp/sctp.h
@@ -368,11 +368,6 @@ void sctp_sysctl_unregister(void);
368#else 368#else
369static inline void sctp_sysctl_register(void) { return; } 369static inline void sctp_sysctl_register(void) { return; }
370static inline void sctp_sysctl_unregister(void) { return; } 370static inline void sctp_sysctl_unregister(void) { return; }
371static inline int sctp_sysctl_jiffies_ms(ctl_table *table, int __user *name, int nlen,
372 void __user *oldval, size_t __user *oldlenp,
373 void __user *newval, size_t newlen) {
374 return -ENOSYS;
375}
376#endif 371#endif
377 372
378/* Size of Supported Address Parameter for 'x' address types. */ 373/* Size of Supported Address Parameter for 'x' address types. */
diff --git a/include/net/sctp/sm.h b/include/net/sctp/sm.h
index ef9e7ed2c82e..24811732bdb2 100644
--- a/include/net/sctp/sm.h
+++ b/include/net/sctp/sm.h
@@ -385,14 +385,6 @@ static inline int ADDIP_SERIAL_gte(__u16 s, __u16 t)
385 return (((s) == (t)) || (((t) - (s)) & ADDIP_SERIAL_SIGN_BIT)); 385 return (((s) == (t)) || (((t) - (s)) & ADDIP_SERIAL_SIGN_BIT));
386} 386}
387 387
388
389/* Run sctp_add_cmd() generating a BUG() if there is a failure. */
390static inline void sctp_add_cmd_sf(sctp_cmd_seq_t *seq, sctp_verb_t verb, sctp_arg_t obj)
391{
392 if (unlikely(!sctp_add_cmd(seq, verb, obj)))
393 BUG();
394}
395
396/* Check VTAG of the packet matches the sender's own tag. */ 388/* Check VTAG of the packet matches the sender's own tag. */
397static inline int 389static inline int
398sctp_vtag_verify(const struct sctp_chunk *chunk, 390sctp_vtag_verify(const struct sctp_chunk *chunk,
diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h
index 9c827a749b6f..0ce0443c5b79 100644
--- a/include/net/sctp/structs.h
+++ b/include/net/sctp/structs.h
@@ -637,8 +637,6 @@ struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *,
637 struct sctp_sndrcvinfo *, 637 struct sctp_sndrcvinfo *,
638 struct msghdr *, int len); 638 struct msghdr *, int len);
639void sctp_datamsg_put(struct sctp_datamsg *); 639void sctp_datamsg_put(struct sctp_datamsg *);
640void sctp_datamsg_free(struct sctp_datamsg *);
641void sctp_datamsg_track(struct sctp_chunk *);
642void sctp_chunk_fail(struct sctp_chunk *, int error); 640void sctp_chunk_fail(struct sctp_chunk *, int error);
643int sctp_chunk_abandoned(struct sctp_chunk *); 641int sctp_chunk_abandoned(struct sctp_chunk *);
644 642
@@ -1661,6 +1659,9 @@ struct sctp_association {
1661 /* Transport to which SHUTDOWN chunk was last sent. */ 1659 /* Transport to which SHUTDOWN chunk was last sent. */
1662 struct sctp_transport *shutdown_last_sent_to; 1660 struct sctp_transport *shutdown_last_sent_to;
1663 1661
1662 /* How many times have we resent a SHUTDOWN */
1663 int shutdown_retries;
1664
1664 /* Transport to which INIT chunk was last sent. */ 1665 /* Transport to which INIT chunk was last sent. */
1665 struct sctp_transport *init_last_sent_to; 1666 struct sctp_transport *init_last_sent_to;
1666 1667
@@ -1695,6 +1696,11 @@ struct sctp_association {
1695 */ 1696 */
1696 __u16 unack_data; 1697 __u16 unack_data;
1697 1698
1699 /* The total number of data chunks that we've had to retransmit
1700 * as the result of a T3 timer expiration
1701 */
1702 __u32 rtx_data_chunks;
1703
1698 /* This is the association's receive buffer space. This value is used 1704 /* This is the association's receive buffer space. This value is used
1699 * to set a_rwnd field in an INIT or a SACK chunk. 1705 * to set a_rwnd field in an INIT or a SACK chunk.
1700 */ 1706 */
diff --git a/include/net/sock.h b/include/net/sock.h
index fd9876087651..1c9d059223ee 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -70,7 +70,11 @@
70#define SOCK_DEBUG(sk, msg...) do { if ((sk) && sock_flag((sk), SOCK_DBG)) \ 70#define SOCK_DEBUG(sk, msg...) do { if ((sk) && sock_flag((sk), SOCK_DBG)) \
71 printk(KERN_DEBUG msg); } while (0) 71 printk(KERN_DEBUG msg); } while (0)
72#else 72#else
73#define SOCK_DEBUG(sk, msg...) do { } while (0) 73/* Validate arguments and do nothing */
74static void inline int __attribute__ ((format (printf, 2, 3)))
75SOCK_DEBUG(struct sock *sk, const char *msg, ...)
76{
77}
74#endif 78#endif
75 79
76/* This is the per-socket lock. The spinlock provides a synchronization 80/* This is the per-socket lock. The spinlock provides a synchronization
@@ -122,7 +126,9 @@ struct sock_common {
122 atomic_t skc_refcnt; 126 atomic_t skc_refcnt;
123 unsigned int skc_hash; 127 unsigned int skc_hash;
124 struct proto *skc_prot; 128 struct proto *skc_prot;
129#ifdef CONFIG_NET_NS
125 struct net *skc_net; 130 struct net *skc_net;
131#endif
126}; 132};
127 133
128/** 134/**
@@ -151,6 +157,7 @@ struct sock_common {
151 * @sk_no_check: %SO_NO_CHECK setting, wether or not checkup packets 157 * @sk_no_check: %SO_NO_CHECK setting, wether or not checkup packets
152 * @sk_route_caps: route capabilities (e.g. %NETIF_F_TSO) 158 * @sk_route_caps: route capabilities (e.g. %NETIF_F_TSO)
153 * @sk_gso_type: GSO type (e.g. %SKB_GSO_TCPV4) 159 * @sk_gso_type: GSO type (e.g. %SKB_GSO_TCPV4)
160 * @sk_gso_max_size: Maximum GSO segment size to build
154 * @sk_lingertime: %SO_LINGER l_linger setting 161 * @sk_lingertime: %SO_LINGER l_linger setting
155 * @sk_backlog: always used with the per-socket spinlock held 162 * @sk_backlog: always used with the per-socket spinlock held
156 * @sk_callback_lock: used with the callbacks in the end of this struct 163 * @sk_callback_lock: used with the callbacks in the end of this struct
@@ -237,6 +244,7 @@ struct sock {
237 gfp_t sk_allocation; 244 gfp_t sk_allocation;
238 int sk_route_caps; 245 int sk_route_caps;
239 int sk_gso_type; 246 int sk_gso_type;
247 unsigned int sk_gso_max_size;
240 int sk_rcvlowat; 248 int sk_rcvlowat;
241 unsigned long sk_flags; 249 unsigned long sk_flags;
242 unsigned long sk_lingertime; 250 unsigned long sk_lingertime;
@@ -498,6 +506,7 @@ extern int sk_wait_data(struct sock *sk, long *timeo);
498struct request_sock_ops; 506struct request_sock_ops;
499struct timewait_sock_ops; 507struct timewait_sock_ops;
500struct inet_hashinfo; 508struct inet_hashinfo;
509struct raw_hashinfo;
501 510
502/* Networking protocol blocks we attach to sockets. 511/* Networking protocol blocks we attach to sockets.
503 * socket layer -> transport layer interface 512 * socket layer -> transport layer interface
@@ -580,7 +589,11 @@ struct proto {
580 struct request_sock_ops *rsk_prot; 589 struct request_sock_ops *rsk_prot;
581 struct timewait_sock_ops *twsk_prot; 590 struct timewait_sock_ops *twsk_prot;
582 591
583 struct inet_hashinfo *hashinfo; 592 union {
593 struct inet_hashinfo *hashinfo;
594 struct hlist_head *udp_hash;
595 struct raw_hashinfo *raw_hash;
596 } h;
584 597
585 struct module *owner; 598 struct module *owner;
586 599
@@ -850,6 +863,7 @@ extern struct sock *sk_alloc(struct net *net, int family,
850 gfp_t priority, 863 gfp_t priority,
851 struct proto *prot); 864 struct proto *prot);
852extern void sk_free(struct sock *sk); 865extern void sk_free(struct sock *sk);
866extern void sk_release_kernel(struct sock *sk);
853extern struct sock *sk_clone(const struct sock *sk, 867extern struct sock *sk_clone(const struct sock *sk,
854 const gfp_t priority); 868 const gfp_t priority);
855 869
@@ -1333,6 +1347,36 @@ static inline void sk_eat_skb(struct sock *sk, struct sk_buff *skb, int copied_e
1333} 1347}
1334#endif 1348#endif
1335 1349
1350static inline
1351struct net *sock_net(const struct sock *sk)
1352{
1353#ifdef CONFIG_NET_NS
1354 return sk->sk_net;
1355#else
1356 return &init_net;
1357#endif
1358}
1359
1360static inline
1361void sock_net_set(struct sock *sk, struct net *net)
1362{
1363#ifdef CONFIG_NET_NS
1364 sk->sk_net = net;
1365#endif
1366}
1367
1368/*
1369 * Kernel sockets, f.e. rtnl or icmp_socket, are a part of a namespace.
1370 * They should not hold a referrence to a namespace in order to allow
1371 * to stop it.
1372 * Sockets after sk_change_net should be released using sk_release_kernel
1373 */
1374static inline void sk_change_net(struct sock *sk, struct net *net)
1375{
1376 put_net(sock_net(sk));
1377 sock_net_set(sk, net);
1378}
1379
1336extern void sock_enable_timestamp(struct sock *sk); 1380extern void sock_enable_timestamp(struct sock *sk);
1337extern int sock_get_timestamp(struct sock *, struct timeval __user *); 1381extern int sock_get_timestamp(struct sock *, struct timeval __user *);
1338extern int sock_get_timestampns(struct sock *, struct timespec __user *); 1382extern int sock_get_timestampns(struct sock *, struct timespec __user *);
diff --git a/include/net/tcp.h b/include/net/tcp.h
index 7de4ea3a04d9..723b36851dde 100644
--- a/include/net/tcp.h
+++ b/include/net/tcp.h
@@ -29,6 +29,7 @@
29#include <linux/skbuff.h> 29#include <linux/skbuff.h>
30#include <linux/dmaengine.h> 30#include <linux/dmaengine.h>
31#include <linux/crypto.h> 31#include <linux/crypto.h>
32#include <linux/cryptohash.h>
32 33
33#include <net/inet_connection_sock.h> 34#include <net/inet_connection_sock.h>
34#include <net/inet_timewait_sock.h> 35#include <net/inet_timewait_sock.h>
@@ -138,6 +139,7 @@ extern void tcp_time_wait(struct sock *sk, int state, int timeo);
138#define MAX_TCP_KEEPINTVL 32767 139#define MAX_TCP_KEEPINTVL 32767
139#define MAX_TCP_KEEPCNT 127 140#define MAX_TCP_KEEPCNT 127
140#define MAX_TCP_SYNCNT 127 141#define MAX_TCP_SYNCNT 127
142#define MAX_TCP_ACCEPT_DEFERRED 65535
141 143
142#define TCP_SYNQ_INTERVAL (HZ/5) /* Period of SYNACK timer */ 144#define TCP_SYNQ_INTERVAL (HZ/5) /* Period of SYNACK timer */
143 145
@@ -434,11 +436,17 @@ extern int tcp_disconnect(struct sock *sk, int flags);
434extern void tcp_unhash(struct sock *sk); 436extern void tcp_unhash(struct sock *sk);
435 437
436/* From syncookies.c */ 438/* From syncookies.c */
439extern __u32 syncookie_secret[2][16-4+SHA_DIGEST_WORDS];
437extern struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb, 440extern struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb,
438 struct ip_options *opt); 441 struct ip_options *opt);
439extern __u32 cookie_v4_init_sequence(struct sock *sk, struct sk_buff *skb, 442extern __u32 cookie_v4_init_sequence(struct sock *sk, struct sk_buff *skb,
440 __u16 *mss); 443 __u16 *mss);
441 444
445/* From net/ipv6/syncookies.c */
446extern struct sock *cookie_v6_check(struct sock *sk, struct sk_buff *skb);
447extern __u32 cookie_v6_init_sequence(struct sock *sk, struct sk_buff *skb,
448 __u16 *mss);
449
442/* tcp_output.c */ 450/* tcp_output.c */
443 451
444extern void __tcp_push_pending_frames(struct sock *sk, unsigned int cur_mss, 452extern void __tcp_push_pending_frames(struct sock *sk, unsigned int cur_mss,
@@ -1321,6 +1329,7 @@ struct tcp_seq_afinfo {
1321}; 1329};
1322 1330
1323struct tcp_iter_state { 1331struct tcp_iter_state {
1332 struct net *net;
1324 sa_family_t family; 1333 sa_family_t family;
1325 enum tcp_seq_states state; 1334 enum tcp_seq_states state;
1326 struct sock *syn_wait_sk; 1335 struct sock *syn_wait_sk;
@@ -1328,10 +1337,11 @@ struct tcp_iter_state {
1328 struct seq_operations seq_ops; 1337 struct seq_operations seq_ops;
1329}; 1338};
1330 1339
1331extern int tcp_proc_register(struct tcp_seq_afinfo *afinfo); 1340extern int tcp_proc_register(struct net *net, struct tcp_seq_afinfo *afinfo);
1332extern void tcp_proc_unregister(struct tcp_seq_afinfo *afinfo); 1341extern void tcp_proc_unregister(struct net *net, struct tcp_seq_afinfo *afinfo);
1333 1342
1334extern struct request_sock_ops tcp_request_sock_ops; 1343extern struct request_sock_ops tcp_request_sock_ops;
1344extern struct request_sock_ops tcp6_request_sock_ops;
1335 1345
1336extern int tcp_v4_destroy_sock(struct sock *sk); 1346extern int tcp_v4_destroy_sock(struct sock *sk);
1337 1347
@@ -1373,7 +1383,7 @@ struct tcp_request_sock_ops {
1373#endif 1383#endif
1374}; 1384};
1375 1385
1376extern void tcp_v4_init(struct net_proto_family *ops); 1386extern void tcp_v4_init(void);
1377extern void tcp_init(void); 1387extern void tcp_init(void);
1378 1388
1379#endif /* _TCP_H */ 1389#endif /* _TCP_H */
diff --git a/include/net/tipc/tipc_bearer.h b/include/net/tipc/tipc_bearer.h
index 2151a80cdf30..ee2f304e4919 100644
--- a/include/net/tipc/tipc_bearer.h
+++ b/include/net/tipc/tipc_bearer.h
@@ -99,6 +99,9 @@ struct tipc_bearer {
99 char name[TIPC_MAX_BEARER_NAME]; 99 char name[TIPC_MAX_BEARER_NAME];
100}; 100};
101 101
102/*
103 * TIPC routines available to supported media types
104 */
102 105
103int tipc_register_media(u32 media_type, 106int tipc_register_media(u32 media_type,
104 char *media_name, 107 char *media_name,
@@ -123,6 +126,12 @@ void tipc_continue(struct tipc_bearer *tb_ptr);
123int tipc_enable_bearer(const char *bearer_name, u32 bcast_scope, u32 priority); 126int tipc_enable_bearer(const char *bearer_name, u32 bcast_scope, u32 priority);
124int tipc_disable_bearer(const char *name); 127int tipc_disable_bearer(const char *name);
125 128
129/*
130 * Routines made available to TIPC by supported media types
131 */
132
133int tipc_eth_media_start(void);
134void tipc_eth_media_stop(void);
126 135
127#endif 136#endif
128 137
diff --git a/include/net/tipc/tipc_port.h b/include/net/tipc/tipc_port.h
index cfc4ba46de8f..c9b36b77a0b9 100644
--- a/include/net/tipc/tipc_port.h
+++ b/include/net/tipc/tipc_port.h
@@ -86,13 +86,6 @@ u32 tipc_createport_raw(void *usr_handle,
86 void (*wakeup)(struct tipc_port *), 86 void (*wakeup)(struct tipc_port *),
87 const u32 importance); 87 const u32 importance);
88 88
89/*
90 * tipc_set_msg_option(): port must be locked.
91 */
92int tipc_set_msg_option(struct tipc_port *tp_ptr,
93 const char *opt,
94 const u32 len);
95
96int tipc_reject_msg(struct sk_buff *buf, u32 err); 89int tipc_reject_msg(struct sk_buff *buf, u32 err);
97 90
98int tipc_send_buf_fast(struct sk_buff *buf, u32 destnode); 91int tipc_send_buf_fast(struct sk_buff *buf, u32 destnode);
diff --git a/include/net/udp.h b/include/net/udp.h
index c6669c0a74c7..635940d374ab 100644
--- a/include/net/udp.h
+++ b/include/net/udp.h
@@ -125,6 +125,8 @@ static inline void udp_lib_close(struct sock *sk, long timeout)
125 sk_common_release(sk); 125 sk_common_release(sk);
126} 126}
127 127
128extern int udp_lib_get_port(struct sock *sk, unsigned short snum,
129 int (*)(const struct sock*,const struct sock*));
128 130
129/* net/ipv4/udp.c */ 131/* net/ipv4/udp.c */
130extern int udp_get_port(struct sock *sk, unsigned short snum, 132extern int udp_get_port(struct sock *sk, unsigned short snum,
@@ -192,6 +194,7 @@ struct udp_seq_afinfo {
192}; 194};
193 195
194struct udp_iter_state { 196struct udp_iter_state {
197 struct net *net;
195 sa_family_t family; 198 sa_family_t family;
196 struct hlist_head *hashtable; 199 struct hlist_head *hashtable;
197 int bucket; 200 int bucket;
@@ -199,8 +202,8 @@ struct udp_iter_state {
199}; 202};
200 203
201#ifdef CONFIG_PROC_FS 204#ifdef CONFIG_PROC_FS
202extern int udp_proc_register(struct udp_seq_afinfo *afinfo); 205extern int udp_proc_register(struct net *net, struct udp_seq_afinfo *afinfo);
203extern void udp_proc_unregister(struct udp_seq_afinfo *afinfo); 206extern void udp_proc_unregister(struct net *net, struct udp_seq_afinfo *afinfo);
204 207
205extern int udp4_proc_init(void); 208extern int udp4_proc_init(void);
206extern void udp4_proc_exit(void); 209extern void udp4_proc_exit(void);
diff --git a/include/net/wireless.h b/include/net/wireless.h
index d30c4ba8fd99..667b4080d30f 100644
--- a/include/net/wireless.h
+++ b/include/net/wireless.h
@@ -13,6 +13,162 @@
13#include <net/cfg80211.h> 13#include <net/cfg80211.h>
14 14
15/** 15/**
16 * enum ieee80211_band - supported frequency bands
17 *
18 * The bands are assigned this way because the supported
19 * bitrates differ in these bands.
20 *
21 * @IEEE80211_BAND_2GHZ: 2.4GHz ISM band
22 * @IEEE80211_BAND_5GHZ: around 5GHz band (4.9-5.7)
23 */
24enum ieee80211_band {
25 IEEE80211_BAND_2GHZ,
26 IEEE80211_BAND_5GHZ,
27
28 /* keep last */
29 IEEE80211_NUM_BANDS
30};
31
32/**
33 * enum ieee80211_channel_flags - channel flags
34 *
35 * Channel flags set by the regulatory control code.
36 *
37 * @IEEE80211_CHAN_DISABLED: This channel is disabled.
38 * @IEEE80211_CHAN_PASSIVE_SCAN: Only passive scanning is permitted
39 * on this channel.
40 * @IEEE80211_CHAN_NO_IBSS: IBSS is not allowed on this channel.
41 * @IEEE80211_CHAN_RADAR: Radar detection is required on this channel.
42 */
43enum ieee80211_channel_flags {
44 IEEE80211_CHAN_DISABLED = 1<<0,
45 IEEE80211_CHAN_PASSIVE_SCAN = 1<<1,
46 IEEE80211_CHAN_NO_IBSS = 1<<2,
47 IEEE80211_CHAN_RADAR = 1<<3,
48};
49
50/**
51 * struct ieee80211_channel - channel definition
52 *
53 * This structure describes a single channel for use
54 * with cfg80211.
55 *
56 * @center_freq: center frequency in MHz
57 * @hw_value: hardware-specific value for the channel
58 * @flags: channel flags from &enum ieee80211_channel_flags.
59 * @orig_flags: channel flags at registration time, used by regulatory
60 * code to support devices with additional restrictions
61 * @band: band this channel belongs to.
62 * @max_antenna_gain: maximum antenna gain in dBi
63 * @max_power: maximum transmission power (in dBm)
64 * @orig_mag: internal use
65 * @orig_mpwr: internal use
66 */
67struct ieee80211_channel {
68 enum ieee80211_band band;
69 u16 center_freq;
70 u16 hw_value;
71 u32 flags;
72 int max_antenna_gain;
73 int max_power;
74 u32 orig_flags;
75 int orig_mag, orig_mpwr;
76};
77
78/**
79 * enum ieee80211_rate_flags - rate flags
80 *
81 * Hardware/specification flags for rates. These are structured
82 * in a way that allows using the same bitrate structure for
83 * different bands/PHY modes.
84 *
85 * @IEEE80211_RATE_SHORT_PREAMBLE: Hardware can send with short
86 * preamble on this bitrate; only relevant in 2.4GHz band and
87 * with CCK rates.
88 * @IEEE80211_RATE_MANDATORY_A: This bitrate is a mandatory rate
89 * when used with 802.11a (on the 5 GHz band); filled by the
90 * core code when registering the wiphy.
91 * @IEEE80211_RATE_MANDATORY_B: This bitrate is a mandatory rate
92 * when used with 802.11b (on the 2.4 GHz band); filled by the
93 * core code when registering the wiphy.
94 * @IEEE80211_RATE_MANDATORY_G: This bitrate is a mandatory rate
95 * when used with 802.11g (on the 2.4 GHz band); filled by the
96 * core code when registering the wiphy.
97 * @IEEE80211_RATE_ERP_G: This is an ERP rate in 802.11g mode.
98 */
99enum ieee80211_rate_flags {
100 IEEE80211_RATE_SHORT_PREAMBLE = 1<<0,
101 IEEE80211_RATE_MANDATORY_A = 1<<1,
102 IEEE80211_RATE_MANDATORY_B = 1<<2,
103 IEEE80211_RATE_MANDATORY_G = 1<<3,
104 IEEE80211_RATE_ERP_G = 1<<4,
105};
106
107/**
108 * struct ieee80211_rate - bitrate definition
109 *
110 * This structure describes a bitrate that an 802.11 PHY can
111 * operate with. The two values @hw_value and @hw_value_short
112 * are only for driver use when pointers to this structure are
113 * passed around.
114 *
115 * @flags: rate-specific flags
116 * @bitrate: bitrate in units of 100 Kbps
117 * @hw_value: driver/hardware value for this rate
118 * @hw_value_short: driver/hardware value for this rate when
119 * short preamble is used
120 */
121struct ieee80211_rate {
122 u32 flags;
123 u16 bitrate;
124 u16 hw_value, hw_value_short;
125};
126
127/**
128 * struct ieee80211_ht_info - describing STA's HT capabilities
129 *
130 * This structure describes most essential parameters needed
131 * to describe 802.11n HT capabilities for an STA.
132 *
133 * @ht_supported: is HT supported by STA, 0: no, 1: yes
134 * @cap: HT capabilities map as described in 802.11n spec
135 * @ampdu_factor: Maximum A-MPDU length factor
136 * @ampdu_density: Minimum A-MPDU spacing
137 * @supp_mcs_set: Supported MCS set as described in 802.11n spec
138 */
139struct ieee80211_ht_info {
140 u16 cap; /* use IEEE80211_HT_CAP_ */
141 u8 ht_supported;
142 u8 ampdu_factor;
143 u8 ampdu_density;
144 u8 supp_mcs_set[16];
145};
146
147/**
148 * struct ieee80211_supported_band - frequency band definition
149 *
150 * This structure describes a frequency band a wiphy
151 * is able to operate in.
152 *
153 * @channels: Array of channels the hardware can operate in
154 * in this band.
155 * @band: the band this structure represents
156 * @n_channels: Number of channels in @channels
157 * @bitrates: Array of bitrates the hardware can operate with
158 * in this band. Must be sorted to give a valid "supported
159 * rates" IE, i.e. CCK rates first, then OFDM.
160 * @n_bitrates: Number of bitrates in @bitrates
161 */
162struct ieee80211_supported_band {
163 struct ieee80211_channel *channels;
164 struct ieee80211_rate *bitrates;
165 enum ieee80211_band band;
166 int n_channels;
167 int n_bitrates;
168 struct ieee80211_ht_info ht_info;
169};
170
171/**
16 * struct wiphy - wireless hardware description 172 * struct wiphy - wireless hardware description
17 * @idx: the wiphy index assigned to this item 173 * @idx: the wiphy index assigned to this item
18 * @class_dev: the class device representing /sys/class/ieee80211/<wiphy-name> 174 * @class_dev: the class device representing /sys/class/ieee80211/<wiphy-name>
@@ -30,6 +186,8 @@ struct wiphy {
30 * help determine whether you own this wiphy or not. */ 186 * help determine whether you own this wiphy or not. */
31 void *privid; 187 void *privid;
32 188
189 struct ieee80211_supported_band *bands[IEEE80211_NUM_BANDS];
190
33 /* fields below are read-only, assigned by cfg80211 */ 191 /* fields below are read-only, assigned by cfg80211 */
34 192
35 /* the item in /sys/class/ieee80211/ points to this, 193 /* the item in /sys/class/ieee80211/ points to this,
@@ -136,4 +294,32 @@ extern void wiphy_unregister(struct wiphy *wiphy);
136 */ 294 */
137extern void wiphy_free(struct wiphy *wiphy); 295extern void wiphy_free(struct wiphy *wiphy);
138 296
297/**
298 * ieee80211_channel_to_frequency - convert channel number to frequency
299 */
300extern int ieee80211_channel_to_frequency(int chan);
301
302/**
303 * ieee80211_frequency_to_channel - convert frequency to channel number
304 */
305extern int ieee80211_frequency_to_channel(int freq);
306
307/*
308 * Name indirection necessary because the ieee80211 code also has
309 * a function named "ieee80211_get_channel", so if you include
310 * cfg80211's header file you get cfg80211's version, if you try
311 * to include both header files you'll (rightfully!) get a symbol
312 * clash.
313 */
314extern struct ieee80211_channel *__ieee80211_get_channel(struct wiphy *wiphy,
315 int freq);
316
317/**
318 * ieee80211_get_channel - get channel struct from wiphy for specified frequency
319 */
320static inline struct ieee80211_channel *
321ieee80211_get_channel(struct wiphy *wiphy, int freq)
322{
323 return __ieee80211_get_channel(wiphy, freq);
324}
139#endif /* __NET_WIRELESS_H */ 325#endif /* __NET_WIRELESS_H */
diff --git a/include/net/xfrm.h b/include/net/xfrm.h
index 0d255ae008b6..b56b6a10fe5e 100644
--- a/include/net/xfrm.h
+++ b/include/net/xfrm.h
@@ -121,6 +121,7 @@ extern struct mutex xfrm_cfg_mutex;
121struct xfrm_state 121struct xfrm_state
122{ 122{
123 /* Note: bydst is re-used during gc */ 123 /* Note: bydst is re-used during gc */
124 struct list_head all;
124 struct hlist_node bydst; 125 struct hlist_node bydst;
125 struct hlist_node bysrc; 126 struct hlist_node bysrc;
126 struct hlist_node byspi; 127 struct hlist_node byspi;
@@ -446,6 +447,7 @@ struct xfrm_tmpl
446struct xfrm_policy 447struct xfrm_policy
447{ 448{
448 struct xfrm_policy *next; 449 struct xfrm_policy *next;
450 struct list_head bytype;
449 struct hlist_node bydst; 451 struct hlist_node bydst;
450 struct hlist_node byidx; 452 struct hlist_node byidx;
451 453
@@ -1071,6 +1073,23 @@ xfrm_address_t *xfrm_flowi_saddr(struct flowi *fl, unsigned short family)
1071 return NULL; 1073 return NULL;
1072} 1074}
1073 1075
1076static __inline__
1077void xfrm_flowi_addr_get(struct flowi *fl,
1078 xfrm_address_t *saddr, xfrm_address_t *daddr,
1079 unsigned short family)
1080{
1081 switch(family) {
1082 case AF_INET:
1083 memcpy(&saddr->a4, &fl->fl4_src, sizeof(saddr->a4));
1084 memcpy(&daddr->a4, &fl->fl4_dst, sizeof(daddr->a4));
1085 break;
1086 case AF_INET6:
1087 ipv6_addr_copy((struct in6_addr *)&saddr->a6, &fl->fl6_src);
1088 ipv6_addr_copy((struct in6_addr *)&daddr->a6, &fl->fl6_dst);
1089 break;
1090 }
1091}
1092
1074static __inline__ int 1093static __inline__ int
1075__xfrm4_state_addr_check(struct xfrm_state *x, 1094__xfrm4_state_addr_check(struct xfrm_state *x,
1076 xfrm_address_t *daddr, xfrm_address_t *saddr) 1095 xfrm_address_t *daddr, xfrm_address_t *saddr)
@@ -1188,6 +1207,18 @@ struct xfrm6_tunnel {
1188 int priority; 1207 int priority;
1189}; 1208};
1190 1209
1210struct xfrm_state_walk {
1211 struct xfrm_state *state;
1212 int count;
1213 u8 proto;
1214};
1215
1216struct xfrm_policy_walk {
1217 struct xfrm_policy *policy;
1218 int count;
1219 u8 type, cur_type;
1220};
1221
1191extern void xfrm_init(void); 1222extern void xfrm_init(void);
1192extern void xfrm4_init(void); 1223extern void xfrm4_init(void);
1193extern void xfrm_state_init(void); 1224extern void xfrm_state_init(void);
@@ -1212,7 +1243,23 @@ static inline void xfrm6_fini(void)
1212extern int xfrm_proc_init(void); 1243extern int xfrm_proc_init(void);
1213#endif 1244#endif
1214 1245
1215extern int xfrm_state_walk(u8 proto, int (*func)(struct xfrm_state *, int, void*), void *); 1246static inline void xfrm_state_walk_init(struct xfrm_state_walk *walk, u8 proto)
1247{
1248 walk->proto = proto;
1249 walk->state = NULL;
1250 walk->count = 0;
1251}
1252
1253static inline void xfrm_state_walk_done(struct xfrm_state_walk *walk)
1254{
1255 if (walk->state != NULL) {
1256 xfrm_state_put(walk->state);
1257 walk->state = NULL;
1258 }
1259}
1260
1261extern int xfrm_state_walk(struct xfrm_state_walk *walk,
1262 int (*func)(struct xfrm_state *, int, void*), void *);
1216extern struct xfrm_state *xfrm_state_alloc(void); 1263extern struct xfrm_state *xfrm_state_alloc(void);
1217extern struct xfrm_state *xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr, 1264extern struct xfrm_state *xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr,
1218 struct flowi *fl, struct xfrm_tmpl *tmpl, 1265 struct flowi *fl, struct xfrm_tmpl *tmpl,
@@ -1335,7 +1382,25 @@ static inline int xfrm4_udp_encap_rcv(struct sock *sk, struct sk_buff *skb)
1335#endif 1382#endif
1336 1383
1337struct xfrm_policy *xfrm_policy_alloc(gfp_t gfp); 1384struct xfrm_policy *xfrm_policy_alloc(gfp_t gfp);
1338extern int xfrm_policy_walk(u8 type, int (*func)(struct xfrm_policy *, int, int, void*), void *); 1385
1386static inline void xfrm_policy_walk_init(struct xfrm_policy_walk *walk, u8 type)
1387{
1388 walk->cur_type = XFRM_POLICY_TYPE_MAIN;
1389 walk->type = type;
1390 walk->policy = NULL;
1391 walk->count = 0;
1392}
1393
1394static inline void xfrm_policy_walk_done(struct xfrm_policy_walk *walk)
1395{
1396 if (walk->policy != NULL) {
1397 xfrm_pol_put(walk->policy);
1398 walk->policy = NULL;
1399 }
1400}
1401
1402extern int xfrm_policy_walk(struct xfrm_policy_walk *walk,
1403 int (*func)(struct xfrm_policy *, int, int, void*), void *);
1339int xfrm_policy_insert(int dir, struct xfrm_policy *policy, int excl); 1404int xfrm_policy_insert(int dir, struct xfrm_policy *policy, int excl);
1340struct xfrm_policy *xfrm_policy_bysel_ctx(u8 type, int dir, 1405struct xfrm_policy *xfrm_policy_bysel_ctx(u8 type, int dir,
1341 struct xfrm_selector *sel, 1406 struct xfrm_selector *sel,