aboutsummaryrefslogtreecommitdiffstats
path: root/include/net
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2016-03-19 13:05:34 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2016-03-19 13:05:34 -0400
commit1200b6809dfd9d73bc4c7db76d288c35fa4b2ebe (patch)
tree552e03de245cdbd0780ca1215914edc4a26540f7 /include/net
parent6b5f04b6cf8ebab9a65d9c0026c650bb2538fd0f (diff)
parentfe30937b65354c7fec244caebbdaae68e28ca797 (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next
Pull networking updates from David Miller: "Highlights: 1) Support more Realtek wireless chips, from Jes Sorenson. 2) New BPF types for per-cpu hash and arrap maps, from Alexei Starovoitov. 3) Make several TCP sysctls per-namespace, from Nikolay Borisov. 4) Allow the use of SO_REUSEPORT in order to do per-thread processing of incoming TCP/UDP connections. The muxing can be done using a BPF program which hashes the incoming packet. From Craig Gallek. 5) Add a multiplexer for TCP streams, to provide a messaged based interface. BPF programs can be used to determine the message boundaries. From Tom Herbert. 6) Add 802.1AE MACSEC support, from Sabrina Dubroca. 7) Avoid factorial complexity when taking down an inetdev interface with lots of configured addresses. We were doing things like traversing the entire address less for each address removed, and flushing the entire netfilter conntrack table for every address as well. 8) Add and use SKB bulk free infrastructure, from Jesper Brouer. 9) Allow offloading u32 classifiers to hardware, and implement for ixgbe, from John Fastabend. 10) Allow configuring IRQ coalescing parameters on a per-queue basis, from Kan Liang. 11) Extend ethtool so that larger link mode masks can be supported. From David Decotigny. 12) Introduce devlink, which can be used to configure port link types (ethernet vs Infiniband, etc.), port splitting, and switch device level attributes as a whole. From Jiri Pirko. 13) Hardware offload support for flower classifiers, from Amir Vadai. 14) Add "Local Checksum Offload". Basically, for a tunneled packet the checksum of the outer header is 'constant' (because with the checksum field filled into the inner protocol header, the payload of the outer frame checksums to 'zero'), and we can take advantage of that in various ways. From Edward Cree" * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next: (1548 commits) bonding: fix bond_get_stats() net: bcmgenet: fix dma api length mismatch net/mlx4_core: Fix backward compatibility on VFs phy: mdio-thunder: Fix some Kconfig typos lan78xx: add ndo_get_stats64 lan78xx: handle statistics counter rollover RDS: TCP: Remove unused constant RDS: TCP: Add sysctl tunables for sndbuf/rcvbuf on rds-tcp socket net: smc911x: convert pxa dma to dmaengine team: remove duplicate set of flag IFF_MULTICAST bonding: remove duplicate set of flag IFF_MULTICAST net: fix a comment typo ethernet: micrel: fix some error codes ip_tunnels, bpf: define IP_TUNNEL_OPTS_MAX and use it bpf, dst: add and use dst_tclassid helper bpf: make skb->tc_classid also readable net: mvneta: bm: clarify dependencies cls_bpf: reset class and reuse major in da ldmvsw: Checkpatch sunvnet.c and sunvnet_common.c ldmvsw: Add ldmvsw.c driver code ...
Diffstat (limited to 'include/net')
-rw-r--r--include/net/6lowpan.h32
-rw-r--r--include/net/act_api.h84
-rw-r--r--include/net/addrconf.h2
-rw-r--r--include/net/bluetooth/hci.h1
-rw-r--r--include/net/bluetooth/hci_core.h3
-rw-r--r--include/net/bond_3ad.h1
-rw-r--r--include/net/bonding.h1
-rw-r--r--include/net/cfg80211.h8
-rw-r--r--include/net/checksum.h17
-rw-r--r--include/net/codel.h4
-rw-r--r--include/net/devlink.h140
-rw-r--r--include/net/dsa.h15
-rw-r--r--include/net/dst.h12
-rw-r--r--include/net/dst_cache.h97
-rw-r--r--include/net/dst_metadata.h6
-rw-r--r--include/net/flow_dissector.h13
-rw-r--r--include/net/genetlink.h4
-rw-r--r--include/net/hwbm.h28
-rw-r--r--include/net/inet6_hashtables.h13
-rw-r--r--include/net/inet_frag.h1
-rw-r--r--include/net/inet_hashtables.h25
-rw-r--r--include/net/ip.h8
-rw-r--r--include/net/ip6_checksum.h3
-rw-r--r--include/net/ip6_tunnel.h14
-rw-r--r--include/net/ip_tunnels.h55
-rw-r--r--include/net/ip_vs.h17
-rw-r--r--include/net/ipv6.h8
-rw-r--r--include/net/kcm.h226
-rw-r--r--include/net/l3mdev.h4
-rw-r--r--include/net/lwtunnel.h4
-rw-r--r--include/net/mac80211.h198
-rw-r--r--include/net/mac802154.h15
-rw-r--r--include/net/netfilter/nft_masq.h4
-rw-r--r--include/net/netns/ipv4.h19
-rw-r--r--include/net/netns/ipv6.h3
-rw-r--r--include/net/phonet/phonet.h2
-rw-r--r--include/net/ping.h2
-rw-r--r--include/net/pkt_cls.h65
-rw-r--r--include/net/raw.h2
-rw-r--r--include/net/route.h5
-rw-r--r--include/net/sch_generic.h26
-rw-r--r--include/net/sctp/sm.h2
-rw-r--r--include/net/sctp/structs.h11
-rw-r--r--include/net/sock.h6
-rw-r--r--include/net/tc_act/tc_gact.h16
-rw-r--r--include/net/tc_act/tc_ife.h61
-rw-r--r--include/net/tc_act/tc_skbedit.h16
-rw-r--r--include/net/tcp.h53
-rw-r--r--include/net/udp.h3
-rw-r--r--include/net/udp_tunnel.h6
-rw-r--r--include/net/vxlan.h187
51 files changed, 1323 insertions, 225 deletions
diff --git a/include/net/6lowpan.h b/include/net/6lowpan.h
index 2f6a3f2233ed..da3a77d25fcb 100644
--- a/include/net/6lowpan.h
+++ b/include/net/6lowpan.h
@@ -75,6 +75,8 @@
75#define LOWPAN_IPHC_MAX_HC_BUF_LEN (sizeof(struct ipv6hdr) + \ 75#define LOWPAN_IPHC_MAX_HC_BUF_LEN (sizeof(struct ipv6hdr) + \
76 LOWPAN_IPHC_MAX_HEADER_LEN + \ 76 LOWPAN_IPHC_MAX_HEADER_LEN + \
77 LOWPAN_NHC_MAX_HDR_LEN) 77 LOWPAN_NHC_MAX_HDR_LEN)
78/* SCI/DCI is 4 bit width, so we have maximum 16 entries */
79#define LOWPAN_IPHC_CTX_TABLE_SIZE (1 << 4)
78 80
79#define LOWPAN_DISPATCH_IPV6 0x41 /* 01000001 = 65 */ 81#define LOWPAN_DISPATCH_IPV6 0x41 /* 01000001 = 65 */
80#define LOWPAN_DISPATCH_IPHC 0x60 /* 011xxxxx = ... */ 82#define LOWPAN_DISPATCH_IPHC 0x60 /* 011xxxxx = ... */
@@ -98,9 +100,39 @@ enum lowpan_lltypes {
98 LOWPAN_LLTYPE_IEEE802154, 100 LOWPAN_LLTYPE_IEEE802154,
99}; 101};
100 102
103enum lowpan_iphc_ctx_flags {
104 LOWPAN_IPHC_CTX_FLAG_ACTIVE,
105 LOWPAN_IPHC_CTX_FLAG_COMPRESSION,
106};
107
108struct lowpan_iphc_ctx {
109 u8 id;
110 struct in6_addr pfx;
111 u8 plen;
112 unsigned long flags;
113};
114
115struct lowpan_iphc_ctx_table {
116 spinlock_t lock;
117 const struct lowpan_iphc_ctx_ops *ops;
118 struct lowpan_iphc_ctx table[LOWPAN_IPHC_CTX_TABLE_SIZE];
119};
120
121static inline bool lowpan_iphc_ctx_is_active(const struct lowpan_iphc_ctx *ctx)
122{
123 return test_bit(LOWPAN_IPHC_CTX_FLAG_ACTIVE, &ctx->flags);
124}
125
126static inline bool
127lowpan_iphc_ctx_is_compression(const struct lowpan_iphc_ctx *ctx)
128{
129 return test_bit(LOWPAN_IPHC_CTX_FLAG_COMPRESSION, &ctx->flags);
130}
131
101struct lowpan_priv { 132struct lowpan_priv {
102 enum lowpan_lltypes lltype; 133 enum lowpan_lltypes lltype;
103 struct dentry *iface_debugfs; 134 struct dentry *iface_debugfs;
135 struct lowpan_iphc_ctx_table ctx;
104 136
105 /* must be last */ 137 /* must be last */
106 u8 priv[0] __aligned(sizeof(void *)); 138 u8 priv[0] __aligned(sizeof(void *));
diff --git a/include/net/act_api.h b/include/net/act_api.h
index 9d446f136607..2a19fe111c78 100644
--- a/include/net/act_api.h
+++ b/include/net/act_api.h
@@ -7,6 +7,8 @@
7 7
8#include <net/sch_generic.h> 8#include <net/sch_generic.h>
9#include <net/pkt_sched.h> 9#include <net/pkt_sched.h>
10#include <net/net_namespace.h>
11#include <net/netns/generic.h>
10 12
11struct tcf_common { 13struct tcf_common {
12 struct hlist_node tcfc_head; 14 struct hlist_node tcfc_head;
@@ -65,11 +67,6 @@ static inline int tcf_hashinfo_init(struct tcf_hashinfo *hf, unsigned int mask)
65 return 0; 67 return 0;
66} 68}
67 69
68static inline void tcf_hashinfo_destroy(struct tcf_hashinfo *hf)
69{
70 kfree(hf->htab);
71}
72
73/* Update lastuse only if needed, to avoid dirtying a cache line. 70/* Update lastuse only if needed, to avoid dirtying a cache line.
74 * We use a temp variable to avoid fetching jiffies twice. 71 * We use a temp variable to avoid fetching jiffies twice.
75 */ 72 */
@@ -81,42 +78,76 @@ static inline void tcf_lastuse_update(struct tcf_t *tm)
81 tm->lastuse = now; 78 tm->lastuse = now;
82} 79}
83 80
84#ifdef CONFIG_NET_CLS_ACT
85
86#define ACT_P_CREATED 1
87#define ACT_P_DELETED 1
88
89struct tc_action { 81struct tc_action {
90 void *priv; 82 void *priv;
91 const struct tc_action_ops *ops; 83 const struct tc_action_ops *ops;
92 __u32 type; /* for backward compat(TCA_OLD_COMPAT) */ 84 __u32 type; /* for backward compat(TCA_OLD_COMPAT) */
93 __u32 order; 85 __u32 order;
94 struct list_head list; 86 struct list_head list;
87 struct tcf_hashinfo *hinfo;
95}; 88};
96 89
90#ifdef CONFIG_NET_CLS_ACT
91
92#define ACT_P_CREATED 1
93#define ACT_P_DELETED 1
94
97struct tc_action_ops { 95struct tc_action_ops {
98 struct list_head head; 96 struct list_head head;
99 struct tcf_hashinfo *hinfo;
100 char kind[IFNAMSIZ]; 97 char kind[IFNAMSIZ];
101 __u32 type; /* TBD to match kind */ 98 __u32 type; /* TBD to match kind */
102 struct module *owner; 99 struct module *owner;
103 int (*act)(struct sk_buff *, const struct tc_action *, struct tcf_result *); 100 int (*act)(struct sk_buff *, const struct tc_action *, struct tcf_result *);
104 int (*dump)(struct sk_buff *, struct tc_action *, int, int); 101 int (*dump)(struct sk_buff *, struct tc_action *, int, int);
105 void (*cleanup)(struct tc_action *, int bind); 102 void (*cleanup)(struct tc_action *, int bind);
106 int (*lookup)(struct tc_action *, u32); 103 int (*lookup)(struct net *, struct tc_action *, u32);
107 int (*init)(struct net *net, struct nlattr *nla, 104 int (*init)(struct net *net, struct nlattr *nla,
108 struct nlattr *est, struct tc_action *act, int ovr, 105 struct nlattr *est, struct tc_action *act, int ovr,
109 int bind); 106 int bind);
110 int (*walk)(struct sk_buff *, struct netlink_callback *, int, struct tc_action *); 107 int (*walk)(struct net *, struct sk_buff *,
108 struct netlink_callback *, int, struct tc_action *);
109};
110
111struct tc_action_net {
112 struct tcf_hashinfo *hinfo;
113 const struct tc_action_ops *ops;
111}; 114};
112 115
113int tcf_hash_search(struct tc_action *a, u32 index); 116static inline
114u32 tcf_hash_new_index(struct tcf_hashinfo *hinfo); 117int tc_action_net_init(struct tc_action_net *tn, const struct tc_action_ops *ops,
115int tcf_hash_check(u32 index, struct tc_action *a, int bind); 118 unsigned int mask)
116int tcf_hash_create(u32 index, struct nlattr *est, struct tc_action *a, 119{
117 int size, int bind, bool cpustats); 120 int err = 0;
121
122 tn->hinfo = kmalloc(sizeof(*tn->hinfo), GFP_KERNEL);
123 if (!tn->hinfo)
124 return -ENOMEM;
125 tn->ops = ops;
126 err = tcf_hashinfo_init(tn->hinfo, mask);
127 if (err)
128 kfree(tn->hinfo);
129 return err;
130}
131
132void tcf_hashinfo_destroy(const struct tc_action_ops *ops,
133 struct tcf_hashinfo *hinfo);
134
135static inline void tc_action_net_exit(struct tc_action_net *tn)
136{
137 tcf_hashinfo_destroy(tn->ops, tn->hinfo);
138}
139
140int tcf_generic_walker(struct tc_action_net *tn, struct sk_buff *skb,
141 struct netlink_callback *cb, int type,
142 struct tc_action *a);
143int tcf_hash_search(struct tc_action_net *tn, struct tc_action *a, u32 index);
144u32 tcf_hash_new_index(struct tc_action_net *tn);
145int tcf_hash_check(struct tc_action_net *tn, u32 index, struct tc_action *a,
146 int bind);
147int tcf_hash_create(struct tc_action_net *tn, u32 index, struct nlattr *est,
148 struct tc_action *a, int size, int bind, bool cpustats);
118void tcf_hash_cleanup(struct tc_action *a, struct nlattr *est); 149void tcf_hash_cleanup(struct tc_action *a, struct nlattr *est);
119void tcf_hash_insert(struct tc_action *a); 150void tcf_hash_insert(struct tc_action_net *tn, struct tc_action *a);
120 151
121int __tcf_hash_release(struct tc_action *a, bool bind, bool strict); 152int __tcf_hash_release(struct tc_action *a, bool bind, bool strict);
122 153
@@ -125,8 +156,8 @@ static inline int tcf_hash_release(struct tc_action *a, bool bind)
125 return __tcf_hash_release(a, bind, false); 156 return __tcf_hash_release(a, bind, false);
126} 157}
127 158
128int tcf_register_action(struct tc_action_ops *a, unsigned int mask); 159int tcf_register_action(struct tc_action_ops *a, struct pernet_operations *ops);
129int tcf_unregister_action(struct tc_action_ops *a); 160int tcf_unregister_action(struct tc_action_ops *a, struct pernet_operations *ops);
130int tcf_action_destroy(struct list_head *actions, int bind); 161int tcf_action_destroy(struct list_head *actions, int bind);
131int tcf_action_exec(struct sk_buff *skb, const struct list_head *actions, 162int tcf_action_exec(struct sk_buff *skb, const struct list_head *actions,
132 struct tcf_result *res); 163 struct tcf_result *res);
@@ -140,5 +171,16 @@ int tcf_action_dump(struct sk_buff *skb, struct list_head *, int, int);
140int tcf_action_dump_old(struct sk_buff *skb, struct tc_action *a, int, int); 171int tcf_action_dump_old(struct sk_buff *skb, struct tc_action *a, int, int);
141int tcf_action_dump_1(struct sk_buff *skb, struct tc_action *a, int, int); 172int tcf_action_dump_1(struct sk_buff *skb, struct tc_action *a, int, int);
142int tcf_action_copy_stats(struct sk_buff *, struct tc_action *, int); 173int tcf_action_copy_stats(struct sk_buff *, struct tc_action *, int);
174
175#define tc_no_actions(_exts) \
176 (list_empty(&(_exts)->actions))
177
178#define tc_for_each_action(_a, _exts) \
179 list_for_each_entry(a, &(_exts)->actions, list)
180#else /* CONFIG_NET_CLS_ACT */
181
182#define tc_no_actions(_exts) true
183#define tc_for_each_action(_a, _exts) while (0)
184
143#endif /* CONFIG_NET_CLS_ACT */ 185#endif /* CONFIG_NET_CLS_ACT */
144#endif 186#endif
diff --git a/include/net/addrconf.h b/include/net/addrconf.h
index 47f52d3cd8df..730d856683e5 100644
--- a/include/net/addrconf.h
+++ b/include/net/addrconf.h
@@ -87,6 +87,8 @@ int __ipv6_get_lladdr(struct inet6_dev *idev, struct in6_addr *addr,
87 u32 banned_flags); 87 u32 banned_flags);
88int ipv6_get_lladdr(struct net_device *dev, struct in6_addr *addr, 88int ipv6_get_lladdr(struct net_device *dev, struct in6_addr *addr,
89 u32 banned_flags); 89 u32 banned_flags);
90int ipv4_rcv_saddr_equal(const struct sock *sk, const struct sock *sk2,
91 bool match_wildcard);
90int ipv6_rcv_saddr_equal(const struct sock *sk, const struct sock *sk2, 92int ipv6_rcv_saddr_equal(const struct sock *sk, const struct sock *sk2,
91 bool match_wildcard); 93 bool match_wildcard);
92void addrconf_join_solict(struct net_device *dev, const struct in6_addr *addr); 94void addrconf_join_solict(struct net_device *dev, const struct in6_addr *addr);
diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h
index 339ea57be423..5d38d980b89d 100644
--- a/include/net/bluetooth/hci.h
+++ b/include/net/bluetooth/hci.h
@@ -233,6 +233,7 @@ enum {
233 HCI_SC_ENABLED, 233 HCI_SC_ENABLED,
234 HCI_SC_ONLY, 234 HCI_SC_ONLY,
235 HCI_PRIVACY, 235 HCI_PRIVACY,
236 HCI_LIMITED_PRIVACY,
236 HCI_RPA_EXPIRED, 237 HCI_RPA_EXPIRED,
237 HCI_RPA_RESOLVING, 238 HCI_RPA_RESOLVING,
238 HCI_HS_ENABLED, 239 HCI_HS_ENABLED,
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
index d4f82edb5cff..dc71473462ac 100644
--- a/include/net/bluetooth/hci_core.h
+++ b/include/net/bluetooth/hci_core.h
@@ -25,6 +25,7 @@
25#ifndef __HCI_CORE_H 25#ifndef __HCI_CORE_H
26#define __HCI_CORE_H 26#define __HCI_CORE_H
27 27
28#include <linux/leds.h>
28#include <net/bluetooth/hci.h> 29#include <net/bluetooth/hci.h>
29#include <net/bluetooth/hci_sock.h> 30#include <net/bluetooth/hci_sock.h>
30 31
@@ -396,6 +397,8 @@ struct hci_dev {
396 struct delayed_work rpa_expired; 397 struct delayed_work rpa_expired;
397 bdaddr_t rpa; 398 bdaddr_t rpa;
398 399
400 struct led_trigger *power_led;
401
399 int (*open)(struct hci_dev *hdev); 402 int (*open)(struct hci_dev *hdev);
400 int (*close)(struct hci_dev *hdev); 403 int (*close)(struct hci_dev *hdev);
401 int (*flush)(struct hci_dev *hdev); 404 int (*flush)(struct hci_dev *hdev);
diff --git a/include/net/bond_3ad.h b/include/net/bond_3ad.h
index f1fbc3b11962..f358ad5e4214 100644
--- a/include/net/bond_3ad.h
+++ b/include/net/bond_3ad.h
@@ -306,5 +306,6 @@ int bond_3ad_lacpdu_recv(const struct sk_buff *skb, struct bonding *bond,
306 struct slave *slave); 306 struct slave *slave);
307int bond_3ad_set_carrier(struct bonding *bond); 307int bond_3ad_set_carrier(struct bonding *bond);
308void bond_3ad_update_lacp_rate(struct bonding *bond); 308void bond_3ad_update_lacp_rate(struct bonding *bond);
309void bond_3ad_update_ad_actor_settings(struct bonding *bond);
309#endif /* _NET_BOND_3AD_H */ 310#endif /* _NET_BOND_3AD_H */
310 311
diff --git a/include/net/bonding.h b/include/net/bonding.h
index ee6c52053aa3..791800ddd6d9 100644
--- a/include/net/bonding.h
+++ b/include/net/bonding.h
@@ -215,6 +215,7 @@ struct bonding {
215 * ALB mode (6) - to sync the use and modifications of its hash table 215 * ALB mode (6) - to sync the use and modifications of its hash table
216 */ 216 */
217 spinlock_t mode_lock; 217 spinlock_t mode_lock;
218 spinlock_t stats_lock;
218 u8 send_peer_notif; 219 u8 send_peer_notif;
219 u8 igmp_retrans; 220 u8 igmp_retrans;
220#ifdef CONFIG_PROC_FS 221#ifdef CONFIG_PROC_FS
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index 9bcaaf7cd15a..9e1b24c29f0c 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -712,6 +712,8 @@ struct cfg80211_acl_data {
712 * @p2p_opp_ps: P2P opportunistic PS 712 * @p2p_opp_ps: P2P opportunistic PS
713 * @acl: ACL configuration used by the drivers which has support for 713 * @acl: ACL configuration used by the drivers which has support for
714 * MAC address based access control 714 * MAC address based access control
715 * @pbss: If set, start as a PCP instead of AP. Relevant for DMG
716 * networks.
715 */ 717 */
716struct cfg80211_ap_settings { 718struct cfg80211_ap_settings {
717 struct cfg80211_chan_def chandef; 719 struct cfg80211_chan_def chandef;
@@ -730,6 +732,7 @@ struct cfg80211_ap_settings {
730 u8 p2p_ctwindow; 732 u8 p2p_ctwindow;
731 bool p2p_opp_ps; 733 bool p2p_opp_ps;
732 const struct cfg80211_acl_data *acl; 734 const struct cfg80211_acl_data *acl;
735 bool pbss;
733}; 736};
734 737
735/** 738/**
@@ -1888,6 +1891,8 @@ struct cfg80211_ibss_params {
1888 * @ht_capa_mask: The bits of ht_capa which are to be used. 1891 * @ht_capa_mask: The bits of ht_capa which are to be used.
1889 * @vht_capa: VHT Capability overrides 1892 * @vht_capa: VHT Capability overrides
1890 * @vht_capa_mask: The bits of vht_capa which are to be used. 1893 * @vht_capa_mask: The bits of vht_capa which are to be used.
1894 * @pbss: if set, connect to a PCP instead of AP. Valid for DMG
1895 * networks.
1891 */ 1896 */
1892struct cfg80211_connect_params { 1897struct cfg80211_connect_params {
1893 struct ieee80211_channel *channel; 1898 struct ieee80211_channel *channel;
@@ -1910,6 +1915,7 @@ struct cfg80211_connect_params {
1910 struct ieee80211_ht_cap ht_capa_mask; 1915 struct ieee80211_ht_cap ht_capa_mask;
1911 struct ieee80211_vht_cap vht_capa; 1916 struct ieee80211_vht_cap vht_capa;
1912 struct ieee80211_vht_cap vht_capa_mask; 1917 struct ieee80211_vht_cap vht_capa_mask;
1918 bool pbss;
1913}; 1919};
1914 1920
1915/** 1921/**
@@ -3489,6 +3495,7 @@ struct cfg80211_cached_keys;
3489 * registered for unexpected class 3 frames (AP mode) 3495 * registered for unexpected class 3 frames (AP mode)
3490 * @conn: (private) cfg80211 software SME connection state machine data 3496 * @conn: (private) cfg80211 software SME connection state machine data
3491 * @connect_keys: (private) keys to set after connection is established 3497 * @connect_keys: (private) keys to set after connection is established
3498 * @conn_bss_type: connecting/connected BSS type
3492 * @ibss_fixed: (private) IBSS is using fixed BSSID 3499 * @ibss_fixed: (private) IBSS is using fixed BSSID
3493 * @ibss_dfs_possible: (private) IBSS may change to a DFS channel 3500 * @ibss_dfs_possible: (private) IBSS may change to a DFS channel
3494 * @event_list: (private) list for internal event processing 3501 * @event_list: (private) list for internal event processing
@@ -3519,6 +3526,7 @@ struct wireless_dev {
3519 u8 ssid_len, mesh_id_len, mesh_id_up_len; 3526 u8 ssid_len, mesh_id_len, mesh_id_up_len;
3520 struct cfg80211_conn *conn; 3527 struct cfg80211_conn *conn;
3521 struct cfg80211_cached_keys *connect_keys; 3528 struct cfg80211_cached_keys *connect_keys;
3529 enum ieee80211_bss_type conn_bss_type;
3522 3530
3523 struct list_head event_list; 3531 struct list_head event_list;
3524 spinlock_t event_lock; 3532 spinlock_t event_lock;
diff --git a/include/net/checksum.h b/include/net/checksum.h
index 10a16b5bd1c7..5c30891e84e5 100644
--- a/include/net/checksum.h
+++ b/include/net/checksum.h
@@ -88,8 +88,11 @@ static inline __wsum
88csum_block_add(__wsum csum, __wsum csum2, int offset) 88csum_block_add(__wsum csum, __wsum csum2, int offset)
89{ 89{
90 u32 sum = (__force u32)csum2; 90 u32 sum = (__force u32)csum2;
91 if (offset&1) 91
92 sum = ((sum&0xFF00FF)<<8)+((sum>>8)&0xFF00FF); 92 /* rotate sum to align it with a 16b boundary */
93 if (offset & 1)
94 sum = ror32(sum, 8);
95
93 return csum_add(csum, (__force __wsum)sum); 96 return csum_add(csum, (__force __wsum)sum);
94} 97}
95 98
@@ -102,10 +105,7 @@ csum_block_add_ext(__wsum csum, __wsum csum2, int offset, int len)
102static inline __wsum 105static inline __wsum
103csum_block_sub(__wsum csum, __wsum csum2, int offset) 106csum_block_sub(__wsum csum, __wsum csum2, int offset)
104{ 107{
105 u32 sum = (__force u32)csum2; 108 return csum_block_add(csum, ~csum2, offset);
106 if (offset&1)
107 sum = ((sum&0xFF00FF)<<8)+((sum>>8)&0xFF00FF);
108 return csum_sub(csum, (__force __wsum)sum);
109} 109}
110 110
111static inline __wsum csum_unfold(__sum16 n) 111static inline __wsum csum_unfold(__sum16 n)
@@ -120,6 +120,11 @@ static inline __wsum csum_partial_ext(const void *buff, int len, __wsum sum)
120 120
121#define CSUM_MANGLED_0 ((__force __sum16)0xffff) 121#define CSUM_MANGLED_0 ((__force __sum16)0xffff)
122 122
123static inline void csum_replace_by_diff(__sum16 *sum, __wsum diff)
124{
125 *sum = csum_fold(csum_add(diff, ~csum_unfold(*sum)));
126}
127
123static inline void csum_replace4(__sum16 *sum, __be32 from, __be32 to) 128static inline void csum_replace4(__sum16 *sum, __be32 from, __be32 to)
124{ 129{
125 __wsum tmp = csum_sub(~csum_unfold(*sum), (__force __wsum)from); 130 __wsum tmp = csum_sub(~csum_unfold(*sum), (__force __wsum)from);
diff --git a/include/net/codel.h b/include/net/codel.h
index 267e70210061..d168aca115cc 100644
--- a/include/net/codel.h
+++ b/include/net/codel.h
@@ -162,12 +162,14 @@ struct codel_vars {
162 * struct codel_stats - contains codel shared variables and stats 162 * struct codel_stats - contains codel shared variables and stats
163 * @maxpacket: largest packet we've seen so far 163 * @maxpacket: largest packet we've seen so far
164 * @drop_count: temp count of dropped packets in dequeue() 164 * @drop_count: temp count of dropped packets in dequeue()
165 * @drop_len: bytes of dropped packets in dequeue()
165 * ecn_mark: number of packets we ECN marked instead of dropping 166 * ecn_mark: number of packets we ECN marked instead of dropping
166 * ce_mark: number of packets CE marked because sojourn time was above ce_threshold 167 * ce_mark: number of packets CE marked because sojourn time was above ce_threshold
167 */ 168 */
168struct codel_stats { 169struct codel_stats {
169 u32 maxpacket; 170 u32 maxpacket;
170 u32 drop_count; 171 u32 drop_count;
172 u32 drop_len;
171 u32 ecn_mark; 173 u32 ecn_mark;
172 u32 ce_mark; 174 u32 ce_mark;
173}; 175};
@@ -308,6 +310,7 @@ static struct sk_buff *codel_dequeue(struct Qdisc *sch,
308 vars->rec_inv_sqrt); 310 vars->rec_inv_sqrt);
309 goto end; 311 goto end;
310 } 312 }
313 stats->drop_len += qdisc_pkt_len(skb);
311 qdisc_drop(skb, sch); 314 qdisc_drop(skb, sch);
312 stats->drop_count++; 315 stats->drop_count++;
313 skb = dequeue_func(vars, sch); 316 skb = dequeue_func(vars, sch);
@@ -330,6 +333,7 @@ static struct sk_buff *codel_dequeue(struct Qdisc *sch,
330 if (params->ecn && INET_ECN_set_ce(skb)) { 333 if (params->ecn && INET_ECN_set_ce(skb)) {
331 stats->ecn_mark++; 334 stats->ecn_mark++;
332 } else { 335 } else {
336 stats->drop_len += qdisc_pkt_len(skb);
333 qdisc_drop(skb, sch); 337 qdisc_drop(skb, sch);
334 stats->drop_count++; 338 stats->drop_count++;
335 339
diff --git a/include/net/devlink.h b/include/net/devlink.h
new file mode 100644
index 000000000000..c37d257891d6
--- /dev/null
+++ b/include/net/devlink.h
@@ -0,0 +1,140 @@
1/*
2 * include/net/devlink.h - Network physical device Netlink interface
3 * Copyright (c) 2016 Mellanox Technologies. All rights reserved.
4 * Copyright (c) 2016 Jiri Pirko <jiri@mellanox.com>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 */
11#ifndef _NET_DEVLINK_H_
12#define _NET_DEVLINK_H_
13
14#include <linux/device.h>
15#include <linux/slab.h>
16#include <linux/gfp.h>
17#include <linux/list.h>
18#include <linux/netdevice.h>
19#include <net/net_namespace.h>
20#include <uapi/linux/devlink.h>
21
22struct devlink_ops;
23
24struct devlink {
25 struct list_head list;
26 struct list_head port_list;
27 const struct devlink_ops *ops;
28 struct device *dev;
29 possible_net_t _net;
30 char priv[0] __aligned(NETDEV_ALIGN);
31};
32
33struct devlink_port {
34 struct list_head list;
35 struct devlink *devlink;
36 unsigned index;
37 bool registered;
38 enum devlink_port_type type;
39 enum devlink_port_type desired_type;
40 void *type_dev;
41 bool split;
42 u32 split_group;
43};
44
45struct devlink_ops {
46 size_t priv_size;
47 int (*port_type_set)(struct devlink_port *devlink_port,
48 enum devlink_port_type port_type);
49 int (*port_split)(struct devlink *devlink, unsigned int port_index,
50 unsigned int count);
51 int (*port_unsplit)(struct devlink *devlink, unsigned int port_index);
52};
53
54static inline void *devlink_priv(struct devlink *devlink)
55{
56 BUG_ON(!devlink);
57 return &devlink->priv;
58}
59
60static inline struct devlink *priv_to_devlink(void *priv)
61{
62 BUG_ON(!priv);
63 return container_of(priv, struct devlink, priv);
64}
65
66struct ib_device;
67
68#if IS_ENABLED(CONFIG_NET_DEVLINK)
69
70struct devlink *devlink_alloc(const struct devlink_ops *ops, size_t priv_size);
71int devlink_register(struct devlink *devlink, struct device *dev);
72void devlink_unregister(struct devlink *devlink);
73void devlink_free(struct devlink *devlink);
74int devlink_port_register(struct devlink *devlink,
75 struct devlink_port *devlink_port,
76 unsigned int port_index);
77void devlink_port_unregister(struct devlink_port *devlink_port);
78void devlink_port_type_eth_set(struct devlink_port *devlink_port,
79 struct net_device *netdev);
80void devlink_port_type_ib_set(struct devlink_port *devlink_port,
81 struct ib_device *ibdev);
82void devlink_port_type_clear(struct devlink_port *devlink_port);
83void devlink_port_split_set(struct devlink_port *devlink_port,
84 u32 split_group);
85
86#else
87
88static inline struct devlink *devlink_alloc(const struct devlink_ops *ops,
89 size_t priv_size)
90{
91 return kzalloc(sizeof(struct devlink) + priv_size, GFP_KERNEL);
92}
93
94static inline int devlink_register(struct devlink *devlink, struct device *dev)
95{
96 return 0;
97}
98
99static inline void devlink_unregister(struct devlink *devlink)
100{
101}
102
103static inline void devlink_free(struct devlink *devlink)
104{
105 kfree(devlink);
106}
107
108static inline int devlink_port_register(struct devlink *devlink,
109 struct devlink_port *devlink_port,
110 unsigned int port_index)
111{
112 return 0;
113}
114
115static inline void devlink_port_unregister(struct devlink_port *devlink_port)
116{
117}
118
119static inline void devlink_port_type_eth_set(struct devlink_port *devlink_port,
120 struct net_device *netdev)
121{
122}
123
124static inline void devlink_port_type_ib_set(struct devlink_port *devlink_port,
125 struct ib_device *ibdev)
126{
127}
128
129static inline void devlink_port_type_clear(struct devlink_port *devlink_port)
130{
131}
132
133static inline void devlink_port_split_set(struct devlink_port *devlink_port,
134 u32 split_group)
135{
136}
137
138#endif
139
140#endif /* _NET_DEVLINK_H_ */
diff --git a/include/net/dsa.h b/include/net/dsa.h
index 26a0e86e611e..6463bb2863ac 100644
--- a/include/net/dsa.h
+++ b/include/net/dsa.h
@@ -296,16 +296,17 @@ struct dsa_switch_driver {
296 /* 296 /*
297 * Bridge integration 297 * Bridge integration
298 */ 298 */
299 int (*port_join_bridge)(struct dsa_switch *ds, int port, 299 int (*port_bridge_join)(struct dsa_switch *ds, int port,
300 u32 br_port_mask); 300 struct net_device *bridge);
301 int (*port_leave_bridge)(struct dsa_switch *ds, int port, 301 void (*port_bridge_leave)(struct dsa_switch *ds, int port);
302 u32 br_port_mask);
303 int (*port_stp_update)(struct dsa_switch *ds, int port, 302 int (*port_stp_update)(struct dsa_switch *ds, int port,
304 u8 state); 303 u8 state);
305 304
306 /* 305 /*
307 * VLAN support 306 * VLAN support
308 */ 307 */
308 int (*port_vlan_filtering)(struct dsa_switch *ds, int port,
309 bool vlan_filtering);
309 int (*port_vlan_prepare)(struct dsa_switch *ds, int port, 310 int (*port_vlan_prepare)(struct dsa_switch *ds, int port,
310 const struct switchdev_obj_port_vlan *vlan, 311 const struct switchdev_obj_port_vlan *vlan,
311 struct switchdev_trans *trans); 312 struct switchdev_trans *trans);
@@ -314,9 +315,9 @@ struct dsa_switch_driver {
314 struct switchdev_trans *trans); 315 struct switchdev_trans *trans);
315 int (*port_vlan_del)(struct dsa_switch *ds, int port, 316 int (*port_vlan_del)(struct dsa_switch *ds, int port,
316 const struct switchdev_obj_port_vlan *vlan); 317 const struct switchdev_obj_port_vlan *vlan);
317 int (*port_pvid_get)(struct dsa_switch *ds, int port, u16 *pvid); 318 int (*port_vlan_dump)(struct dsa_switch *ds, int port,
318 int (*vlan_getnext)(struct dsa_switch *ds, u16 *vid, 319 struct switchdev_obj_port_vlan *vlan,
319 unsigned long *ports, unsigned long *untagged); 320 int (*cb)(struct switchdev_obj *obj));
320 321
321 /* 322 /*
322 * Forwarding database 323 * Forwarding database
diff --git a/include/net/dst.h b/include/net/dst.h
index c7329dcd90cc..5c98443c1c9e 100644
--- a/include/net/dst.h
+++ b/include/net/dst.h
@@ -398,6 +398,18 @@ static inline void skb_tunnel_rx(struct sk_buff *skb, struct net_device *dev,
398 __skb_tunnel_rx(skb, dev, net); 398 __skb_tunnel_rx(skb, dev, net);
399} 399}
400 400
401static inline u32 dst_tclassid(const struct sk_buff *skb)
402{
403#ifdef CONFIG_IP_ROUTE_CLASSID
404 const struct dst_entry *dst;
405
406 dst = skb_dst(skb);
407 if (dst)
408 return dst->tclassid;
409#endif
410 return 0;
411}
412
401int dst_discard_out(struct net *net, struct sock *sk, struct sk_buff *skb); 413int dst_discard_out(struct net *net, struct sock *sk, struct sk_buff *skb);
402static inline int dst_discard(struct sk_buff *skb) 414static inline int dst_discard(struct sk_buff *skb)
403{ 415{
diff --git a/include/net/dst_cache.h b/include/net/dst_cache.h
new file mode 100644
index 000000000000..151accae708b
--- /dev/null
+++ b/include/net/dst_cache.h
@@ -0,0 +1,97 @@
1#ifndef _NET_DST_CACHE_H
2#define _NET_DST_CACHE_H
3
4#include <linux/jiffies.h>
5#include <net/dst.h>
6#if IS_ENABLED(CONFIG_IPV6)
7#include <net/ip6_fib.h>
8#endif
9
10struct dst_cache {
11 struct dst_cache_pcpu __percpu *cache;
12 unsigned long reset_ts;
13};
14
15/**
16 * dst_cache_get - perform cache lookup
17 * @dst_cache: the cache
18 *
19 * The caller should use dst_cache_get_ip4() if it need to retrieve the
20 * source address to be used when xmitting to the cached dst.
21 * local BH must be disabled.
22 */
23struct dst_entry *dst_cache_get(struct dst_cache *dst_cache);
24
25/**
26 * dst_cache_get_ip4 - perform cache lookup and fetch ipv4 source address
27 * @dst_cache: the cache
28 * @saddr: return value for the retrieved source address
29 *
30 * local BH must be disabled.
31 */
32struct rtable *dst_cache_get_ip4(struct dst_cache *dst_cache, __be32 *saddr);
33
34/**
35 * dst_cache_set_ip4 - store the ipv4 dst into the cache
36 * @dst_cache: the cache
37 * @dst: the entry to be cached
38 * @saddr: the source address to be stored inside the cache
39 *
40 * local BH must be disabled.
41 */
42void dst_cache_set_ip4(struct dst_cache *dst_cache, struct dst_entry *dst,
43 __be32 saddr);
44
45#if IS_ENABLED(CONFIG_IPV6)
46
47/**
48 * dst_cache_set_ip6 - store the ipv6 dst into the cache
49 * @dst_cache: the cache
50 * @dst: the entry to be cached
51 * @saddr: the source address to be stored inside the cache
52 *
53 * local BH must be disabled.
54 */
55void dst_cache_set_ip6(struct dst_cache *dst_cache, struct dst_entry *dst,
56 const struct in6_addr *addr);
57
58/**
59 * dst_cache_get_ip6 - perform cache lookup and fetch ipv6 source address
60 * @dst_cache: the cache
61 * @saddr: return value for the retrieved source address
62 *
63 * local BH must be disabled.
64 */
65struct dst_entry *dst_cache_get_ip6(struct dst_cache *dst_cache,
66 struct in6_addr *saddr);
67#endif
68
69/**
70 * dst_cache_reset - invalidate the cache contents
71 * @dst_cache: the cache
72 *
73 * This do not free the cached dst to avoid races and contentions.
74 * the dst will be freed on later cache lookup.
75 */
76static inline void dst_cache_reset(struct dst_cache *dst_cache)
77{
78 dst_cache->reset_ts = jiffies;
79}
80
81/**
82 * dst_cache_init - initialize the cache, allocating the required storage
83 * @dst_cache: the cache
84 * @gfp: allocation flags
85 */
86int dst_cache_init(struct dst_cache *dst_cache, gfp_t gfp);
87
88/**
89 * dst_cache_destroy - empty the cache and free the allocated storage
90 * @dst_cache: the cache
91 *
92 * No synchronization is enforced: it must be called only when the cache
93 * is unsed.
94 */
95void dst_cache_destroy(struct dst_cache *dst_cache);
96
97#endif
diff --git a/include/net/dst_metadata.h b/include/net/dst_metadata.h
index 30a56ab2ccfb..5db9f5910428 100644
--- a/include/net/dst_metadata.h
+++ b/include/net/dst_metadata.h
@@ -62,6 +62,7 @@ static inline int skb_metadata_dst_cmp(const struct sk_buff *skb_a,
62 sizeof(a->u.tun_info) + a->u.tun_info.options_len); 62 sizeof(a->u.tun_info) + a->u.tun_info.options_len);
63} 63}
64 64
65void metadata_dst_free(struct metadata_dst *);
65struct metadata_dst *metadata_dst_alloc(u8 optslen, gfp_t flags); 66struct metadata_dst *metadata_dst_alloc(u8 optslen, gfp_t flags);
66struct metadata_dst __percpu *metadata_dst_alloc_percpu(u8 optslen, gfp_t flags); 67struct metadata_dst __percpu *metadata_dst_alloc_percpu(u8 optslen, gfp_t flags);
67 68
@@ -125,7 +126,7 @@ static inline struct metadata_dst *ip_tun_rx_dst(struct sk_buff *skb,
125 126
126 ip_tunnel_key_init(&tun_dst->u.tun_info.key, 127 ip_tunnel_key_init(&tun_dst->u.tun_info.key,
127 iph->saddr, iph->daddr, iph->tos, iph->ttl, 128 iph->saddr, iph->daddr, iph->tos, iph->ttl,
128 0, 0, tunnel_id, flags); 129 0, 0, 0, tunnel_id, flags);
129 return tun_dst; 130 return tun_dst;
130} 131}
131 132
@@ -151,8 +152,11 @@ static inline struct metadata_dst *ipv6_tun_rx_dst(struct sk_buff *skb,
151 152
152 info->key.u.ipv6.src = ip6h->saddr; 153 info->key.u.ipv6.src = ip6h->saddr;
153 info->key.u.ipv6.dst = ip6h->daddr; 154 info->key.u.ipv6.dst = ip6h->daddr;
155
154 info->key.tos = ipv6_get_dsfield(ip6h); 156 info->key.tos = ipv6_get_dsfield(ip6h);
155 info->key.ttl = ip6h->hop_limit; 157 info->key.ttl = ip6h->hop_limit;
158 info->key.label = ip6_flowlabel(ip6h);
159
156 return tun_dst; 160 return tun_dst;
157} 161}
158 162
diff --git a/include/net/flow_dissector.h b/include/net/flow_dissector.h
index 8c8548cf5888..d3d60dccd19f 100644
--- a/include/net/flow_dissector.h
+++ b/include/net/flow_dissector.h
@@ -184,4 +184,17 @@ static inline bool flow_keys_have_l4(struct flow_keys *keys)
184 184
185u32 flow_hash_from_keys(struct flow_keys *keys); 185u32 flow_hash_from_keys(struct flow_keys *keys);
186 186
187static inline bool dissector_uses_key(const struct flow_dissector *flow_dissector,
188 enum flow_dissector_key_id key_id)
189{
190 return flow_dissector->used_keys & (1 << key_id);
191}
192
193static inline void *skb_flow_dissector_target(struct flow_dissector *flow_dissector,
194 enum flow_dissector_key_id key_id,
195 void *target_container)
196{
197 return ((char *)target_container) + flow_dissector->offset[key_id];
198}
199
187#endif 200#endif
diff --git a/include/net/genetlink.h b/include/net/genetlink.h
index 43c0e771f417..8d4608ce8716 100644
--- a/include/net/genetlink.h
+++ b/include/net/genetlink.h
@@ -83,7 +83,6 @@ struct genl_family {
83 * @attrs: netlink attributes 83 * @attrs: netlink attributes
84 * @_net: network namespace 84 * @_net: network namespace
85 * @user_ptr: user pointers 85 * @user_ptr: user pointers
86 * @dst_sk: destination socket
87 */ 86 */
88struct genl_info { 87struct genl_info {
89 u32 snd_seq; 88 u32 snd_seq;
@@ -94,7 +93,6 @@ struct genl_info {
94 struct nlattr ** attrs; 93 struct nlattr ** attrs;
95 possible_net_t _net; 94 possible_net_t _net;
96 void * user_ptr[2]; 95 void * user_ptr[2];
97 struct sock * dst_sk;
98}; 96};
99 97
100static inline struct net *genl_info_net(struct genl_info *info) 98static inline struct net *genl_info_net(struct genl_info *info)
@@ -188,8 +186,6 @@ int genl_unregister_family(struct genl_family *family);
188void genl_notify(struct genl_family *family, struct sk_buff *skb, 186void genl_notify(struct genl_family *family, struct sk_buff *skb,
189 struct genl_info *info, u32 group, gfp_t flags); 187 struct genl_info *info, u32 group, gfp_t flags);
190 188
191struct sk_buff *genlmsg_new_unicast(size_t payload, struct genl_info *info,
192 gfp_t flags);
193void *genlmsg_put(struct sk_buff *skb, u32 portid, u32 seq, 189void *genlmsg_put(struct sk_buff *skb, u32 portid, u32 seq,
194 struct genl_family *family, int flags, u8 cmd); 190 struct genl_family *family, int flags, u8 cmd);
195 191
diff --git a/include/net/hwbm.h b/include/net/hwbm.h
new file mode 100644
index 000000000000..47d08662501b
--- /dev/null
+++ b/include/net/hwbm.h
@@ -0,0 +1,28 @@
1#ifndef _HWBM_H
2#define _HWBM_H
3
4struct hwbm_pool {
5 /* Capacity of the pool */
6 int size;
7 /* Size of the buffers managed */
8 int frag_size;
9 /* Number of buffers currently used by this pool */
10 int buf_num;
11 /* constructor called during alocation */
12 int (*construct)(struct hwbm_pool *bm_pool, void *buf);
13 /* protect acces to the buffer counter*/
14 spinlock_t lock;
15 /* private data */
16 void *priv;
17};
18#ifdef CONFIG_HWBM
19void hwbm_buf_free(struct hwbm_pool *bm_pool, void *buf);
20int hwbm_pool_refill(struct hwbm_pool *bm_pool, gfp_t gfp);
21int hwbm_pool_add(struct hwbm_pool *bm_pool, unsigned int buf_num, gfp_t gfp);
22#else
23void hwbm_buf_free(struct hwbm_pool *bm_pool, void *buf) {}
24int hwbm_pool_refill(struct hwbm_pool *bm_pool, gfp_t gfp) { return 0; }
25int hwbm_pool_add(struct hwbm_pool *bm_pool, unsigned int buf_num, gfp_t gfp)
26{ return 0; }
27#endif /* CONFIG_HWBM */
28#endif /* _HWBM_H */
diff --git a/include/net/inet6_hashtables.h b/include/net/inet6_hashtables.h
index 7ff588ca6817..28332bdac333 100644
--- a/include/net/inet6_hashtables.h
+++ b/include/net/inet6_hashtables.h
@@ -53,6 +53,7 @@ struct sock *__inet6_lookup_established(struct net *net,
53 53
54struct sock *inet6_lookup_listener(struct net *net, 54struct sock *inet6_lookup_listener(struct net *net,
55 struct inet_hashinfo *hashinfo, 55 struct inet_hashinfo *hashinfo,
56 struct sk_buff *skb, int doff,
56 const struct in6_addr *saddr, 57 const struct in6_addr *saddr,
57 const __be16 sport, 58 const __be16 sport,
58 const struct in6_addr *daddr, 59 const struct in6_addr *daddr,
@@ -60,6 +61,7 @@ struct sock *inet6_lookup_listener(struct net *net,
60 61
61static inline struct sock *__inet6_lookup(struct net *net, 62static inline struct sock *__inet6_lookup(struct net *net,
62 struct inet_hashinfo *hashinfo, 63 struct inet_hashinfo *hashinfo,
64 struct sk_buff *skb, int doff,
63 const struct in6_addr *saddr, 65 const struct in6_addr *saddr,
64 const __be16 sport, 66 const __be16 sport,
65 const struct in6_addr *daddr, 67 const struct in6_addr *daddr,
@@ -71,12 +73,12 @@ static inline struct sock *__inet6_lookup(struct net *net,
71 if (sk) 73 if (sk)
72 return sk; 74 return sk;
73 75
74 return inet6_lookup_listener(net, hashinfo, saddr, sport, 76 return inet6_lookup_listener(net, hashinfo, skb, doff, saddr, sport,
75 daddr, hnum, dif); 77 daddr, hnum, dif);
76} 78}
77 79
78static inline struct sock *__inet6_lookup_skb(struct inet_hashinfo *hashinfo, 80static inline struct sock *__inet6_lookup_skb(struct inet_hashinfo *hashinfo,
79 struct sk_buff *skb, 81 struct sk_buff *skb, int doff,
80 const __be16 sport, 82 const __be16 sport,
81 const __be16 dport, 83 const __be16 dport,
82 int iif) 84 int iif)
@@ -86,16 +88,19 @@ static inline struct sock *__inet6_lookup_skb(struct inet_hashinfo *hashinfo,
86 if (sk) 88 if (sk)
87 return sk; 89 return sk;
88 90
89 return __inet6_lookup(dev_net(skb_dst(skb)->dev), hashinfo, 91 return __inet6_lookup(dev_net(skb_dst(skb)->dev), hashinfo, skb,
90 &ipv6_hdr(skb)->saddr, sport, 92 doff, &ipv6_hdr(skb)->saddr, sport,
91 &ipv6_hdr(skb)->daddr, ntohs(dport), 93 &ipv6_hdr(skb)->daddr, ntohs(dport),
92 iif); 94 iif);
93} 95}
94 96
95struct sock *inet6_lookup(struct net *net, struct inet_hashinfo *hashinfo, 97struct sock *inet6_lookup(struct net *net, struct inet_hashinfo *hashinfo,
98 struct sk_buff *skb, int doff,
96 const struct in6_addr *saddr, const __be16 sport, 99 const struct in6_addr *saddr, const __be16 sport,
97 const struct in6_addr *daddr, const __be16 dport, 100 const struct in6_addr *daddr, const __be16 dport,
98 const int dif); 101 const int dif);
102
103int inet6_hash(struct sock *sk);
99#endif /* IS_ENABLED(CONFIG_IPV6) */ 104#endif /* IS_ENABLED(CONFIG_IPV6) */
100 105
101#define INET6_MATCH(__sk, __net, __saddr, __daddr, __ports, __dif) \ 106#define INET6_MATCH(__sk, __net, __saddr, __daddr, __ports, __dif) \
diff --git a/include/net/inet_frag.h b/include/net/inet_frag.h
index 12aac0fd6ee7..909972aa3acd 100644
--- a/include/net/inet_frag.h
+++ b/include/net/inet_frag.h
@@ -13,6 +13,7 @@ struct netns_frags {
13 int timeout; 13 int timeout;
14 int high_thresh; 14 int high_thresh;
15 int low_thresh; 15 int low_thresh;
16 int max_dist;
16}; 17};
17 18
18/** 19/**
diff --git a/include/net/inet_hashtables.h b/include/net/inet_hashtables.h
index de2e3ade6102..50f635c2c536 100644
--- a/include/net/inet_hashtables.h
+++ b/include/net/inet_hashtables.h
@@ -207,12 +207,16 @@ void inet_hashinfo_init(struct inet_hashinfo *h);
207 207
208bool inet_ehash_insert(struct sock *sk, struct sock *osk); 208bool inet_ehash_insert(struct sock *sk, struct sock *osk);
209bool inet_ehash_nolisten(struct sock *sk, struct sock *osk); 209bool inet_ehash_nolisten(struct sock *sk, struct sock *osk);
210void __inet_hash(struct sock *sk, struct sock *osk); 210int __inet_hash(struct sock *sk, struct sock *osk,
211void inet_hash(struct sock *sk); 211 int (*saddr_same)(const struct sock *sk1,
212 const struct sock *sk2,
213 bool match_wildcard));
214int inet_hash(struct sock *sk);
212void inet_unhash(struct sock *sk); 215void inet_unhash(struct sock *sk);
213 216
214struct sock *__inet_lookup_listener(struct net *net, 217struct sock *__inet_lookup_listener(struct net *net,
215 struct inet_hashinfo *hashinfo, 218 struct inet_hashinfo *hashinfo,
219 struct sk_buff *skb, int doff,
216 const __be32 saddr, const __be16 sport, 220 const __be32 saddr, const __be16 sport,
217 const __be32 daddr, 221 const __be32 daddr,
218 const unsigned short hnum, 222 const unsigned short hnum,
@@ -220,10 +224,11 @@ struct sock *__inet_lookup_listener(struct net *net,
220 224
221static inline struct sock *inet_lookup_listener(struct net *net, 225static inline struct sock *inet_lookup_listener(struct net *net,
222 struct inet_hashinfo *hashinfo, 226 struct inet_hashinfo *hashinfo,
227 struct sk_buff *skb, int doff,
223 __be32 saddr, __be16 sport, 228 __be32 saddr, __be16 sport,
224 __be32 daddr, __be16 dport, int dif) 229 __be32 daddr, __be16 dport, int dif)
225{ 230{
226 return __inet_lookup_listener(net, hashinfo, saddr, sport, 231 return __inet_lookup_listener(net, hashinfo, skb, doff, saddr, sport,
227 daddr, ntohs(dport), dif); 232 daddr, ntohs(dport), dif);
228} 233}
229 234
@@ -299,6 +304,7 @@ static inline struct sock *
299 304
300static inline struct sock *__inet_lookup(struct net *net, 305static inline struct sock *__inet_lookup(struct net *net,
301 struct inet_hashinfo *hashinfo, 306 struct inet_hashinfo *hashinfo,
307 struct sk_buff *skb, int doff,
302 const __be32 saddr, const __be16 sport, 308 const __be32 saddr, const __be16 sport,
303 const __be32 daddr, const __be16 dport, 309 const __be32 daddr, const __be16 dport,
304 const int dif) 310 const int dif)
@@ -307,12 +313,13 @@ static inline struct sock *__inet_lookup(struct net *net,
307 struct sock *sk = __inet_lookup_established(net, hashinfo, 313 struct sock *sk = __inet_lookup_established(net, hashinfo,
308 saddr, sport, daddr, hnum, dif); 314 saddr, sport, daddr, hnum, dif);
309 315
310 return sk ? : __inet_lookup_listener(net, hashinfo, saddr, sport, 316 return sk ? : __inet_lookup_listener(net, hashinfo, skb, doff, saddr,
311 daddr, hnum, dif); 317 sport, daddr, hnum, dif);
312} 318}
313 319
314static inline struct sock *inet_lookup(struct net *net, 320static inline struct sock *inet_lookup(struct net *net,
315 struct inet_hashinfo *hashinfo, 321 struct inet_hashinfo *hashinfo,
322 struct sk_buff *skb, int doff,
316 const __be32 saddr, const __be16 sport, 323 const __be32 saddr, const __be16 sport,
317 const __be32 daddr, const __be16 dport, 324 const __be32 daddr, const __be16 dport,
318 const int dif) 325 const int dif)
@@ -320,7 +327,8 @@ static inline struct sock *inet_lookup(struct net *net,
320 struct sock *sk; 327 struct sock *sk;
321 328
322 local_bh_disable(); 329 local_bh_disable();
323 sk = __inet_lookup(net, hashinfo, saddr, sport, daddr, dport, dif); 330 sk = __inet_lookup(net, hashinfo, skb, doff, saddr, sport, daddr,
331 dport, dif);
324 local_bh_enable(); 332 local_bh_enable();
325 333
326 return sk; 334 return sk;
@@ -328,6 +336,7 @@ static inline struct sock *inet_lookup(struct net *net,
328 336
329static inline struct sock *__inet_lookup_skb(struct inet_hashinfo *hashinfo, 337static inline struct sock *__inet_lookup_skb(struct inet_hashinfo *hashinfo,
330 struct sk_buff *skb, 338 struct sk_buff *skb,
339 int doff,
331 const __be16 sport, 340 const __be16 sport,
332 const __be16 dport) 341 const __be16 dport)
333{ 342{
@@ -337,8 +346,8 @@ static inline struct sock *__inet_lookup_skb(struct inet_hashinfo *hashinfo,
337 if (sk) 346 if (sk)
338 return sk; 347 return sk;
339 else 348 else
340 return __inet_lookup(dev_net(skb_dst(skb)->dev), hashinfo, 349 return __inet_lookup(dev_net(skb_dst(skb)->dev), hashinfo, skb,
341 iph->saddr, sport, 350 doff, iph->saddr, sport,
342 iph->daddr, dport, inet_iif(skb)); 351 iph->daddr, dport, inet_iif(skb));
343} 352}
344 353
diff --git a/include/net/ip.h b/include/net/ip.h
index 1a98f1ca1638..fad74d323bd6 100644
--- a/include/net/ip.h
+++ b/include/net/ip.h
@@ -240,17 +240,13 @@ static inline int inet_is_local_reserved_port(struct net *net, int port)
240} 240}
241#endif 241#endif
242 242
243__be32 inet_current_timestamp(void);
244
243/* From inetpeer.c */ 245/* From inetpeer.c */
244extern int inet_peer_threshold; 246extern int inet_peer_threshold;
245extern int inet_peer_minttl; 247extern int inet_peer_minttl;
246extern int inet_peer_maxttl; 248extern int inet_peer_maxttl;
247 249
248/* From ip_input.c */
249extern int sysctl_ip_early_demux;
250
251/* From ip_output.c */
252extern int sysctl_ip_dynaddr;
253
254void ipfrag_init(void); 250void ipfrag_init(void);
255 251
256void ip_static_sysctl_init(void); 252void ip_static_sysctl_init(void);
diff --git a/include/net/ip6_checksum.h b/include/net/ip6_checksum.h
index 1a49b73f7f6e..cca840584c88 100644
--- a/include/net/ip6_checksum.h
+++ b/include/net/ip6_checksum.h
@@ -37,8 +37,7 @@
37#ifndef _HAVE_ARCH_IPV6_CSUM 37#ifndef _HAVE_ARCH_IPV6_CSUM
38__sum16 csum_ipv6_magic(const struct in6_addr *saddr, 38__sum16 csum_ipv6_magic(const struct in6_addr *saddr,
39 const struct in6_addr *daddr, 39 const struct in6_addr *daddr,
40 __u32 len, unsigned short proto, 40 __u32 len, __u8 proto, __wsum csum);
41 __wsum csum);
42#endif 41#endif
43 42
44static inline __wsum ip6_compute_pseudo(struct sk_buff *skb, int proto) 43static inline __wsum ip6_compute_pseudo(struct sk_buff *skb, int proto)
diff --git a/include/net/ip6_tunnel.h b/include/net/ip6_tunnel.h
index 0d0ce0b2d870..499a707765ea 100644
--- a/include/net/ip6_tunnel.h
+++ b/include/net/ip6_tunnel.h
@@ -6,6 +6,7 @@
6#include <linux/if_tunnel.h> 6#include <linux/if_tunnel.h>
7#include <linux/ip6_tunnel.h> 7#include <linux/ip6_tunnel.h>
8#include <net/ip_tunnels.h> 8#include <net/ip_tunnels.h>
9#include <net/dst_cache.h>
9 10
10#define IP6TUNNEL_ERR_TIMEO (30*HZ) 11#define IP6TUNNEL_ERR_TIMEO (30*HZ)
11 12
@@ -33,12 +34,6 @@ struct __ip6_tnl_parm {
33 __be32 o_key; 34 __be32 o_key;
34}; 35};
35 36
36struct ip6_tnl_dst {
37 seqlock_t lock;
38 struct dst_entry __rcu *dst;
39 u32 cookie;
40};
41
42/* IPv6 tunnel */ 37/* IPv6 tunnel */
43struct ip6_tnl { 38struct ip6_tnl {
44 struct ip6_tnl __rcu *next; /* next tunnel in list */ 39 struct ip6_tnl __rcu *next; /* next tunnel in list */
@@ -46,7 +41,7 @@ struct ip6_tnl {
46 struct net *net; /* netns for packet i/o */ 41 struct net *net; /* netns for packet i/o */
47 struct __ip6_tnl_parm parms; /* tunnel configuration parameters */ 42 struct __ip6_tnl_parm parms; /* tunnel configuration parameters */
48 struct flowi fl; /* flowi template for xmit */ 43 struct flowi fl; /* flowi template for xmit */
49 struct ip6_tnl_dst __percpu *dst_cache; /* cached dst */ 44 struct dst_cache dst_cache; /* cached dst */
50 45
51 int err_count; 46 int err_count;
52 unsigned long err_time; 47 unsigned long err_time;
@@ -66,11 +61,6 @@ struct ipv6_tlv_tnl_enc_lim {
66 __u8 encap_limit; /* tunnel encapsulation limit */ 61 __u8 encap_limit; /* tunnel encapsulation limit */
67} __packed; 62} __packed;
68 63
69struct dst_entry *ip6_tnl_dst_get(struct ip6_tnl *t);
70int ip6_tnl_dst_init(struct ip6_tnl *t);
71void ip6_tnl_dst_destroy(struct ip6_tnl *t);
72void ip6_tnl_dst_reset(struct ip6_tnl *t);
73void ip6_tnl_dst_set(struct ip6_tnl *t, struct dst_entry *dst);
74int ip6_tnl_rcv_ctl(struct ip6_tnl *t, const struct in6_addr *laddr, 64int ip6_tnl_rcv_ctl(struct ip6_tnl *t, const struct in6_addr *laddr,
75 const struct in6_addr *raddr); 65 const struct in6_addr *raddr);
76int ip6_tnl_xmit_ctl(struct ip6_tnl *t, const struct in6_addr *laddr, 66int ip6_tnl_xmit_ctl(struct ip6_tnl *t, const struct in6_addr *laddr,
diff --git a/include/net/ip_tunnels.h b/include/net/ip_tunnels.h
index dda9abf6b89c..c35dda9ec991 100644
--- a/include/net/ip_tunnels.h
+++ b/include/net/ip_tunnels.h
@@ -7,12 +7,15 @@
7#include <linux/socket.h> 7#include <linux/socket.h>
8#include <linux/types.h> 8#include <linux/types.h>
9#include <linux/u64_stats_sync.h> 9#include <linux/u64_stats_sync.h>
10#include <linux/bitops.h>
11
10#include <net/dsfield.h> 12#include <net/dsfield.h>
11#include <net/gro_cells.h> 13#include <net/gro_cells.h>
12#include <net/inet_ecn.h> 14#include <net/inet_ecn.h>
13#include <net/netns/generic.h> 15#include <net/netns/generic.h>
14#include <net/rtnetlink.h> 16#include <net/rtnetlink.h>
15#include <net/lwtunnel.h> 17#include <net/lwtunnel.h>
18#include <net/dst_cache.h>
16 19
17#if IS_ENABLED(CONFIG_IPV6) 20#if IS_ENABLED(CONFIG_IPV6)
18#include <net/ipv6.h> 21#include <net/ipv6.h>
@@ -47,6 +50,7 @@ struct ip_tunnel_key {
47 __be16 tun_flags; 50 __be16 tun_flags;
48 u8 tos; /* TOS for IPv4, TC for IPv6 */ 51 u8 tos; /* TOS for IPv4, TC for IPv6 */
49 u8 ttl; /* TTL for IPv4, HL for IPv6 */ 52 u8 ttl; /* TTL for IPv4, HL for IPv6 */
53 __be32 label; /* Flow Label for IPv6 */
50 __be16 tp_src; 54 __be16 tp_src;
51 __be16 tp_dst; 55 __be16 tp_dst;
52}; 56};
@@ -55,8 +59,16 @@ struct ip_tunnel_key {
55#define IP_TUNNEL_INFO_TX 0x01 /* represents tx tunnel parameters */ 59#define IP_TUNNEL_INFO_TX 0x01 /* represents tx tunnel parameters */
56#define IP_TUNNEL_INFO_IPV6 0x02 /* key contains IPv6 addresses */ 60#define IP_TUNNEL_INFO_IPV6 0x02 /* key contains IPv6 addresses */
57 61
62/* Maximum tunnel options length. */
63#define IP_TUNNEL_OPTS_MAX \
64 GENMASK((FIELD_SIZEOF(struct ip_tunnel_info, \
65 options_len) * BITS_PER_BYTE) - 1, 0)
66
58struct ip_tunnel_info { 67struct ip_tunnel_info {
59 struct ip_tunnel_key key; 68 struct ip_tunnel_key key;
69#ifdef CONFIG_DST_CACHE
70 struct dst_cache dst_cache;
71#endif
60 u8 options_len; 72 u8 options_len;
61 u8 mode; 73 u8 mode;
62}; 74};
@@ -85,11 +97,6 @@ struct ip_tunnel_prl_entry {
85 struct rcu_head rcu_head; 97 struct rcu_head rcu_head;
86}; 98};
87 99
88struct ip_tunnel_dst {
89 struct dst_entry __rcu *dst;
90 __be32 saddr;
91};
92
93struct metadata_dst; 100struct metadata_dst;
94 101
95struct ip_tunnel { 102struct ip_tunnel {
@@ -108,7 +115,7 @@ struct ip_tunnel {
108 int tun_hlen; /* Precalculated header length */ 115 int tun_hlen; /* Precalculated header length */
109 int mlink; 116 int mlink;
110 117
111 struct ip_tunnel_dst __percpu *dst_cache; 118 struct dst_cache dst_cache;
112 119
113 struct ip_tunnel_parm parms; 120 struct ip_tunnel_parm parms;
114 121
@@ -141,6 +148,7 @@ struct ip_tunnel {
141#define TUNNEL_CRIT_OPT __cpu_to_be16(0x0400) 148#define TUNNEL_CRIT_OPT __cpu_to_be16(0x0400)
142#define TUNNEL_GENEVE_OPT __cpu_to_be16(0x0800) 149#define TUNNEL_GENEVE_OPT __cpu_to_be16(0x0800)
143#define TUNNEL_VXLAN_OPT __cpu_to_be16(0x1000) 150#define TUNNEL_VXLAN_OPT __cpu_to_be16(0x1000)
151#define TUNNEL_NOCACHE __cpu_to_be16(0x2000)
144 152
145#define TUNNEL_OPTIONS_PRESENT (TUNNEL_GENEVE_OPT | TUNNEL_VXLAN_OPT) 153#define TUNNEL_OPTIONS_PRESENT (TUNNEL_GENEVE_OPT | TUNNEL_VXLAN_OPT)
146 154
@@ -181,7 +189,7 @@ int ip_tunnel_encap_del_ops(const struct ip_tunnel_encap_ops *op,
181 189
182static inline void ip_tunnel_key_init(struct ip_tunnel_key *key, 190static inline void ip_tunnel_key_init(struct ip_tunnel_key *key,
183 __be32 saddr, __be32 daddr, 191 __be32 saddr, __be32 daddr,
184 u8 tos, u8 ttl, 192 u8 tos, u8 ttl, __be32 label,
185 __be16 tp_src, __be16 tp_dst, 193 __be16 tp_src, __be16 tp_dst,
186 __be64 tun_id, __be16 tun_flags) 194 __be64 tun_id, __be16 tun_flags)
187{ 195{
@@ -192,6 +200,7 @@ static inline void ip_tunnel_key_init(struct ip_tunnel_key *key,
192 0, IP_TUNNEL_KEY_IPV4_PAD_LEN); 200 0, IP_TUNNEL_KEY_IPV4_PAD_LEN);
193 key->tos = tos; 201 key->tos = tos;
194 key->ttl = ttl; 202 key->ttl = ttl;
203 key->label = label;
195 key->tun_flags = tun_flags; 204 key->tun_flags = tun_flags;
196 205
197 /* For the tunnel types on the top of IPsec, the tp_src and tp_dst of 206 /* For the tunnel types on the top of IPsec, the tp_src and tp_dst of
@@ -207,6 +216,20 @@ static inline void ip_tunnel_key_init(struct ip_tunnel_key *key,
207 0, sizeof(*key) - IP_TUNNEL_KEY_SIZE); 216 0, sizeof(*key) - IP_TUNNEL_KEY_SIZE);
208} 217}
209 218
219static inline bool
220ip_tunnel_dst_cache_usable(const struct sk_buff *skb,
221 const struct ip_tunnel_info *info)
222{
223 if (skb->mark)
224 return false;
225 if (!info)
226 return true;
227 if (info->key.tun_flags & TUNNEL_NOCACHE)
228 return false;
229
230 return true;
231}
232
210static inline unsigned short ip_tunnel_info_af(const struct ip_tunnel_info 233static inline unsigned short ip_tunnel_info_af(const struct ip_tunnel_info
211 *tun_info) 234 *tun_info)
212{ 235{
@@ -248,7 +271,6 @@ int ip_tunnel_changelink(struct net_device *dev, struct nlattr *tb[],
248int ip_tunnel_newlink(struct net_device *dev, struct nlattr *tb[], 271int ip_tunnel_newlink(struct net_device *dev, struct nlattr *tb[],
249 struct ip_tunnel_parm *p); 272 struct ip_tunnel_parm *p);
250void ip_tunnel_setup(struct net_device *dev, int net_id); 273void ip_tunnel_setup(struct net_device *dev, int net_id);
251void ip_tunnel_dst_reset_all(struct ip_tunnel *t);
252int ip_tunnel_encap_setup(struct ip_tunnel *t, 274int ip_tunnel_encap_setup(struct ip_tunnel *t,
253 struct ip_tunnel_encap *ipencap); 275 struct ip_tunnel_encap *ipencap);
254 276
@@ -273,15 +295,15 @@ static inline u8 ip_tunnel_ecn_encap(u8 tos, const struct iphdr *iph,
273 return INET_ECN_encapsulate(tos, inner); 295 return INET_ECN_encapsulate(tos, inner);
274} 296}
275 297
276int iptunnel_pull_header(struct sk_buff *skb, int hdr_len, __be16 inner_proto); 298int iptunnel_pull_header(struct sk_buff *skb, int hdr_len, __be16 inner_proto,
299 bool xnet);
277void iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb, 300void iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb,
278 __be32 src, __be32 dst, u8 proto, 301 __be32 src, __be32 dst, u8 proto,
279 u8 tos, u8 ttl, __be16 df, bool xnet); 302 u8 tos, u8 ttl, __be16 df, bool xnet);
280struct metadata_dst *iptunnel_metadata_reply(struct metadata_dst *md, 303struct metadata_dst *iptunnel_metadata_reply(struct metadata_dst *md,
281 gfp_t flags); 304 gfp_t flags);
282 305
283struct sk_buff *iptunnel_handle_offloads(struct sk_buff *skb, bool gre_csum, 306struct sk_buff *iptunnel_handle_offloads(struct sk_buff *skb, int gso_type_mask);
284 int gso_type_mask);
285 307
286static inline void iptunnel_xmit_stats(struct net_device *dev, int pkt_len) 308static inline void iptunnel_xmit_stats(struct net_device *dev, int pkt_len)
287{ 309{
@@ -356,6 +378,17 @@ static inline void ip_tunnel_unneed_metadata(void)
356{ 378{
357} 379}
358 380
381static inline void ip_tunnel_info_opts_get(void *to,
382 const struct ip_tunnel_info *info)
383{
384}
385
386static inline void ip_tunnel_info_opts_set(struct ip_tunnel_info *info,
387 const void *from, int len)
388{
389 info->options_len = 0;
390}
391
359#endif /* CONFIG_INET */ 392#endif /* CONFIG_INET */
360 393
361#endif /* __NET_IP_TUNNELS_H */ 394#endif /* __NET_IP_TUNNELS_H */
diff --git a/include/net/ip_vs.h b/include/net/ip_vs.h
index 0816c872b689..a6cc576fd467 100644
--- a/include/net/ip_vs.h
+++ b/include/net/ip_vs.h
@@ -1588,6 +1588,23 @@ static inline void ip_vs_conn_drop_conntrack(struct ip_vs_conn *cp)
1588} 1588}
1589#endif /* CONFIG_IP_VS_NFCT */ 1589#endif /* CONFIG_IP_VS_NFCT */
1590 1590
1591/* Really using conntrack? */
1592static inline bool ip_vs_conn_uses_conntrack(struct ip_vs_conn *cp,
1593 struct sk_buff *skb)
1594{
1595#ifdef CONFIG_IP_VS_NFCT
1596 enum ip_conntrack_info ctinfo;
1597 struct nf_conn *ct;
1598
1599 if (!(cp->flags & IP_VS_CONN_F_NFCT))
1600 return false;
1601 ct = nf_ct_get(skb, &ctinfo);
1602 if (ct && !nf_ct_is_untracked(ct))
1603 return true;
1604#endif
1605 return false;
1606}
1607
1591static inline int 1608static inline int
1592ip_vs_dest_conn_overhead(struct ip_vs_dest *dest) 1609ip_vs_dest_conn_overhead(struct ip_vs_dest *dest)
1593{ 1610{
diff --git a/include/net/ipv6.h b/include/net/ipv6.h
index 6570f379aba2..f3c9857c645d 100644
--- a/include/net/ipv6.h
+++ b/include/net/ipv6.h
@@ -259,8 +259,12 @@ static inline struct ipv6_txoptions *txopt_get(const struct ipv6_pinfo *np)
259 259
260 rcu_read_lock(); 260 rcu_read_lock();
261 opt = rcu_dereference(np->opt); 261 opt = rcu_dereference(np->opt);
262 if (opt && !atomic_inc_not_zero(&opt->refcnt)) 262 if (opt) {
263 opt = NULL; 263 if (!atomic_inc_not_zero(&opt->refcnt))
264 opt = NULL;
265 else
266 opt = rcu_pointer_handoff(opt);
267 }
264 rcu_read_unlock(); 268 rcu_read_unlock();
265 return opt; 269 return opt;
266} 270}
diff --git a/include/net/kcm.h b/include/net/kcm.h
new file mode 100644
index 000000000000..2840b5825dcc
--- /dev/null
+++ b/include/net/kcm.h
@@ -0,0 +1,226 @@
1/*
2 * Kernel Connection Multiplexor
3 *
4 * Copyright (c) 2016 Tom Herbert <tom@herbertland.com>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2
8 * as published by the Free Software Foundation.
9 */
10
11#ifndef __NET_KCM_H_
12#define __NET_KCM_H_
13
14#include <linux/skbuff.h>
15#include <net/sock.h>
16#include <uapi/linux/kcm.h>
17
18extern unsigned int kcm_net_id;
19
20#define KCM_STATS_ADD(stat, count) ((stat) += (count))
21#define KCM_STATS_INCR(stat) ((stat)++)
22
23struct kcm_psock_stats {
24 unsigned long long rx_msgs;
25 unsigned long long rx_bytes;
26 unsigned long long tx_msgs;
27 unsigned long long tx_bytes;
28 unsigned int rx_aborts;
29 unsigned int rx_mem_fail;
30 unsigned int rx_need_more_hdr;
31 unsigned int rx_msg_too_big;
32 unsigned int rx_msg_timeouts;
33 unsigned int rx_bad_hdr_len;
34 unsigned long long reserved;
35 unsigned long long unreserved;
36 unsigned int tx_aborts;
37};
38
39struct kcm_mux_stats {
40 unsigned long long rx_msgs;
41 unsigned long long rx_bytes;
42 unsigned long long tx_msgs;
43 unsigned long long tx_bytes;
44 unsigned int rx_ready_drops;
45 unsigned int tx_retries;
46 unsigned int psock_attach;
47 unsigned int psock_unattach_rsvd;
48 unsigned int psock_unattach;
49};
50
51struct kcm_stats {
52 unsigned long long rx_msgs;
53 unsigned long long rx_bytes;
54 unsigned long long tx_msgs;
55 unsigned long long tx_bytes;
56};
57
58struct kcm_tx_msg {
59 unsigned int sent;
60 unsigned int fragidx;
61 unsigned int frag_offset;
62 unsigned int msg_flags;
63 struct sk_buff *frag_skb;
64 struct sk_buff *last_skb;
65};
66
67struct kcm_rx_msg {
68 int full_len;
69 int accum_len;
70 int offset;
71 int early_eaten;
72};
73
74/* Socket structure for KCM client sockets */
75struct kcm_sock {
76 struct sock sk;
77 struct kcm_mux *mux;
78 struct list_head kcm_sock_list;
79 int index;
80 u32 done : 1;
81 struct work_struct done_work;
82
83 struct kcm_stats stats;
84
85 /* Transmit */
86 struct kcm_psock *tx_psock;
87 struct work_struct tx_work;
88 struct list_head wait_psock_list;
89 struct sk_buff *seq_skb;
90
91 /* Don't use bit fields here, these are set under different locks */
92 bool tx_wait;
93 bool tx_wait_more;
94
95 /* Receive */
96 struct kcm_psock *rx_psock;
97 struct list_head wait_rx_list; /* KCMs waiting for receiving */
98 bool rx_wait;
99 u32 rx_disabled : 1;
100};
101
102struct bpf_prog;
103
104/* Structure for an attached lower socket */
105struct kcm_psock {
106 struct sock *sk;
107 struct kcm_mux *mux;
108 int index;
109
110 u32 tx_stopped : 1;
111 u32 rx_stopped : 1;
112 u32 done : 1;
113 u32 unattaching : 1;
114
115 void (*save_state_change)(struct sock *sk);
116 void (*save_data_ready)(struct sock *sk);
117 void (*save_write_space)(struct sock *sk);
118
119 struct list_head psock_list;
120
121 struct kcm_psock_stats stats;
122
123 /* Receive */
124 struct sk_buff *rx_skb_head;
125 struct sk_buff **rx_skb_nextp;
126 struct sk_buff *ready_rx_msg;
127 struct list_head psock_ready_list;
128 struct work_struct rx_work;
129 struct delayed_work rx_delayed_work;
130 struct bpf_prog *bpf_prog;
131 struct kcm_sock *rx_kcm;
132 unsigned long long saved_rx_bytes;
133 unsigned long long saved_rx_msgs;
134 struct timer_list rx_msg_timer;
135 unsigned int rx_need_bytes;
136
137 /* Transmit */
138 struct kcm_sock *tx_kcm;
139 struct list_head psock_avail_list;
140 unsigned long long saved_tx_bytes;
141 unsigned long long saved_tx_msgs;
142};
143
144/* Per net MUX list */
145struct kcm_net {
146 struct mutex mutex;
147 struct kcm_psock_stats aggregate_psock_stats;
148 struct kcm_mux_stats aggregate_mux_stats;
149 struct list_head mux_list;
150 int count;
151};
152
153/* Structure for a MUX */
154struct kcm_mux {
155 struct list_head kcm_mux_list;
156 struct rcu_head rcu;
157 struct kcm_net *knet;
158
159 struct list_head kcm_socks; /* All KCM sockets on MUX */
160 int kcm_socks_cnt; /* Total KCM socket count for MUX */
161 struct list_head psocks; /* List of all psocks on MUX */
162 int psocks_cnt; /* Total attached sockets */
163
164 struct kcm_mux_stats stats;
165 struct kcm_psock_stats aggregate_psock_stats;
166
167 /* Receive */
168 spinlock_t rx_lock ____cacheline_aligned_in_smp;
169 struct list_head kcm_rx_waiters; /* KCMs waiting for receiving */
170 struct list_head psocks_ready; /* List of psocks with a msg ready */
171 struct sk_buff_head rx_hold_queue;
172
173 /* Transmit */
174 spinlock_t lock ____cacheline_aligned_in_smp; /* TX and mux locking */
175 struct list_head psocks_avail; /* List of available psocks */
176 struct list_head kcm_tx_waiters; /* KCMs waiting for a TX psock */
177};
178
179#ifdef CONFIG_PROC_FS
180int kcm_proc_init(void);
181void kcm_proc_exit(void);
182#else
183static inline int kcm_proc_init(void) { return 0; }
184static inline void kcm_proc_exit(void) { }
185#endif
186
187static inline void aggregate_psock_stats(struct kcm_psock_stats *stats,
188 struct kcm_psock_stats *agg_stats)
189{
190 /* Save psock statistics in the mux when psock is being unattached. */
191
192#define SAVE_PSOCK_STATS(_stat) (agg_stats->_stat += stats->_stat)
193 SAVE_PSOCK_STATS(rx_msgs);
194 SAVE_PSOCK_STATS(rx_bytes);
195 SAVE_PSOCK_STATS(rx_aborts);
196 SAVE_PSOCK_STATS(rx_mem_fail);
197 SAVE_PSOCK_STATS(rx_need_more_hdr);
198 SAVE_PSOCK_STATS(rx_msg_too_big);
199 SAVE_PSOCK_STATS(rx_msg_timeouts);
200 SAVE_PSOCK_STATS(rx_bad_hdr_len);
201 SAVE_PSOCK_STATS(tx_msgs);
202 SAVE_PSOCK_STATS(tx_bytes);
203 SAVE_PSOCK_STATS(reserved);
204 SAVE_PSOCK_STATS(unreserved);
205 SAVE_PSOCK_STATS(tx_aborts);
206#undef SAVE_PSOCK_STATS
207}
208
209static inline void aggregate_mux_stats(struct kcm_mux_stats *stats,
210 struct kcm_mux_stats *agg_stats)
211{
212 /* Save psock statistics in the mux when psock is being unattached. */
213
214#define SAVE_MUX_STATS(_stat) (agg_stats->_stat += stats->_stat)
215 SAVE_MUX_STATS(rx_msgs);
216 SAVE_MUX_STATS(rx_bytes);
217 SAVE_MUX_STATS(tx_msgs);
218 SAVE_MUX_STATS(tx_bytes);
219 SAVE_MUX_STATS(rx_ready_drops);
220 SAVE_MUX_STATS(psock_attach);
221 SAVE_MUX_STATS(psock_unattach_rsvd);
222 SAVE_MUX_STATS(psock_unattach);
223#undef SAVE_MUX_STATS
224}
225
226#endif /* __NET_KCM_H_ */
diff --git a/include/net/l3mdev.h b/include/net/l3mdev.h
index 5567d46b3cff..c43a9c73de5e 100644
--- a/include/net/l3mdev.h
+++ b/include/net/l3mdev.h
@@ -39,7 +39,7 @@ struct l3mdev_ops {
39 39
40#ifdef CONFIG_NET_L3_MASTER_DEV 40#ifdef CONFIG_NET_L3_MASTER_DEV
41 41
42int l3mdev_master_ifindex_rcu(struct net_device *dev); 42int l3mdev_master_ifindex_rcu(const struct net_device *dev);
43static inline int l3mdev_master_ifindex(struct net_device *dev) 43static inline int l3mdev_master_ifindex(struct net_device *dev)
44{ 44{
45 int ifindex; 45 int ifindex;
@@ -179,7 +179,7 @@ struct dst_entry *l3mdev_rt6_dst_by_oif(struct net *net,
179 179
180#else 180#else
181 181
182static inline int l3mdev_master_ifindex_rcu(struct net_device *dev) 182static inline int l3mdev_master_ifindex_rcu(const struct net_device *dev)
183{ 183{
184 return 0; 184 return 0;
185} 185}
diff --git a/include/net/lwtunnel.h b/include/net/lwtunnel.h
index 66350ce3e955..e9f116e29c22 100644
--- a/include/net/lwtunnel.h
+++ b/include/net/lwtunnel.h
@@ -170,6 +170,8 @@ static inline int lwtunnel_input(struct sk_buff *skb)
170 return -EOPNOTSUPP; 170 return -EOPNOTSUPP;
171} 171}
172 172
173#endif 173#endif /* CONFIG_LWTUNNEL */
174
175#define MODULE_ALIAS_RTNL_LWT(encap_type) MODULE_ALIAS("rtnl-lwt-" __stringify(encap_type))
174 176
175#endif /* __NET_LWTUNNEL_H */ 177#endif /* __NET_LWTUNNEL_H */
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index 7c30faff245f..0c09da34b67a 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -5,7 +5,7 @@
5 * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz> 5 * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz>
6 * Copyright 2007-2010 Johannes Berg <johannes@sipsolutions.net> 6 * Copyright 2007-2010 Johannes Berg <johannes@sipsolutions.net>
7 * Copyright 2013-2014 Intel Mobile Communications GmbH 7 * Copyright 2013-2014 Intel Mobile Communications GmbH
8 * Copyright (C) 2015 Intel Deutschland GmbH 8 * Copyright (C) 2015 - 2016 Intel Deutschland GmbH
9 * 9 *
10 * This program is free software; you can redistribute it and/or modify 10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as 11 * it under the terms of the GNU General Public License version 2 as
@@ -298,6 +298,7 @@ struct ieee80211_vif_chanctx_switch {
298 * note that this is only called when it changes after the channel 298 * note that this is only called when it changes after the channel
299 * context had been assigned. 299 * context had been assigned.
300 * @BSS_CHANGED_OCB: OCB join status changed 300 * @BSS_CHANGED_OCB: OCB join status changed
301 * @BSS_CHANGED_MU_GROUPS: VHT MU-MIMO group id or user position changed
301 */ 302 */
302enum ieee80211_bss_change { 303enum ieee80211_bss_change {
303 BSS_CHANGED_ASSOC = 1<<0, 304 BSS_CHANGED_ASSOC = 1<<0,
@@ -323,6 +324,7 @@ enum ieee80211_bss_change {
323 BSS_CHANGED_BEACON_INFO = 1<<20, 324 BSS_CHANGED_BEACON_INFO = 1<<20,
324 BSS_CHANGED_BANDWIDTH = 1<<21, 325 BSS_CHANGED_BANDWIDTH = 1<<21,
325 BSS_CHANGED_OCB = 1<<22, 326 BSS_CHANGED_OCB = 1<<22,
327 BSS_CHANGED_MU_GROUPS = 1<<23,
326 328
327 /* when adding here, make sure to change ieee80211_reconfig */ 329 /* when adding here, make sure to change ieee80211_reconfig */
328}; 330};
@@ -436,6 +438,19 @@ struct ieee80211_event {
436}; 438};
437 439
438/** 440/**
441 * struct ieee80211_mu_group_data - STA's VHT MU-MIMO group data
442 *
443 * This structure describes the group id data of VHT MU-MIMO
444 *
445 * @membership: 64 bits array - a bit is set if station is member of the group
446 * @position: 2 bits per group id indicating the position in the group
447 */
448struct ieee80211_mu_group_data {
449 u8 membership[WLAN_MEMBERSHIP_LEN];
450 u8 position[WLAN_USER_POSITION_LEN];
451};
452
453/**
439 * struct ieee80211_bss_conf - holds the BSS's changing parameters 454 * struct ieee80211_bss_conf - holds the BSS's changing parameters
440 * 455 *
441 * This structure keeps information about a BSS (and an association 456 * This structure keeps information about a BSS (and an association
@@ -477,6 +492,7 @@ struct ieee80211_event {
477 * @enable_beacon: whether beaconing should be enabled or not 492 * @enable_beacon: whether beaconing should be enabled or not
478 * @chandef: Channel definition for this BSS -- the hardware might be 493 * @chandef: Channel definition for this BSS -- the hardware might be
479 * configured a higher bandwidth than this BSS uses, for example. 494 * configured a higher bandwidth than this BSS uses, for example.
495 * @mu_group: VHT MU-MIMO group membership data
480 * @ht_operation_mode: HT operation mode like in &struct ieee80211_ht_operation. 496 * @ht_operation_mode: HT operation mode like in &struct ieee80211_ht_operation.
481 * This field is only valid when the channel is a wide HT/VHT channel. 497 * This field is only valid when the channel is a wide HT/VHT channel.
482 * Note that with TDLS this can be the case (channel is HT, protection must 498 * Note that with TDLS this can be the case (channel is HT, protection must
@@ -535,6 +551,7 @@ struct ieee80211_bss_conf {
535 s32 cqm_rssi_thold; 551 s32 cqm_rssi_thold;
536 u32 cqm_rssi_hyst; 552 u32 cqm_rssi_hyst;
537 struct cfg80211_chan_def chandef; 553 struct cfg80211_chan_def chandef;
554 struct ieee80211_mu_group_data mu_group;
538 __be32 arp_addr_list[IEEE80211_BSS_ARP_ADDR_LIST_LEN]; 555 __be32 arp_addr_list[IEEE80211_BSS_ARP_ADDR_LIST_LEN];
539 int arp_addr_cnt; 556 int arp_addr_cnt;
540 bool qos; 557 bool qos;
@@ -691,12 +708,14 @@ enum mac80211_tx_info_flags {
691 * protocol frame (e.g. EAP) 708 * protocol frame (e.g. EAP)
692 * @IEEE80211_TX_CTRL_PS_RESPONSE: This frame is a response to a poll 709 * @IEEE80211_TX_CTRL_PS_RESPONSE: This frame is a response to a poll
693 * frame (PS-Poll or uAPSD). 710 * frame (PS-Poll or uAPSD).
711 * @IEEE80211_TX_CTRL_RATE_INJECT: This frame is injected with rate information
694 * 712 *
695 * These flags are used in tx_info->control.flags. 713 * These flags are used in tx_info->control.flags.
696 */ 714 */
697enum mac80211_tx_control_flags { 715enum mac80211_tx_control_flags {
698 IEEE80211_TX_CTRL_PORT_CTRL_PROTO = BIT(0), 716 IEEE80211_TX_CTRL_PORT_CTRL_PROTO = BIT(0),
699 IEEE80211_TX_CTRL_PS_RESPONSE = BIT(1), 717 IEEE80211_TX_CTRL_PS_RESPONSE = BIT(1),
718 IEEE80211_TX_CTRL_RATE_INJECT = BIT(2),
700}; 719};
701 720
702/* 721/*
@@ -993,6 +1012,8 @@ ieee80211_tx_info_clear_status(struct ieee80211_tx_info *info)
993 * @RX_FLAG_MACTIME_END: The timestamp passed in the RX status (@mactime 1012 * @RX_FLAG_MACTIME_END: The timestamp passed in the RX status (@mactime
994 * field) is valid and contains the time the last symbol of the MPDU 1013 * field) is valid and contains the time the last symbol of the MPDU
995 * (including FCS) was received. 1014 * (including FCS) was received.
1015 * @RX_FLAG_MACTIME_PLCP_START: The timestamp passed in the RX status (@mactime
1016 * field) is valid and contains the time the SYNC preamble was received.
996 * @RX_FLAG_SHORTPRE: Short preamble was used for this frame 1017 * @RX_FLAG_SHORTPRE: Short preamble was used for this frame
997 * @RX_FLAG_HT: HT MCS was used and rate_idx is MCS index 1018 * @RX_FLAG_HT: HT MCS was used and rate_idx is MCS index
998 * @RX_FLAG_VHT: VHT MCS was used and rate_index is MCS index 1019 * @RX_FLAG_VHT: VHT MCS was used and rate_index is MCS index
@@ -1014,6 +1035,14 @@ ieee80211_tx_info_clear_status(struct ieee80211_tx_info *info)
1014 * @RX_FLAG_AMPDU_DELIM_CRC_KNOWN: The delimiter CRC field is known (the CRC 1035 * @RX_FLAG_AMPDU_DELIM_CRC_KNOWN: The delimiter CRC field is known (the CRC
1015 * is stored in the @ampdu_delimiter_crc field) 1036 * is stored in the @ampdu_delimiter_crc field)
1016 * @RX_FLAG_LDPC: LDPC was used 1037 * @RX_FLAG_LDPC: LDPC was used
1038 * @RX_FLAG_ONLY_MONITOR: Report frame only to monitor interfaces without
1039 * processing it in any regular way.
1040 * This is useful if drivers offload some frames but still want to report
1041 * them for sniffing purposes.
1042 * @RX_FLAG_SKIP_MONITOR: Process and report frame to all interfaces except
1043 * monitor interfaces.
1044 * This is useful if drivers offload some frames but still want to report
1045 * them for sniffing purposes.
1017 * @RX_FLAG_STBC_MASK: STBC 2 bit bitmask. 1 - Nss=1, 2 - Nss=2, 3 - Nss=3 1046 * @RX_FLAG_STBC_MASK: STBC 2 bit bitmask. 1 - Nss=1, 2 - Nss=2, 3 - Nss=3
1018 * @RX_FLAG_10MHZ: 10 MHz (half channel) was used 1047 * @RX_FLAG_10MHZ: 10 MHz (half channel) was used
1019 * @RX_FLAG_5MHZ: 5 MHz (quarter channel) was used 1048 * @RX_FLAG_5MHZ: 5 MHz (quarter channel) was used
@@ -1033,6 +1062,7 @@ ieee80211_tx_info_clear_status(struct ieee80211_tx_info *info)
1033enum mac80211_rx_flags { 1062enum mac80211_rx_flags {
1034 RX_FLAG_MMIC_ERROR = BIT(0), 1063 RX_FLAG_MMIC_ERROR = BIT(0),
1035 RX_FLAG_DECRYPTED = BIT(1), 1064 RX_FLAG_DECRYPTED = BIT(1),
1065 RX_FLAG_MACTIME_PLCP_START = BIT(2),
1036 RX_FLAG_MMIC_STRIPPED = BIT(3), 1066 RX_FLAG_MMIC_STRIPPED = BIT(3),
1037 RX_FLAG_IV_STRIPPED = BIT(4), 1067 RX_FLAG_IV_STRIPPED = BIT(4),
1038 RX_FLAG_FAILED_FCS_CRC = BIT(5), 1068 RX_FLAG_FAILED_FCS_CRC = BIT(5),
@@ -1046,7 +1076,7 @@ enum mac80211_rx_flags {
1046 RX_FLAG_HT_GF = BIT(13), 1076 RX_FLAG_HT_GF = BIT(13),
1047 RX_FLAG_AMPDU_DETAILS = BIT(14), 1077 RX_FLAG_AMPDU_DETAILS = BIT(14),
1048 RX_FLAG_PN_VALIDATED = BIT(15), 1078 RX_FLAG_PN_VALIDATED = BIT(15),
1049 /* bit 16 free */ 1079 RX_FLAG_DUP_VALIDATED = BIT(16),
1050 RX_FLAG_AMPDU_LAST_KNOWN = BIT(17), 1080 RX_FLAG_AMPDU_LAST_KNOWN = BIT(17),
1051 RX_FLAG_AMPDU_IS_LAST = BIT(18), 1081 RX_FLAG_AMPDU_IS_LAST = BIT(18),
1052 RX_FLAG_AMPDU_DELIM_CRC_ERROR = BIT(19), 1082 RX_FLAG_AMPDU_DELIM_CRC_ERROR = BIT(19),
@@ -1054,6 +1084,8 @@ enum mac80211_rx_flags {
1054 RX_FLAG_MACTIME_END = BIT(21), 1084 RX_FLAG_MACTIME_END = BIT(21),
1055 RX_FLAG_VHT = BIT(22), 1085 RX_FLAG_VHT = BIT(22),
1056 RX_FLAG_LDPC = BIT(23), 1086 RX_FLAG_LDPC = BIT(23),
1087 RX_FLAG_ONLY_MONITOR = BIT(24),
1088 RX_FLAG_SKIP_MONITOR = BIT(25),
1057 RX_FLAG_STBC_MASK = BIT(26) | BIT(27), 1089 RX_FLAG_STBC_MASK = BIT(26) | BIT(27),
1058 RX_FLAG_10MHZ = BIT(28), 1090 RX_FLAG_10MHZ = BIT(28),
1059 RX_FLAG_5MHZ = BIT(29), 1091 RX_FLAG_5MHZ = BIT(29),
@@ -1072,6 +1104,7 @@ enum mac80211_rx_flags {
1072 * @RX_VHT_FLAG_160MHZ: 160 MHz was used 1104 * @RX_VHT_FLAG_160MHZ: 160 MHz was used
1073 * @RX_VHT_FLAG_BF: packet was beamformed 1105 * @RX_VHT_FLAG_BF: packet was beamformed
1074 */ 1106 */
1107
1075enum mac80211_rx_vht_flags { 1108enum mac80211_rx_vht_flags {
1076 RX_VHT_FLAG_80MHZ = BIT(0), 1109 RX_VHT_FLAG_80MHZ = BIT(0),
1077 RX_VHT_FLAG_160MHZ = BIT(1), 1110 RX_VHT_FLAG_160MHZ = BIT(1),
@@ -1091,6 +1124,8 @@ enum mac80211_rx_vht_flags {
1091 * it but can store it and pass it back to the driver for synchronisation 1124 * it but can store it and pass it back to the driver for synchronisation
1092 * @band: the active band when this frame was received 1125 * @band: the active band when this frame was received
1093 * @freq: frequency the radio was tuned to when receiving this frame, in MHz 1126 * @freq: frequency the radio was tuned to when receiving this frame, in MHz
1127 * This field must be set for management frames, but isn't strictly needed
1128 * for data (other) frames - for those it only affects radiotap reporting.
1094 * @signal: signal strength when receiving this frame, either in dBm, in dB or 1129 * @signal: signal strength when receiving this frame, either in dBm, in dB or
1095 * unspecified depending on the hardware capabilities flags 1130 * unspecified depending on the hardware capabilities flags
1096 * @IEEE80211_HW_SIGNAL_* 1131 * @IEEE80211_HW_SIGNAL_*
@@ -1347,6 +1382,7 @@ enum ieee80211_vif_flags {
1347 * @csa_active: marks whether a channel switch is going on. Internally it is 1382 * @csa_active: marks whether a channel switch is going on. Internally it is
1348 * write-protected by sdata_lock and local->mtx so holding either is fine 1383 * write-protected by sdata_lock and local->mtx so holding either is fine
1349 * for read access. 1384 * for read access.
1385 * @mu_mimo_owner: indicates interface owns MU-MIMO capability
1350 * @driver_flags: flags/capabilities the driver has for this interface, 1386 * @driver_flags: flags/capabilities the driver has for this interface,
1351 * these need to be set (or cleared) when the interface is added 1387 * these need to be set (or cleared) when the interface is added
1352 * or, if supported by the driver, the interface type is changed 1388 * or, if supported by the driver, the interface type is changed
@@ -1373,6 +1409,7 @@ struct ieee80211_vif {
1373 u8 addr[ETH_ALEN]; 1409 u8 addr[ETH_ALEN];
1374 bool p2p; 1410 bool p2p;
1375 bool csa_active; 1411 bool csa_active;
1412 bool mu_mimo_owner;
1376 1413
1377 u8 cab_queue; 1414 u8 cab_queue;
1378 u8 hw_queue[IEEE80211_NUM_ACS]; 1415 u8 hw_queue[IEEE80211_NUM_ACS];
@@ -1486,9 +1523,8 @@ enum ieee80211_key_flags {
1486 * wants to be given when a frame is transmitted and needs to be 1523 * wants to be given when a frame is transmitted and needs to be
1487 * encrypted in hardware. 1524 * encrypted in hardware.
1488 * @cipher: The key's cipher suite selector. 1525 * @cipher: The key's cipher suite selector.
1489 * @tx_pn: PN used for TX on non-TKIP keys, may be used by the driver 1526 * @tx_pn: PN used for TX keys, may be used by the driver as well if it
1490 * as well if it needs to do software PN assignment by itself 1527 * needs to do software PN assignment by itself (e.g. due to TSO)
1491 * (e.g. due to TSO)
1492 * @flags: key flags, see &enum ieee80211_key_flags. 1528 * @flags: key flags, see &enum ieee80211_key_flags.
1493 * @keyidx: the key index (0-3) 1529 * @keyidx: the key index (0-3)
1494 * @keylen: key material length 1530 * @keylen: key material length
@@ -1514,6 +1550,9 @@ struct ieee80211_key_conf {
1514 1550
1515#define IEEE80211_MAX_PN_LEN 16 1551#define IEEE80211_MAX_PN_LEN 16
1516 1552
1553#define TKIP_PN_TO_IV16(pn) ((u16)(pn & 0xffff))
1554#define TKIP_PN_TO_IV32(pn) ((u32)((pn >> 16) & 0xffffffff))
1555
1517/** 1556/**
1518 * struct ieee80211_key_seq - key sequence counter 1557 * struct ieee80211_key_seq - key sequence counter
1519 * 1558 *
@@ -1684,6 +1723,18 @@ struct ieee80211_sta_rates {
1684 * @tdls_initiator: indicates the STA is an initiator of the TDLS link. Only 1723 * @tdls_initiator: indicates the STA is an initiator of the TDLS link. Only
1685 * valid if the STA is a TDLS peer in the first place. 1724 * valid if the STA is a TDLS peer in the first place.
1686 * @mfp: indicates whether the STA uses management frame protection or not. 1725 * @mfp: indicates whether the STA uses management frame protection or not.
1726 * @max_amsdu_subframes: indicates the maximal number of MSDUs in a single
1727 * A-MSDU. Taken from the Extended Capabilities element. 0 means
1728 * unlimited.
1729 * @max_amsdu_len: indicates the maximal length of an A-MSDU in bytes. This
1730 * field is always valid for packets with a VHT preamble. For packets
1731 * with a HT preamble, additional limits apply:
1732 * + If the skb is transmitted as part of a BA agreement, the
1733 * A-MSDU maximal size is min(max_amsdu_len, 4065) bytes.
1734 * + If the skb is not part of a BA aggreement, the A-MSDU maximal
1735 * size is min(max_amsdu_len, 7935) bytes.
1736 * Both additional HT limits must be enforced by the low level driver.
1737 * This is defined by the spec (IEEE 802.11-2012 section 8.3.2.2 NOTE 2).
1687 * @txq: per-TID data TX queues (if driver uses the TXQ abstraction) 1738 * @txq: per-TID data TX queues (if driver uses the TXQ abstraction)
1688 */ 1739 */
1689struct ieee80211_sta { 1740struct ieee80211_sta {
@@ -1702,6 +1753,8 @@ struct ieee80211_sta {
1702 bool tdls; 1753 bool tdls;
1703 bool tdls_initiator; 1754 bool tdls_initiator;
1704 bool mfp; 1755 bool mfp;
1756 u8 max_amsdu_subframes;
1757 u16 max_amsdu_len;
1705 1758
1706 struct ieee80211_txq *txq[IEEE80211_NUM_TIDS]; 1759 struct ieee80211_txq *txq[IEEE80211_NUM_TIDS];
1707 1760
@@ -1910,6 +1963,11 @@ struct ieee80211_txq {
1910 * by just its MAC address; this prevents, for example, the same station 1963 * by just its MAC address; this prevents, for example, the same station
1911 * from connecting to two virtual AP interfaces at the same time. 1964 * from connecting to two virtual AP interfaces at the same time.
1912 * 1965 *
1966 * @IEEE80211_HW_SUPPORTS_REORDERING_BUFFER: Hardware (or driver) manages the
1967 * reordering buffer internally, guaranteeing mac80211 receives frames in
1968 * order and does not need to manage its own reorder buffer or BA session
1969 * timeout.
1970 *
1913 * @NUM_IEEE80211_HW_FLAGS: number of hardware flags, used for sizing arrays 1971 * @NUM_IEEE80211_HW_FLAGS: number of hardware flags, used for sizing arrays
1914 */ 1972 */
1915enum ieee80211_hw_flags { 1973enum ieee80211_hw_flags {
@@ -1946,6 +2004,7 @@ enum ieee80211_hw_flags {
1946 IEEE80211_HW_SUPPORTS_AMSDU_IN_AMPDU, 2004 IEEE80211_HW_SUPPORTS_AMSDU_IN_AMPDU,
1947 IEEE80211_HW_BEACON_TX_STATUS, 2005 IEEE80211_HW_BEACON_TX_STATUS,
1948 IEEE80211_HW_NEEDS_UNIQUE_STA_ADDR, 2006 IEEE80211_HW_NEEDS_UNIQUE_STA_ADDR,
2007 IEEE80211_HW_SUPPORTS_REORDERING_BUFFER,
1949 2008
1950 /* keep last, obviously */ 2009 /* keep last, obviously */
1951 NUM_IEEE80211_HW_FLAGS 2010 NUM_IEEE80211_HW_FLAGS
@@ -2167,7 +2226,7 @@ static inline void SET_IEEE80211_DEV(struct ieee80211_hw *hw, struct device *dev
2167 * @hw: the &struct ieee80211_hw to set the MAC address for 2226 * @hw: the &struct ieee80211_hw to set the MAC address for
2168 * @addr: the address to set 2227 * @addr: the address to set
2169 */ 2228 */
2170static inline void SET_IEEE80211_PERM_ADDR(struct ieee80211_hw *hw, u8 *addr) 2229static inline void SET_IEEE80211_PERM_ADDR(struct ieee80211_hw *hw, const u8 *addr)
2171{ 2230{
2172 memcpy(hw->wiphy->perm_addr, addr, ETH_ALEN); 2231 memcpy(hw->wiphy->perm_addr, addr, ETH_ALEN);
2173} 2232}
@@ -2684,6 +2743,33 @@ enum ieee80211_ampdu_mlme_action {
2684}; 2743};
2685 2744
2686/** 2745/**
2746 * struct ieee80211_ampdu_params - AMPDU action parameters
2747 *
2748 * @action: the ampdu action, value from %ieee80211_ampdu_mlme_action.
2749 * @sta: peer of this AMPDU session
2750 * @tid: tid of the BA session
2751 * @ssn: start sequence number of the session. TX/RX_STOP can pass 0. When
2752 * action is set to %IEEE80211_AMPDU_RX_START the driver passes back the
2753 * actual ssn value used to start the session and writes the value here.
2754 * @buf_size: reorder buffer size (number of subframes). Valid only when the
2755 * action is set to %IEEE80211_AMPDU_RX_START or
2756 * %IEEE80211_AMPDU_TX_OPERATIONAL
2757 * @amsdu: indicates the peer's ability to receive A-MSDU within A-MPDU.
2758 * valid when the action is set to %IEEE80211_AMPDU_TX_OPERATIONAL
2759 * @timeout: BA session timeout. Valid only when the action is set to
2760 * %IEEE80211_AMPDU_RX_START
2761 */
2762struct ieee80211_ampdu_params {
2763 enum ieee80211_ampdu_mlme_action action;
2764 struct ieee80211_sta *sta;
2765 u16 tid;
2766 u16 ssn;
2767 u8 buf_size;
2768 bool amsdu;
2769 u16 timeout;
2770};
2771
2772/**
2687 * enum ieee80211_frame_release_type - frame release reason 2773 * enum ieee80211_frame_release_type - frame release reason
2688 * @IEEE80211_FRAME_RELEASE_PSPOLL: frame released for PS-Poll 2774 * @IEEE80211_FRAME_RELEASE_PSPOLL: frame released for PS-Poll
2689 * @IEEE80211_FRAME_RELEASE_UAPSD: frame(s) released due to 2775 * @IEEE80211_FRAME_RELEASE_UAPSD: frame(s) released due to
@@ -3027,13 +3113,9 @@ enum ieee80211_reconfig_type {
3027 * @ampdu_action: Perform a certain A-MPDU action 3113 * @ampdu_action: Perform a certain A-MPDU action
3028 * The RA/TID combination determines the destination and TID we want 3114 * The RA/TID combination determines the destination and TID we want
3029 * the ampdu action to be performed for. The action is defined through 3115 * the ampdu action to be performed for. The action is defined through
3030 * ieee80211_ampdu_mlme_action. Starting sequence number (@ssn) 3116 * ieee80211_ampdu_mlme_action.
3031 * is the first frame we expect to perform the action on. Notice 3117 * When the action is set to %IEEE80211_AMPDU_TX_OPERATIONAL the driver
3032 * that TX/RX_STOP can pass NULL for this parameter. 3118 * may neither send aggregates containing more subframes than @buf_size
3033 * The @buf_size parameter is only valid when the action is set to
3034 * %IEEE80211_AMPDU_TX_OPERATIONAL and indicates the peer's reorder
3035 * buffer size (number of subframes) for this session -- the driver
3036 * may neither send aggregates containing more subframes than this
3037 * nor send aggregates in a way that lost frames would exceed the 3119 * nor send aggregates in a way that lost frames would exceed the
3038 * buffer size. If just limiting the aggregate size, this would be 3120 * buffer size. If just limiting the aggregate size, this would be
3039 * possible with a buf_size of 8: 3121 * possible with a buf_size of 8:
@@ -3044,9 +3126,6 @@ enum ieee80211_reconfig_type {
3044 * buffer size of 8. Correct ways to retransmit #1 would be: 3126 * buffer size of 8. Correct ways to retransmit #1 would be:
3045 * - TX: 1 or 18 or 81 3127 * - TX: 1 or 18 or 81
3046 * Even "189" would be wrong since 1 could be lost again. 3128 * Even "189" would be wrong since 1 could be lost again.
3047 * The @amsdu parameter is valid when the action is set to
3048 * %IEEE80211_AMPDU_TX_OPERATIONAL and indicates the peer's ability
3049 * to receive A-MSDU within A-MPDU.
3050 * 3129 *
3051 * Returns a negative error code on failure. 3130 * Returns a negative error code on failure.
3052 * The callback can sleep. 3131 * The callback can sleep.
@@ -3388,9 +3467,7 @@ struct ieee80211_ops {
3388 int (*tx_last_beacon)(struct ieee80211_hw *hw); 3467 int (*tx_last_beacon)(struct ieee80211_hw *hw);
3389 int (*ampdu_action)(struct ieee80211_hw *hw, 3468 int (*ampdu_action)(struct ieee80211_hw *hw,
3390 struct ieee80211_vif *vif, 3469 struct ieee80211_vif *vif,
3391 enum ieee80211_ampdu_mlme_action action, 3470 struct ieee80211_ampdu_params *params);
3392 struct ieee80211_sta *sta, u16 tid, u16 *ssn,
3393 u8 buf_size, bool amsdu);
3394 int (*get_survey)(struct ieee80211_hw *hw, int idx, 3471 int (*get_survey)(struct ieee80211_hw *hw, int idx,
3395 struct survey_info *survey); 3472 struct survey_info *survey);
3396 void (*rfkill_poll)(struct ieee80211_hw *hw); 3473 void (*rfkill_poll)(struct ieee80211_hw *hw);
@@ -4374,21 +4451,19 @@ void ieee80211_get_tkip_p2k(struct ieee80211_key_conf *keyconf,
4374 struct sk_buff *skb, u8 *p2k); 4451 struct sk_buff *skb, u8 *p2k);
4375 4452
4376/** 4453/**
4377 * ieee80211_get_key_tx_seq - get key TX sequence counter 4454 * ieee80211_tkip_add_iv - write TKIP IV and Ext. IV to pos
4378 * 4455 *
4456 * @pos: start of crypto header
4379 * @keyconf: the parameter passed with the set key 4457 * @keyconf: the parameter passed with the set key
4380 * @seq: buffer to receive the sequence data 4458 * @pn: PN to add
4381 * 4459 *
4382 * This function allows a driver to retrieve the current TX IV/PN 4460 * Returns: pointer to the octet following IVs (i.e. beginning of
4383 * for the given key. It must not be called if IV generation is 4461 * the packet payload)
4384 * offloaded to the device.
4385 * 4462 *
4386 * Note that this function may only be called when no TX processing 4463 * This function writes the tkip IV value to pos (which should
4387 * can be done concurrently, for example when queues are stopped 4464 * point to the crypto header)
4388 * and the stop has been synchronized.
4389 */ 4465 */
4390void ieee80211_get_key_tx_seq(struct ieee80211_key_conf *keyconf, 4466u8 *ieee80211_tkip_add_iv(u8 *pos, struct ieee80211_key_conf *keyconf, u64 pn);
4391 struct ieee80211_key_seq *seq);
4392 4467
4393/** 4468/**
4394 * ieee80211_get_key_rx_seq - get key RX sequence counter 4469 * ieee80211_get_key_rx_seq - get key RX sequence counter
@@ -4410,23 +4485,6 @@ void ieee80211_get_key_rx_seq(struct ieee80211_key_conf *keyconf,
4410 int tid, struct ieee80211_key_seq *seq); 4485 int tid, struct ieee80211_key_seq *seq);
4411 4486
4412/** 4487/**
4413 * ieee80211_set_key_tx_seq - set key TX sequence counter
4414 *
4415 * @keyconf: the parameter passed with the set key
4416 * @seq: new sequence data
4417 *
4418 * This function allows a driver to set the current TX IV/PNs for the
4419 * given key. This is useful when resuming from WoWLAN sleep and the
4420 * device may have transmitted frames using the PTK, e.g. replies to
4421 * ARP requests.
4422 *
4423 * Note that this function may only be called when no TX processing
4424 * can be done concurrently.
4425 */
4426void ieee80211_set_key_tx_seq(struct ieee80211_key_conf *keyconf,
4427 struct ieee80211_key_seq *seq);
4428
4429/**
4430 * ieee80211_set_key_rx_seq - set key RX sequence counter 4488 * ieee80211_set_key_rx_seq - set key RX sequence counter
4431 * 4489 *
4432 * @keyconf: the parameter passed with the set key 4490 * @keyconf: the parameter passed with the set key
@@ -5121,6 +5179,24 @@ void ieee80211_stop_rx_ba_session(struct ieee80211_vif *vif, u16 ba_rx_bitmap,
5121 const u8 *addr); 5179 const u8 *addr);
5122 5180
5123/** 5181/**
5182 * ieee80211_mark_rx_ba_filtered_frames - move RX BA window and mark filtered
5183 * @pubsta: station struct
5184 * @tid: the session's TID
5185 * @ssn: starting sequence number of the bitmap, all frames before this are
5186 * assumed to be out of the window after the call
5187 * @filtered: bitmap of filtered frames, BIT(0) is the @ssn entry etc.
5188 * @received_mpdus: number of received mpdus in firmware
5189 *
5190 * This function moves the BA window and releases all frames before @ssn, and
5191 * marks frames marked in the bitmap as having been filtered. Afterwards, it
5192 * checks if any frames in the window starting from @ssn can now be released
5193 * (in case they were only waiting for frames that were filtered.)
5194 */
5195void ieee80211_mark_rx_ba_filtered_frames(struct ieee80211_sta *pubsta, u8 tid,
5196 u16 ssn, u64 filtered,
5197 u16 received_mpdus);
5198
5199/**
5124 * ieee80211_send_bar - send a BlockAckReq frame 5200 * ieee80211_send_bar - send a BlockAckReq frame
5125 * 5201 *
5126 * can be used to flush pending frames from the peer's aggregation reorder 5202 * can be used to flush pending frames from the peer's aggregation reorder
@@ -5371,6 +5447,21 @@ ieee80211_vif_type_p2p(struct ieee80211_vif *vif)
5371 return ieee80211_iftype_p2p(vif->type, vif->p2p); 5447 return ieee80211_iftype_p2p(vif->type, vif->p2p);
5372} 5448}
5373 5449
5450/**
5451 * ieee80211_update_mu_groups - set the VHT MU-MIMO groud data
5452 *
5453 * @vif: the specified virtual interface
5454 * @membership: 64 bits array - a bit is set if station is member of the group
5455 * @position: 2 bits per group id indicating the position in the group
5456 *
5457 * Note: This function assumes that the given vif is valid and the position and
5458 * membership data is of the correct size and are in the same byte order as the
5459 * matching GroupId management frame.
5460 * Calls to this function need to be serialized with RX path.
5461 */
5462void ieee80211_update_mu_groups(struct ieee80211_vif *vif,
5463 const u8 *membership, const u8 *position);
5464
5374void ieee80211_enable_rssi_reports(struct ieee80211_vif *vif, 5465void ieee80211_enable_rssi_reports(struct ieee80211_vif *vif,
5375 int rssi_min_thold, 5466 int rssi_min_thold,
5376 int rssi_max_thold); 5467 int rssi_max_thold);
@@ -5523,4 +5614,19 @@ void ieee80211_unreserve_tid(struct ieee80211_sta *sta, u8 tid);
5523 */ 5614 */
5524struct sk_buff *ieee80211_tx_dequeue(struct ieee80211_hw *hw, 5615struct sk_buff *ieee80211_tx_dequeue(struct ieee80211_hw *hw,
5525 struct ieee80211_txq *txq); 5616 struct ieee80211_txq *txq);
5617
5618/**
5619 * ieee80211_txq_get_depth - get pending frame/byte count of given txq
5620 *
5621 * The values are not guaranteed to be coherent with regard to each other, i.e.
5622 * txq state can change half-way of this function and the caller may end up
5623 * with "new" frame_cnt and "old" byte_cnt or vice-versa.
5624 *
5625 * @txq: pointer obtained from station or virtual interface
5626 * @frame_cnt: pointer to store frame count
5627 * @byte_cnt: pointer to store byte count
5628 */
5629void ieee80211_txq_get_depth(struct ieee80211_txq *txq,
5630 unsigned long *frame_cnt,
5631 unsigned long *byte_cnt);
5526#endif /* MAC80211_H */ 5632#endif /* MAC80211_H */
diff --git a/include/net/mac802154.h b/include/net/mac802154.h
index da574bbdc333..6cd7a70706a9 100644
--- a/include/net/mac802154.h
+++ b/include/net/mac802154.h
@@ -16,10 +16,10 @@
16#ifndef NET_MAC802154_H 16#ifndef NET_MAC802154_H
17#define NET_MAC802154_H 17#define NET_MAC802154_H
18 18
19#include <asm/unaligned.h>
19#include <net/af_ieee802154.h> 20#include <net/af_ieee802154.h>
20#include <linux/ieee802154.h> 21#include <linux/ieee802154.h>
21#include <linux/skbuff.h> 22#include <linux/skbuff.h>
22#include <linux/unaligned/memmove.h>
23 23
24#include <net/cfg802154.h> 24#include <net/cfg802154.h>
25 25
@@ -247,13 +247,14 @@ struct ieee802154_ops {
247 */ 247 */
248static inline __le16 ieee802154_get_fc_from_skb(const struct sk_buff *skb) 248static inline __le16 ieee802154_get_fc_from_skb(const struct sk_buff *skb)
249{ 249{
250 /* return some invalid fc on failure */ 250 /* check if we can fc at skb_mac_header of sk buffer */
251 if (unlikely(skb->len < 2)) { 251 if (unlikely(!skb_mac_header_was_set(skb) ||
252 (skb_tail_pointer(skb) - skb_mac_header(skb)) < 2)) {
252 WARN_ON(1); 253 WARN_ON(1);
253 return cpu_to_le16(0); 254 return cpu_to_le16(0);
254 } 255 }
255 256
256 return (__force __le16)__get_unaligned_memmove16(skb_mac_header(skb)); 257 return get_unaligned_le16(skb_mac_header(skb));
257} 258}
258 259
259/** 260/**
@@ -263,7 +264,7 @@ static inline __le16 ieee802154_get_fc_from_skb(const struct sk_buff *skb)
263 */ 264 */
264static inline void ieee802154_be64_to_le64(void *le64_dst, const void *be64_src) 265static inline void ieee802154_be64_to_le64(void *le64_dst, const void *be64_src)
265{ 266{
266 __put_unaligned_memmove64(swab64p(be64_src), le64_dst); 267 put_unaligned_le64(get_unaligned_be64(be64_src), le64_dst);
267} 268}
268 269
269/** 270/**
@@ -273,7 +274,7 @@ static inline void ieee802154_be64_to_le64(void *le64_dst, const void *be64_src)
273 */ 274 */
274static inline void ieee802154_le64_to_be64(void *be64_dst, const void *le64_src) 275static inline void ieee802154_le64_to_be64(void *be64_dst, const void *le64_src)
275{ 276{
276 __put_unaligned_memmove64(swab64p(le64_src), be64_dst); 277 put_unaligned_be64(get_unaligned_le64(le64_src), be64_dst);
277} 278}
278 279
279/** 280/**
@@ -283,7 +284,7 @@ static inline void ieee802154_le64_to_be64(void *be64_dst, const void *le64_src)
283 */ 284 */
284static inline void ieee802154_le16_to_be16(void *be16_dst, const void *le16_src) 285static inline void ieee802154_le16_to_be16(void *be16_dst, const void *le16_src)
285{ 286{
286 __put_unaligned_memmove16(swab16p(le16_src), be16_dst); 287 put_unaligned_be16(get_unaligned_le16(le16_src), be16_dst);
287} 288}
288 289
289/** 290/**
diff --git a/include/net/netfilter/nft_masq.h b/include/net/netfilter/nft_masq.h
index e2a518b60e19..a3f3c11b2526 100644
--- a/include/net/netfilter/nft_masq.h
+++ b/include/net/netfilter/nft_masq.h
@@ -2,7 +2,9 @@
2#define _NFT_MASQ_H_ 2#define _NFT_MASQ_H_
3 3
4struct nft_masq { 4struct nft_masq {
5 u32 flags; 5 u32 flags;
6 enum nft_registers sreg_proto_min:8;
7 enum nft_registers sreg_proto_max:8;
6}; 8};
7 9
8extern const struct nla_policy nft_masq_policy[]; 10extern const struct nla_policy nft_masq_policy[];
diff --git a/include/net/netns/ipv4.h b/include/net/netns/ipv4.h
index 2b7907a35568..a69cde3ce460 100644
--- a/include/net/netns/ipv4.h
+++ b/include/net/netns/ipv4.h
@@ -80,9 +80,13 @@ struct netns_ipv4 {
80 int sysctl_tcp_ecn; 80 int sysctl_tcp_ecn;
81 int sysctl_tcp_ecn_fallback; 81 int sysctl_tcp_ecn_fallback;
82 82
83 int sysctl_ip_default_ttl;
83 int sysctl_ip_no_pmtu_disc; 84 int sysctl_ip_no_pmtu_disc;
84 int sysctl_ip_fwd_use_pmtu; 85 int sysctl_ip_fwd_use_pmtu;
85 int sysctl_ip_nonlocal_bind; 86 int sysctl_ip_nonlocal_bind;
87 /* Shall we try to damage output packets if routing dev changes? */
88 int sysctl_ip_dynaddr;
89 int sysctl_ip_early_demux;
86 90
87 int sysctl_fwmark_reflect; 91 int sysctl_fwmark_reflect;
88 int sysctl_tcp_fwmark_accept; 92 int sysctl_tcp_fwmark_accept;
@@ -98,6 +102,21 @@ struct netns_ipv4 {
98 int sysctl_tcp_keepalive_probes; 102 int sysctl_tcp_keepalive_probes;
99 int sysctl_tcp_keepalive_intvl; 103 int sysctl_tcp_keepalive_intvl;
100 104
105 int sysctl_tcp_syn_retries;
106 int sysctl_tcp_synack_retries;
107 int sysctl_tcp_syncookies;
108 int sysctl_tcp_reordering;
109 int sysctl_tcp_retries1;
110 int sysctl_tcp_retries2;
111 int sysctl_tcp_orphan_retries;
112 int sysctl_tcp_fin_timeout;
113 unsigned int sysctl_tcp_notsent_lowat;
114
115 int sysctl_igmp_max_memberships;
116 int sysctl_igmp_max_msf;
117 int sysctl_igmp_llm_reports;
118 int sysctl_igmp_qrv;
119
101 struct ping_group_range ping_group_range; 120 struct ping_group_range ping_group_range;
102 121
103 atomic_t dev_addr_genid; 122 atomic_t dev_addr_genid;
diff --git a/include/net/netns/ipv6.h b/include/net/netns/ipv6.h
index c0368db6df54..10d0848f5b8a 100644
--- a/include/net/netns/ipv6.h
+++ b/include/net/netns/ipv6.h
@@ -58,7 +58,10 @@ struct netns_ipv6 {
58 struct timer_list ip6_fib_timer; 58 struct timer_list ip6_fib_timer;
59 struct hlist_head *fib_table_hash; 59 struct hlist_head *fib_table_hash;
60 struct fib6_table *fib6_main_tbl; 60 struct fib6_table *fib6_main_tbl;
61 struct list_head fib6_walkers;
61 struct dst_ops ip6_dst_ops; 62 struct dst_ops ip6_dst_ops;
63 rwlock_t fib6_walker_lock;
64 spinlock_t fib6_gc_lock;
62 unsigned int ip6_rt_gc_expire; 65 unsigned int ip6_rt_gc_expire;
63 unsigned long ip6_rt_last_gc; 66 unsigned long ip6_rt_last_gc;
64#ifdef CONFIG_IPV6_MULTIPLE_TABLES 67#ifdef CONFIG_IPV6_MULTIPLE_TABLES
diff --git a/include/net/phonet/phonet.h b/include/net/phonet/phonet.h
index 68e509750caa..039cc29cb4a8 100644
--- a/include/net/phonet/phonet.h
+++ b/include/net/phonet/phonet.h
@@ -51,7 +51,7 @@ void pn_sock_init(void);
51struct sock *pn_find_sock_by_sa(struct net *net, const struct sockaddr_pn *sa); 51struct sock *pn_find_sock_by_sa(struct net *net, const struct sockaddr_pn *sa);
52void pn_deliver_sock_broadcast(struct net *net, struct sk_buff *skb); 52void pn_deliver_sock_broadcast(struct net *net, struct sk_buff *skb);
53void phonet_get_local_port_range(int *min, int *max); 53void phonet_get_local_port_range(int *min, int *max);
54void pn_sock_hash(struct sock *sk); 54int pn_sock_hash(struct sock *sk);
55void pn_sock_unhash(struct sock *sk); 55void pn_sock_unhash(struct sock *sk);
56int pn_sock_get_port(struct sock *sk, unsigned short sport); 56int pn_sock_get_port(struct sock *sk, unsigned short sport);
57 57
diff --git a/include/net/ping.h b/include/net/ping.h
index ac80cb45e630..5fd7cc244833 100644
--- a/include/net/ping.h
+++ b/include/net/ping.h
@@ -65,7 +65,7 @@ struct pingfakehdr {
65}; 65};
66 66
67int ping_get_port(struct sock *sk, unsigned short ident); 67int ping_get_port(struct sock *sk, unsigned short ident);
68void ping_hash(struct sock *sk); 68int ping_hash(struct sock *sk);
69void ping_unhash(struct sock *sk); 69void ping_unhash(struct sock *sk);
70 70
71int ping_init_sock(struct sock *sk); 71int ping_init_sock(struct sock *sk);
diff --git a/include/net/pkt_cls.h b/include/net/pkt_cls.h
index bc49967e1a68..caa5e18636df 100644
--- a/include/net/pkt_cls.h
+++ b/include/net/pkt_cls.h
@@ -358,4 +358,69 @@ tcf_match_indev(struct sk_buff *skb, int ifindex)
358} 358}
359#endif /* CONFIG_NET_CLS_IND */ 359#endif /* CONFIG_NET_CLS_IND */
360 360
361struct tc_cls_u32_knode {
362 struct tcf_exts *exts;
363 struct tc_u32_sel *sel;
364 u32 handle;
365 u32 val;
366 u32 mask;
367 u32 link_handle;
368 u8 fshift;
369};
370
371struct tc_cls_u32_hnode {
372 u32 handle;
373 u32 prio;
374 unsigned int divisor;
375};
376
377enum tc_clsu32_command {
378 TC_CLSU32_NEW_KNODE,
379 TC_CLSU32_REPLACE_KNODE,
380 TC_CLSU32_DELETE_KNODE,
381 TC_CLSU32_NEW_HNODE,
382 TC_CLSU32_REPLACE_HNODE,
383 TC_CLSU32_DELETE_HNODE,
384};
385
386struct tc_cls_u32_offload {
387 /* knode values */
388 enum tc_clsu32_command command;
389 union {
390 struct tc_cls_u32_knode knode;
391 struct tc_cls_u32_hnode hnode;
392 };
393};
394
395/* tca flags definitions */
396#define TCA_CLS_FLAGS_SKIP_HW 1
397
398static inline bool tc_should_offload(struct net_device *dev, u32 flags)
399{
400 if (!(dev->features & NETIF_F_HW_TC))
401 return false;
402
403 if (flags & TCA_CLS_FLAGS_SKIP_HW)
404 return false;
405
406 if (!dev->netdev_ops->ndo_setup_tc)
407 return false;
408
409 return true;
410}
411
412enum tc_fl_command {
413 TC_CLSFLOWER_REPLACE,
414 TC_CLSFLOWER_DESTROY,
415};
416
417struct tc_cls_flower_offload {
418 enum tc_fl_command command;
419 unsigned long cookie;
420 struct flow_dissector *dissector;
421 struct fl_flow_key *mask;
422 struct fl_flow_key *key;
423 struct tcf_exts *exts;
424};
425
361#endif 426#endif
diff --git a/include/net/raw.h b/include/net/raw.h
index 6a40c6562dd2..3e789008394d 100644
--- a/include/net/raw.h
+++ b/include/net/raw.h
@@ -57,7 +57,7 @@ int raw_seq_open(struct inode *ino, struct file *file,
57 57
58#endif 58#endif
59 59
60void raw_hash_sk(struct sock *sk); 60int raw_hash_sk(struct sock *sk);
61void raw_unhash_sk(struct sock *sk); 61void raw_unhash_sk(struct sock *sk);
62 62
63struct raw_sock { 63struct raw_sock {
diff --git a/include/net/route.h b/include/net/route.h
index a3b9ef74a389..9b0a523bb428 100644
--- a/include/net/route.h
+++ b/include/net/route.h
@@ -329,14 +329,13 @@ static inline int inet_iif(const struct sk_buff *skb)
329 return skb->skb_iif; 329 return skb->skb_iif;
330} 330}
331 331
332extern int sysctl_ip_default_ttl;
333
334static inline int ip4_dst_hoplimit(const struct dst_entry *dst) 332static inline int ip4_dst_hoplimit(const struct dst_entry *dst)
335{ 333{
336 int hoplimit = dst_metric_raw(dst, RTAX_HOPLIMIT); 334 int hoplimit = dst_metric_raw(dst, RTAX_HOPLIMIT);
335 struct net *net = dev_net(dst->dev);
337 336
338 if (hoplimit == 0) 337 if (hoplimit == 0)
339 hoplimit = sysctl_ip_default_ttl; 338 hoplimit = net->ipv4.sysctl_ip_default_ttl;
340 return hoplimit; 339 return hoplimit;
341} 340}
342 341
diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h
index 636a362a0e03..46e55f0202a6 100644
--- a/include/net/sch_generic.h
+++ b/include/net/sch_generic.h
@@ -345,6 +345,12 @@ extern struct Qdisc_ops pfifo_fast_ops;
345extern struct Qdisc_ops mq_qdisc_ops; 345extern struct Qdisc_ops mq_qdisc_ops;
346extern struct Qdisc_ops noqueue_qdisc_ops; 346extern struct Qdisc_ops noqueue_qdisc_ops;
347extern const struct Qdisc_ops *default_qdisc_ops; 347extern const struct Qdisc_ops *default_qdisc_ops;
348static inline const struct Qdisc_ops *
349get_default_qdisc_ops(const struct net_device *dev, int ntx)
350{
351 return ntx < dev->real_num_tx_queues ?
352 default_qdisc_ops : &pfifo_fast_ops;
353}
348 354
349struct Qdisc_class_common { 355struct Qdisc_class_common {
350 u32 classid; 356 u32 classid;
@@ -396,7 +402,8 @@ struct Qdisc *dev_graft_qdisc(struct netdev_queue *dev_queue,
396 struct Qdisc *qdisc); 402 struct Qdisc *qdisc);
397void qdisc_reset(struct Qdisc *qdisc); 403void qdisc_reset(struct Qdisc *qdisc);
398void qdisc_destroy(struct Qdisc *qdisc); 404void qdisc_destroy(struct Qdisc *qdisc);
399void qdisc_tree_decrease_qlen(struct Qdisc *qdisc, unsigned int n); 405void qdisc_tree_reduce_backlog(struct Qdisc *qdisc, unsigned int n,
406 unsigned int len);
400struct Qdisc *qdisc_alloc(struct netdev_queue *dev_queue, 407struct Qdisc *qdisc_alloc(struct netdev_queue *dev_queue,
401 const struct Qdisc_ops *ops); 408 const struct Qdisc_ops *ops);
402struct Qdisc *qdisc_create_dflt(struct netdev_queue *dev_queue, 409struct Qdisc *qdisc_create_dflt(struct netdev_queue *dev_queue,
@@ -707,6 +714,23 @@ static inline void qdisc_reset_queue(struct Qdisc *sch)
707 sch->qstats.backlog = 0; 714 sch->qstats.backlog = 0;
708} 715}
709 716
717static inline struct Qdisc *qdisc_replace(struct Qdisc *sch, struct Qdisc *new,
718 struct Qdisc **pold)
719{
720 struct Qdisc *old;
721
722 sch_tree_lock(sch);
723 old = *pold;
724 *pold = new;
725 if (old != NULL) {
726 qdisc_tree_reduce_backlog(old, old->q.qlen, old->qstats.backlog);
727 qdisc_reset(old);
728 }
729 sch_tree_unlock(sch);
730
731 return old;
732}
733
710static inline unsigned int __qdisc_queue_drop(struct Qdisc *sch, 734static inline unsigned int __qdisc_queue_drop(struct Qdisc *sch,
711 struct sk_buff_head *list) 735 struct sk_buff_head *list)
712{ 736{
diff --git a/include/net/sctp/sm.h b/include/net/sctp/sm.h
index 487ef34bbd63..efc01743b9d6 100644
--- a/include/net/sctp/sm.h
+++ b/include/net/sctp/sm.h
@@ -201,7 +201,7 @@ struct sctp_chunk *sctp_make_cwr(const struct sctp_association *,
201struct sctp_chunk * sctp_make_datafrag_empty(struct sctp_association *, 201struct sctp_chunk * sctp_make_datafrag_empty(struct sctp_association *,
202 const struct sctp_sndrcvinfo *sinfo, 202 const struct sctp_sndrcvinfo *sinfo,
203 int len, const __u8 flags, 203 int len, const __u8 flags,
204 __u16 ssn); 204 __u16 ssn, gfp_t gfp);
205struct sctp_chunk *sctp_make_ecne(const struct sctp_association *, 205struct sctp_chunk *sctp_make_ecne(const struct sctp_association *,
206 const __u32); 206 const __u32);
207struct sctp_chunk *sctp_make_sack(const struct sctp_association *); 207struct sctp_chunk *sctp_make_sack(const struct sctp_association *);
diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h
index 5a57409da37b..e2ac0620d4be 100644
--- a/include/net/sctp/structs.h
+++ b/include/net/sctp/structs.h
@@ -535,7 +535,6 @@ struct sctp_datamsg {
535struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *, 535struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *,
536 struct sctp_sndrcvinfo *, 536 struct sctp_sndrcvinfo *,
537 struct iov_iter *); 537 struct iov_iter *);
538void sctp_datamsg_free(struct sctp_datamsg *);
539void sctp_datamsg_put(struct sctp_datamsg *); 538void sctp_datamsg_put(struct sctp_datamsg *);
540void sctp_chunk_fail(struct sctp_chunk *, int error); 539void sctp_chunk_fail(struct sctp_chunk *, int error);
541int sctp_chunk_abandoned(struct sctp_chunk *); 540int sctp_chunk_abandoned(struct sctp_chunk *);
@@ -656,7 +655,7 @@ void sctp_chunk_free(struct sctp_chunk *);
656void *sctp_addto_chunk(struct sctp_chunk *, int len, const void *data); 655void *sctp_addto_chunk(struct sctp_chunk *, int len, const void *data);
657struct sctp_chunk *sctp_chunkify(struct sk_buff *, 656struct sctp_chunk *sctp_chunkify(struct sk_buff *,
658 const struct sctp_association *, 657 const struct sctp_association *,
659 struct sock *); 658 struct sock *, gfp_t gfp);
660void sctp_init_addrs(struct sctp_chunk *, union sctp_addr *, 659void sctp_init_addrs(struct sctp_chunk *, union sctp_addr *,
661 union sctp_addr *); 660 union sctp_addr *);
662const union sctp_addr *sctp_source(const struct sctp_chunk *chunk); 661const union sctp_addr *sctp_source(const struct sctp_chunk *chunk);
@@ -718,10 +717,10 @@ struct sctp_packet *sctp_packet_init(struct sctp_packet *,
718 __u16 sport, __u16 dport); 717 __u16 sport, __u16 dport);
719struct sctp_packet *sctp_packet_config(struct sctp_packet *, __u32 vtag, int); 718struct sctp_packet *sctp_packet_config(struct sctp_packet *, __u32 vtag, int);
720sctp_xmit_t sctp_packet_transmit_chunk(struct sctp_packet *, 719sctp_xmit_t sctp_packet_transmit_chunk(struct sctp_packet *,
721 struct sctp_chunk *, int); 720 struct sctp_chunk *, int, gfp_t);
722sctp_xmit_t sctp_packet_append_chunk(struct sctp_packet *, 721sctp_xmit_t sctp_packet_append_chunk(struct sctp_packet *,
723 struct sctp_chunk *); 722 struct sctp_chunk *);
724int sctp_packet_transmit(struct sctp_packet *); 723int sctp_packet_transmit(struct sctp_packet *, gfp_t);
725void sctp_packet_free(struct sctp_packet *); 724void sctp_packet_free(struct sctp_packet *);
726 725
727static inline int sctp_packet_empty(struct sctp_packet *packet) 726static inline int sctp_packet_empty(struct sctp_packet *packet)
@@ -1054,7 +1053,7 @@ struct sctp_outq {
1054void sctp_outq_init(struct sctp_association *, struct sctp_outq *); 1053void sctp_outq_init(struct sctp_association *, struct sctp_outq *);
1055void sctp_outq_teardown(struct sctp_outq *); 1054void sctp_outq_teardown(struct sctp_outq *);
1056void sctp_outq_free(struct sctp_outq*); 1055void sctp_outq_free(struct sctp_outq*);
1057int sctp_outq_tail(struct sctp_outq *, struct sctp_chunk *chunk); 1056int sctp_outq_tail(struct sctp_outq *, struct sctp_chunk *chunk, gfp_t);
1058int sctp_outq_sack(struct sctp_outq *, struct sctp_chunk *); 1057int sctp_outq_sack(struct sctp_outq *, struct sctp_chunk *);
1059int sctp_outq_is_empty(const struct sctp_outq *); 1058int sctp_outq_is_empty(const struct sctp_outq *);
1060void sctp_outq_restart(struct sctp_outq *); 1059void sctp_outq_restart(struct sctp_outq *);
@@ -1062,7 +1061,7 @@ void sctp_outq_restart(struct sctp_outq *);
1062void sctp_retransmit(struct sctp_outq *, struct sctp_transport *, 1061void sctp_retransmit(struct sctp_outq *, struct sctp_transport *,
1063 sctp_retransmit_reason_t); 1062 sctp_retransmit_reason_t);
1064void sctp_retransmit_mark(struct sctp_outq *, struct sctp_transport *, __u8); 1063void sctp_retransmit_mark(struct sctp_outq *, struct sctp_transport *, __u8);
1065int sctp_outq_uncork(struct sctp_outq *); 1064int sctp_outq_uncork(struct sctp_outq *, gfp_t gfp);
1066/* Uncork and flush an outqueue. */ 1065/* Uncork and flush an outqueue. */
1067static inline void sctp_outq_cork(struct sctp_outq *q) 1066static inline void sctp_outq_cork(struct sctp_outq *q)
1068{ 1067{
diff --git a/include/net/sock.h b/include/net/sock.h
index f5ea148853e2..255d3e03727b 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -984,7 +984,7 @@ struct proto {
984 void (*release_cb)(struct sock *sk); 984 void (*release_cb)(struct sock *sk);
985 985
986 /* Keeping track of sk's, looking them up, and port selection methods. */ 986 /* Keeping track of sk's, looking them up, and port selection methods. */
987 void (*hash)(struct sock *sk); 987 int (*hash)(struct sock *sk);
988 void (*unhash)(struct sock *sk); 988 void (*unhash)(struct sock *sk);
989 void (*rehash)(struct sock *sk); 989 void (*rehash)(struct sock *sk);
990 int (*get_port)(struct sock *sk, unsigned short snum); 990 int (*get_port)(struct sock *sk, unsigned short snum);
@@ -1194,10 +1194,10 @@ static inline void sock_prot_inuse_add(struct net *net, struct proto *prot,
1194/* With per-bucket locks this operation is not-atomic, so that 1194/* With per-bucket locks this operation is not-atomic, so that
1195 * this version is not worse. 1195 * this version is not worse.
1196 */ 1196 */
1197static inline void __sk_prot_rehash(struct sock *sk) 1197static inline int __sk_prot_rehash(struct sock *sk)
1198{ 1198{
1199 sk->sk_prot->unhash(sk); 1199 sk->sk_prot->unhash(sk);
1200 sk->sk_prot->hash(sk); 1200 return sk->sk_prot->hash(sk);
1201} 1201}
1202 1202
1203void sk_prot_clear_portaddr_nulls(struct sock *sk, int size); 1203void sk_prot_clear_portaddr_nulls(struct sock *sk, int size);
diff --git a/include/net/tc_act/tc_gact.h b/include/net/tc_act/tc_gact.h
index 592a6bc02b0b..93c520b83d10 100644
--- a/include/net/tc_act/tc_gact.h
+++ b/include/net/tc_act/tc_gact.h
@@ -2,6 +2,7 @@
2#define __NET_TC_GACT_H 2#define __NET_TC_GACT_H
3 3
4#include <net/act_api.h> 4#include <net/act_api.h>
5#include <linux/tc_act/tc_gact.h>
5 6
6struct tcf_gact { 7struct tcf_gact {
7 struct tcf_common common; 8 struct tcf_common common;
@@ -15,4 +16,19 @@ struct tcf_gact {
15#define to_gact(a) \ 16#define to_gact(a) \
16 container_of(a->priv, struct tcf_gact, common) 17 container_of(a->priv, struct tcf_gact, common)
17 18
19static inline bool is_tcf_gact_shot(const struct tc_action *a)
20{
21#ifdef CONFIG_NET_CLS_ACT
22 struct tcf_gact *gact;
23
24 if (a->ops && a->ops->type != TCA_ACT_GACT)
25 return false;
26
27 gact = a->priv;
28 if (gact->tcf_action == TC_ACT_SHOT)
29 return true;
30
31#endif
32 return false;
33}
18#endif /* __NET_TC_GACT_H */ 34#endif /* __NET_TC_GACT_H */
diff --git a/include/net/tc_act/tc_ife.h b/include/net/tc_act/tc_ife.h
new file mode 100644
index 000000000000..dc9a09aefb33
--- /dev/null
+++ b/include/net/tc_act/tc_ife.h
@@ -0,0 +1,61 @@
1#ifndef __NET_TC_IFE_H
2#define __NET_TC_IFE_H
3
4#include <net/act_api.h>
5#include <linux/etherdevice.h>
6#include <linux/rtnetlink.h>
7#include <linux/module.h>
8
9#define IFE_METAHDRLEN 2
10struct tcf_ife_info {
11 struct tcf_common common;
12 u8 eth_dst[ETH_ALEN];
13 u8 eth_src[ETH_ALEN];
14 u16 eth_type;
15 u16 flags;
16 /* list of metaids allowed */
17 struct list_head metalist;
18};
19#define to_ife(a) \
20 container_of(a->priv, struct tcf_ife_info, common)
21
22struct tcf_meta_info {
23 const struct tcf_meta_ops *ops;
24 void *metaval;
25 u16 metaid;
26 struct list_head metalist;
27};
28
29struct tcf_meta_ops {
30 u16 metaid; /*Maintainer provided ID */
31 u16 metatype; /*netlink attribute type (look at net/netlink.h) */
32 const char *name;
33 const char *synopsis;
34 struct list_head list;
35 int (*check_presence)(struct sk_buff *, struct tcf_meta_info *);
36 int (*encode)(struct sk_buff *, void *, struct tcf_meta_info *);
37 int (*decode)(struct sk_buff *, void *, u16 len);
38 int (*get)(struct sk_buff *skb, struct tcf_meta_info *mi);
39 int (*alloc)(struct tcf_meta_info *, void *);
40 void (*release)(struct tcf_meta_info *);
41 int (*validate)(void *val, int len);
42 struct module *owner;
43};
44
45#define MODULE_ALIAS_IFE_META(metan) MODULE_ALIAS("ifemeta" __stringify_1(metan))
46
47int ife_get_meta_u32(struct sk_buff *skb, struct tcf_meta_info *mi);
48int ife_get_meta_u16(struct sk_buff *skb, struct tcf_meta_info *mi);
49int ife_tlv_meta_encode(void *skbdata, u16 attrtype, u16 dlen,
50 const void *dval);
51int ife_alloc_meta_u32(struct tcf_meta_info *mi, void *metaval);
52int ife_alloc_meta_u16(struct tcf_meta_info *mi, void *metaval);
53int ife_check_meta_u32(u32 metaval, struct tcf_meta_info *mi);
54int ife_encode_meta_u32(u32 metaval, void *skbdata, struct tcf_meta_info *mi);
55int ife_validate_meta_u32(void *val, int len);
56int ife_validate_meta_u16(void *val, int len);
57void ife_release_meta_gen(struct tcf_meta_info *mi);
58int register_ife_op(struct tcf_meta_ops *mops);
59int unregister_ife_op(struct tcf_meta_ops *mops);
60
61#endif /* __NET_TC_IFE_H */
diff --git a/include/net/tc_act/tc_skbedit.h b/include/net/tc_act/tc_skbedit.h
index 0df9a0db4a8e..b496d5ad7d42 100644
--- a/include/net/tc_act/tc_skbedit.h
+++ b/include/net/tc_act/tc_skbedit.h
@@ -20,6 +20,7 @@
20#define __NET_TC_SKBEDIT_H 20#define __NET_TC_SKBEDIT_H
21 21
22#include <net/act_api.h> 22#include <net/act_api.h>
23#include <linux/tc_act/tc_skbedit.h>
23 24
24struct tcf_skbedit { 25struct tcf_skbedit {
25 struct tcf_common common; 26 struct tcf_common common;
@@ -32,4 +33,19 @@ struct tcf_skbedit {
32#define to_skbedit(a) \ 33#define to_skbedit(a) \
33 container_of(a->priv, struct tcf_skbedit, common) 34 container_of(a->priv, struct tcf_skbedit, common)
34 35
36/* Return true iff action is mark */
37static inline bool is_tcf_skbedit_mark(const struct tc_action *a)
38{
39#ifdef CONFIG_NET_CLS_ACT
40 if (a->ops && a->ops->type == TCA_ACT_SKBEDIT)
41 return to_skbedit(a)->flags == SKBEDIT_F_MARK;
42#endif
43 return false;
44}
45
46static inline u32 tcf_skbedit_mark(const struct tc_action *a)
47{
48 return to_skbedit(a)->mark;
49}
50
35#endif /* __NET_TC_SKBEDIT_H */ 51#endif /* __NET_TC_SKBEDIT_H */
diff --git a/include/net/tcp.h b/include/net/tcp.h
index b04bc989ad6c..b91370f61be6 100644
--- a/include/net/tcp.h
+++ b/include/net/tcp.h
@@ -238,13 +238,6 @@ extern struct inet_timewait_death_row tcp_death_row;
238extern int sysctl_tcp_timestamps; 238extern int sysctl_tcp_timestamps;
239extern int sysctl_tcp_window_scaling; 239extern int sysctl_tcp_window_scaling;
240extern int sysctl_tcp_sack; 240extern int sysctl_tcp_sack;
241extern int sysctl_tcp_fin_timeout;
242extern int sysctl_tcp_syn_retries;
243extern int sysctl_tcp_synack_retries;
244extern int sysctl_tcp_retries1;
245extern int sysctl_tcp_retries2;
246extern int sysctl_tcp_orphan_retries;
247extern int sysctl_tcp_syncookies;
248extern int sysctl_tcp_fastopen; 241extern int sysctl_tcp_fastopen;
249extern int sysctl_tcp_retrans_collapse; 242extern int sysctl_tcp_retrans_collapse;
250extern int sysctl_tcp_stdurg; 243extern int sysctl_tcp_stdurg;
@@ -273,7 +266,6 @@ extern int sysctl_tcp_thin_dupack;
273extern int sysctl_tcp_early_retrans; 266extern int sysctl_tcp_early_retrans;
274extern int sysctl_tcp_limit_output_bytes; 267extern int sysctl_tcp_limit_output_bytes;
275extern int sysctl_tcp_challenge_ack_limit; 268extern int sysctl_tcp_challenge_ack_limit;
276extern unsigned int sysctl_tcp_notsent_lowat;
277extern int sysctl_tcp_min_tso_segs; 269extern int sysctl_tcp_min_tso_segs;
278extern int sysctl_tcp_min_rtt_wlen; 270extern int sysctl_tcp_min_rtt_wlen;
279extern int sysctl_tcp_autocorking; 271extern int sysctl_tcp_autocorking;
@@ -567,6 +559,7 @@ void tcp_rearm_rto(struct sock *sk);
567void tcp_synack_rtt_meas(struct sock *sk, struct request_sock *req); 559void tcp_synack_rtt_meas(struct sock *sk, struct request_sock *req);
568void tcp_reset(struct sock *sk); 560void tcp_reset(struct sock *sk);
569void tcp_skb_mark_lost_uncond_verify(struct tcp_sock *tp, struct sk_buff *skb); 561void tcp_skb_mark_lost_uncond_verify(struct tcp_sock *tp, struct sk_buff *skb);
562void tcp_fin(struct sock *sk);
570 563
571/* tcp_timer.c */ 564/* tcp_timer.c */
572void tcp_init_xmit_timers(struct sock *); 565void tcp_init_xmit_timers(struct sock *);
@@ -962,9 +955,11 @@ static inline void tcp_enable_fack(struct tcp_sock *tp)
962 */ 955 */
963static inline void tcp_enable_early_retrans(struct tcp_sock *tp) 956static inline void tcp_enable_early_retrans(struct tcp_sock *tp)
964{ 957{
958 struct net *net = sock_net((struct sock *)tp);
959
965 tp->do_early_retrans = sysctl_tcp_early_retrans && 960 tp->do_early_retrans = sysctl_tcp_early_retrans &&
966 sysctl_tcp_early_retrans < 4 && !sysctl_tcp_thin_dupack && 961 sysctl_tcp_early_retrans < 4 && !sysctl_tcp_thin_dupack &&
967 sysctl_tcp_reordering == 3; 962 net->ipv4.sysctl_tcp_reordering == 3;
968} 963}
969 964
970static inline void tcp_disable_early_retrans(struct tcp_sock *tp) 965static inline void tcp_disable_early_retrans(struct tcp_sock *tp)
@@ -1251,7 +1246,7 @@ static inline u32 keepalive_time_elapsed(const struct tcp_sock *tp)
1251 1246
1252static inline int tcp_fin_time(const struct sock *sk) 1247static inline int tcp_fin_time(const struct sock *sk)
1253{ 1248{
1254 int fin_timeout = tcp_sk(sk)->linger2 ? : sysctl_tcp_fin_timeout; 1249 int fin_timeout = tcp_sk(sk)->linger2 ? : sock_net(sk)->ipv4.sysctl_tcp_fin_timeout;
1255 const int rto = inet_csk(sk)->icsk_rto; 1250 const int rto = inet_csk(sk)->icsk_rto;
1256 1251
1257 if (fin_timeout < (rto << 2) - (rto >> 1)) 1252 if (fin_timeout < (rto << 2) - (rto >> 1))
@@ -1433,6 +1428,7 @@ void tcp_free_fastopen_req(struct tcp_sock *tp);
1433 1428
1434extern struct tcp_fastopen_context __rcu *tcp_fastopen_ctx; 1429extern struct tcp_fastopen_context __rcu *tcp_fastopen_ctx;
1435int tcp_fastopen_reset_cipher(void *key, unsigned int len); 1430int tcp_fastopen_reset_cipher(void *key, unsigned int len);
1431void tcp_fastopen_add_skb(struct sock *sk, struct sk_buff *skb);
1436struct sock *tcp_try_fastopen(struct sock *sk, struct sk_buff *skb, 1432struct sock *tcp_try_fastopen(struct sock *sk, struct sk_buff *skb,
1437 struct request_sock *req, 1433 struct request_sock *req,
1438 struct tcp_fastopen_cookie *foc, 1434 struct tcp_fastopen_cookie *foc,
@@ -1681,7 +1677,8 @@ void __tcp_v4_send_check(struct sk_buff *skb, __be32 saddr, __be32 daddr);
1681 1677
1682static inline u32 tcp_notsent_lowat(const struct tcp_sock *tp) 1678static inline u32 tcp_notsent_lowat(const struct tcp_sock *tp)
1683{ 1679{
1684 return tp->notsent_lowat ?: sysctl_tcp_notsent_lowat; 1680 struct net *net = sock_net((struct sock *)tp);
1681 return tp->notsent_lowat ?: net->ipv4.sysctl_tcp_notsent_lowat;
1685} 1682}
1686 1683
1687static inline bool tcp_stream_memory_free(const struct sock *sk) 1684static inline bool tcp_stream_memory_free(const struct sock *sk)
@@ -1815,4 +1812,38 @@ static inline void skb_set_tcp_pure_ack(struct sk_buff *skb)
1815 skb->truesize = 2; 1812 skb->truesize = 2;
1816} 1813}
1817 1814
1815static inline int tcp_inq(struct sock *sk)
1816{
1817 struct tcp_sock *tp = tcp_sk(sk);
1818 int answ;
1819
1820 if ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV)) {
1821 answ = 0;
1822 } else if (sock_flag(sk, SOCK_URGINLINE) ||
1823 !tp->urg_data ||
1824 before(tp->urg_seq, tp->copied_seq) ||
1825 !before(tp->urg_seq, tp->rcv_nxt)) {
1826
1827 answ = tp->rcv_nxt - tp->copied_seq;
1828
1829 /* Subtract 1, if FIN was received */
1830 if (answ && sock_flag(sk, SOCK_DONE))
1831 answ--;
1832 } else {
1833 answ = tp->urg_seq - tp->copied_seq;
1834 }
1835
1836 return answ;
1837}
1838
1839static inline void tcp_segs_in(struct tcp_sock *tp, const struct sk_buff *skb)
1840{
1841 u16 segs_in;
1842
1843 segs_in = max_t(u16, 1, skb_shinfo(skb)->gso_segs);
1844 tp->segs_in += segs_in;
1845 if (skb->len > tcp_hdrlen(skb))
1846 tp->data_segs_in += segs_in;
1847}
1848
1818#endif /* _TCP_H */ 1849#endif /* _TCP_H */
diff --git a/include/net/udp.h b/include/net/udp.h
index 2842541e28e7..92927f729ac8 100644
--- a/include/net/udp.h
+++ b/include/net/udp.h
@@ -177,9 +177,10 @@ static inline struct udphdr *udp_gro_udphdr(struct sk_buff *skb)
177} 177}
178 178
179/* hash routines shared between UDPv4/6 and UDP-Litev4/6 */ 179/* hash routines shared between UDPv4/6 and UDP-Litev4/6 */
180static inline void udp_lib_hash(struct sock *sk) 180static inline int udp_lib_hash(struct sock *sk)
181{ 181{
182 BUG(); 182 BUG();
183 return 0;
183} 184}
184 185
185void udp_lib_unhash(struct sock *sk); 186void udp_lib_unhash(struct sock *sk);
diff --git a/include/net/udp_tunnel.h b/include/net/udp_tunnel.h
index cca2ad3082c3..b83114077cee 100644
--- a/include/net/udp_tunnel.h
+++ b/include/net/udp_tunnel.h
@@ -88,8 +88,8 @@ int udp_tunnel6_xmit_skb(struct dst_entry *dst, struct sock *sk,
88 struct sk_buff *skb, 88 struct sk_buff *skb,
89 struct net_device *dev, struct in6_addr *saddr, 89 struct net_device *dev, struct in6_addr *saddr,
90 struct in6_addr *daddr, 90 struct in6_addr *daddr,
91 __u8 prio, __u8 ttl, __be16 src_port, 91 __u8 prio, __u8 ttl, __be32 label,
92 __be16 dst_port, bool nocheck); 92 __be16 src_port, __be16 dst_port, bool nocheck);
93#endif 93#endif
94 94
95void udp_tunnel_sock_release(struct socket *sock); 95void udp_tunnel_sock_release(struct socket *sock);
@@ -103,7 +103,7 @@ static inline struct sk_buff *udp_tunnel_handle_offloads(struct sk_buff *skb,
103{ 103{
104 int type = udp_csum ? SKB_GSO_UDP_TUNNEL_CSUM : SKB_GSO_UDP_TUNNEL; 104 int type = udp_csum ? SKB_GSO_UDP_TUNNEL_CSUM : SKB_GSO_UDP_TUNNEL;
105 105
106 return iptunnel_handle_offloads(skb, udp_csum, type); 106 return iptunnel_handle_offloads(skb, type);
107} 107}
108 108
109static inline void udp_tunnel_gro_complete(struct sk_buff *skb, int nhoff) 109static inline void udp_tunnel_gro_complete(struct sk_buff *skb, int nhoff)
diff --git a/include/net/vxlan.h b/include/net/vxlan.h
index 0fb86442544b..a763c96ecde4 100644
--- a/include/net/vxlan.h
+++ b/include/net/vxlan.h
@@ -9,17 +9,71 @@
9#include <linux/udp.h> 9#include <linux/udp.h>
10#include <net/dst_metadata.h> 10#include <net/dst_metadata.h>
11 11
12/* VXLAN protocol (RFC 7348) header:
13 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
14 * |R|R|R|R|I|R|R|R| Reserved |
15 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
16 * | VXLAN Network Identifier (VNI) | Reserved |
17 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
18 *
19 * I = VXLAN Network Identifier (VNI) present.
20 */
21struct vxlanhdr {
22 __be32 vx_flags;
23 __be32 vx_vni;
24};
25
26/* VXLAN header flags. */
27#define VXLAN_HF_VNI cpu_to_be32(BIT(27))
28
29#define VXLAN_N_VID (1u << 24)
30#define VXLAN_VID_MASK (VXLAN_N_VID - 1)
31#define VXLAN_VNI_MASK cpu_to_be32(VXLAN_VID_MASK << 8)
32#define VXLAN_HLEN (sizeof(struct udphdr) + sizeof(struct vxlanhdr))
33
12#define VNI_HASH_BITS 10 34#define VNI_HASH_BITS 10
13#define VNI_HASH_SIZE (1<<VNI_HASH_BITS) 35#define VNI_HASH_SIZE (1<<VNI_HASH_BITS)
36#define FDB_HASH_BITS 8
37#define FDB_HASH_SIZE (1<<FDB_HASH_BITS)
38
39/* Remote checksum offload for VXLAN (VXLAN_F_REMCSUM_[RT]X):
40 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
41 * |R|R|R|R|I|R|R|R|R|R|C| Reserved |
42 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
43 * | VXLAN Network Identifier (VNI) |O| Csum start |
44 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
45 *
46 * C = Remote checksum offload bit. When set indicates that the
47 * remote checksum offload data is present.
48 *
49 * O = Offset bit. Indicates the checksum offset relative to
50 * checksum start.
51 *
52 * Csum start = Checksum start divided by two.
53 *
54 * http://tools.ietf.org/html/draft-herbert-vxlan-rco
55 */
56
57/* VXLAN-RCO header flags. */
58#define VXLAN_HF_RCO cpu_to_be32(BIT(21))
59
60/* Remote checksum offload header option */
61#define VXLAN_RCO_MASK cpu_to_be32(0x7f) /* Last byte of vni field */
62#define VXLAN_RCO_UDP cpu_to_be32(0x80) /* Indicate UDP RCO (TCP when not set *) */
63#define VXLAN_RCO_SHIFT 1 /* Left shift of start */
64#define VXLAN_RCO_SHIFT_MASK ((1 << VXLAN_RCO_SHIFT) - 1)
65#define VXLAN_MAX_REMCSUM_START (0x7f << VXLAN_RCO_SHIFT)
14 66
15/* 67/*
16 * VXLAN Group Based Policy Extension: 68 * VXLAN Group Based Policy Extension (VXLAN_F_GBP):
17 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 69 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
18 * |1|-|-|-|1|-|-|-|R|D|R|R|A|R|R|R| Group Policy ID | 70 * |G|R|R|R|I|R|R|R|R|D|R|R|A|R|R|R| Group Policy ID |
19 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 71 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
20 * | VXLAN Network Identifier (VNI) | Reserved | 72 * | VXLAN Network Identifier (VNI) | Reserved |
21 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 73 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
22 * 74 *
75 * G = Group Policy ID present.
76 *
23 * D = Don't Learn bit. When set, this bit indicates that the egress 77 * D = Don't Learn bit. When set, this bit indicates that the egress
24 * VTEP MUST NOT learn the source address of the encapsulated frame. 78 * VTEP MUST NOT learn the source address of the encapsulated frame.
25 * 79 *
@@ -27,18 +81,18 @@
27 * this packet. Policies MUST NOT be applied by devices when the 81 * this packet. Policies MUST NOT be applied by devices when the
28 * A bit is set. 82 * A bit is set.
29 * 83 *
30 * [0] https://tools.ietf.org/html/draft-smith-vxlan-group-policy 84 * https://tools.ietf.org/html/draft-smith-vxlan-group-policy
31 */ 85 */
32struct vxlanhdr_gbp { 86struct vxlanhdr_gbp {
33 __u8 vx_flags; 87 u8 vx_flags;
34#ifdef __LITTLE_ENDIAN_BITFIELD 88#ifdef __LITTLE_ENDIAN_BITFIELD
35 __u8 reserved_flags1:3, 89 u8 reserved_flags1:3,
36 policy_applied:1, 90 policy_applied:1,
37 reserved_flags2:2, 91 reserved_flags2:2,
38 dont_learn:1, 92 dont_learn:1,
39 reserved_flags3:1; 93 reserved_flags3:1;
40#elif defined(__BIG_ENDIAN_BITFIELD) 94#elif defined(__BIG_ENDIAN_BITFIELD)
41 __u8 reserved_flags1:1, 95 u8 reserved_flags1:1,
42 dont_learn:1, 96 dont_learn:1,
43 reserved_flags2:2, 97 reserved_flags2:2,
44 policy_applied:1, 98 policy_applied:1,
@@ -50,7 +104,10 @@ struct vxlanhdr_gbp {
50 __be32 vx_vni; 104 __be32 vx_vni;
51}; 105};
52 106
53#define VXLAN_GBP_USED_BITS (VXLAN_HF_GBP | 0xFFFFFF) 107/* VXLAN-GBP header flags. */
108#define VXLAN_HF_GBP cpu_to_be32(BIT(31))
109
110#define VXLAN_GBP_USED_BITS (VXLAN_HF_GBP | cpu_to_be32(0xFFFFFF))
54 111
55/* skb->mark mapping 112/* skb->mark mapping
56 * 113 *
@@ -62,44 +119,6 @@ struct vxlanhdr_gbp {
62#define VXLAN_GBP_POLICY_APPLIED (BIT(3) << 16) 119#define VXLAN_GBP_POLICY_APPLIED (BIT(3) << 16)
63#define VXLAN_GBP_ID_MASK (0xFFFF) 120#define VXLAN_GBP_ID_MASK (0xFFFF)
64 121
65/* VXLAN protocol header:
66 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
67 * |G|R|R|R|I|R|R|C| Reserved |
68 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
69 * | VXLAN Network Identifier (VNI) | Reserved |
70 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
71 *
72 * G = 1 Group Policy (VXLAN-GBP)
73 * I = 1 VXLAN Network Identifier (VNI) present
74 * C = 1 Remote checksum offload (RCO)
75 */
76struct vxlanhdr {
77 __be32 vx_flags;
78 __be32 vx_vni;
79};
80
81/* VXLAN header flags. */
82#define VXLAN_HF_RCO BIT(21)
83#define VXLAN_HF_VNI BIT(27)
84#define VXLAN_HF_GBP BIT(31)
85
86/* Remote checksum offload header option */
87#define VXLAN_RCO_MASK 0x7f /* Last byte of vni field */
88#define VXLAN_RCO_UDP 0x80 /* Indicate UDP RCO (TCP when not set *) */
89#define VXLAN_RCO_SHIFT 1 /* Left shift of start */
90#define VXLAN_RCO_SHIFT_MASK ((1 << VXLAN_RCO_SHIFT) - 1)
91#define VXLAN_MAX_REMCSUM_START (VXLAN_RCO_MASK << VXLAN_RCO_SHIFT)
92
93#define VXLAN_N_VID (1u << 24)
94#define VXLAN_VID_MASK (VXLAN_N_VID - 1)
95#define VXLAN_VNI_MASK (VXLAN_VID_MASK << 8)
96#define VXLAN_HLEN (sizeof(struct udphdr) + sizeof(struct vxlanhdr))
97
98#define VNI_HASH_BITS 10
99#define VNI_HASH_SIZE (1<<VNI_HASH_BITS)
100#define FDB_HASH_BITS 8
101#define FDB_HASH_SIZE (1<<FDB_HASH_BITS)
102
103struct vxlan_metadata { 122struct vxlan_metadata {
104 u32 gbp; 123 u32 gbp;
105}; 124};
@@ -125,23 +144,25 @@ union vxlan_addr {
125struct vxlan_rdst { 144struct vxlan_rdst {
126 union vxlan_addr remote_ip; 145 union vxlan_addr remote_ip;
127 __be16 remote_port; 146 __be16 remote_port;
128 u32 remote_vni; 147 __be32 remote_vni;
129 u32 remote_ifindex; 148 u32 remote_ifindex;
130 struct list_head list; 149 struct list_head list;
131 struct rcu_head rcu; 150 struct rcu_head rcu;
151 struct dst_cache dst_cache;
132}; 152};
133 153
134struct vxlan_config { 154struct vxlan_config {
135 union vxlan_addr remote_ip; 155 union vxlan_addr remote_ip;
136 union vxlan_addr saddr; 156 union vxlan_addr saddr;
137 u32 vni; 157 __be32 vni;
138 int remote_ifindex; 158 int remote_ifindex;
139 int mtu; 159 int mtu;
140 __be16 dst_port; 160 __be16 dst_port;
141 __u16 port_min; 161 u16 port_min;
142 __u16 port_max; 162 u16 port_max;
143 __u8 tos; 163 u8 tos;
144 __u8 ttl; 164 u8 ttl;
165 __be32 label;
145 u32 flags; 166 u32 flags;
146 unsigned long age_interval; 167 unsigned long age_interval;
147 unsigned int addrmax; 168 unsigned int addrmax;
@@ -177,7 +198,7 @@ struct vxlan_dev {
177#define VXLAN_F_L2MISS 0x08 198#define VXLAN_F_L2MISS 0x08
178#define VXLAN_F_L3MISS 0x10 199#define VXLAN_F_L3MISS 0x10
179#define VXLAN_F_IPV6 0x20 200#define VXLAN_F_IPV6 0x20
180#define VXLAN_F_UDP_CSUM 0x40 201#define VXLAN_F_UDP_ZERO_CSUM_TX 0x40
181#define VXLAN_F_UDP_ZERO_CSUM6_TX 0x80 202#define VXLAN_F_UDP_ZERO_CSUM6_TX 0x80
182#define VXLAN_F_UDP_ZERO_CSUM6_RX 0x100 203#define VXLAN_F_UDP_ZERO_CSUM6_RX 0x100
183#define VXLAN_F_REMCSUM_TX 0x200 204#define VXLAN_F_REMCSUM_TX 0x200
@@ -242,6 +263,68 @@ static inline netdev_features_t vxlan_features_check(struct sk_buff *skb,
242/* IPv6 header + UDP + VXLAN + Ethernet header */ 263/* IPv6 header + UDP + VXLAN + Ethernet header */
243#define VXLAN6_HEADROOM (40 + 8 + 8 + 14) 264#define VXLAN6_HEADROOM (40 + 8 + 8 + 14)
244 265
266static inline struct vxlanhdr *vxlan_hdr(struct sk_buff *skb)
267{
268 return (struct vxlanhdr *)(udp_hdr(skb) + 1);
269}
270
271static inline __be32 vxlan_vni(__be32 vni_field)
272{
273#if defined(__BIG_ENDIAN)
274 return vni_field >> 8;
275#else
276 return (vni_field & VXLAN_VNI_MASK) << 8;
277#endif
278}
279
280static inline __be32 vxlan_vni_field(__be32 vni)
281{
282#if defined(__BIG_ENDIAN)
283 return vni << 8;
284#else
285 return vni >> 8;
286#endif
287}
288
289static inline __be32 vxlan_tun_id_to_vni(__be64 tun_id)
290{
291#if defined(__BIG_ENDIAN)
292 return tun_id;
293#else
294 return tun_id >> 32;
295#endif
296}
297
298static inline __be64 vxlan_vni_to_tun_id(__be32 vni)
299{
300#if defined(__BIG_ENDIAN)
301 return (__be64)vni;
302#else
303 return (__be64)vni << 32;
304#endif
305}
306
307static inline size_t vxlan_rco_start(__be32 vni_field)
308{
309 return be32_to_cpu(vni_field & VXLAN_RCO_MASK) << VXLAN_RCO_SHIFT;
310}
311
312static inline size_t vxlan_rco_offset(__be32 vni_field)
313{
314 return (vni_field & VXLAN_RCO_UDP) ?
315 offsetof(struct udphdr, check) :
316 offsetof(struct tcphdr, check);
317}
318
319static inline __be32 vxlan_compute_rco(unsigned int start, unsigned int offset)
320{
321 __be32 vni_field = cpu_to_be32(start >> VXLAN_RCO_SHIFT);
322
323 if (offset == offsetof(struct udphdr, check))
324 vni_field |= VXLAN_RCO_UDP;
325 return vni_field;
326}
327
245#if IS_ENABLED(CONFIG_VXLAN) 328#if IS_ENABLED(CONFIG_VXLAN)
246void vxlan_get_rx_port(struct net_device *netdev); 329void vxlan_get_rx_port(struct net_device *netdev);
247#else 330#else