diff options
Diffstat (limited to 'include/net')
49 files changed, 1216 insertions, 350 deletions
diff --git a/include/net/addrconf.h b/include/net/addrconf.h index d13573bb879e..80456f72d70a 100644 --- a/include/net/addrconf.h +++ b/include/net/addrconf.h | |||
@@ -62,6 +62,9 @@ int addrconf_set_dstaddr(struct net *net, void __user *arg); | |||
62 | 62 | ||
63 | int ipv6_chk_addr(struct net *net, const struct in6_addr *addr, | 63 | int ipv6_chk_addr(struct net *net, const struct in6_addr *addr, |
64 | const struct net_device *dev, int strict); | 64 | const struct net_device *dev, int strict); |
65 | int ipv6_chk_addr_and_flags(struct net *net, const struct in6_addr *addr, | ||
66 | const struct net_device *dev, int strict, | ||
67 | u32 banned_flags); | ||
65 | 68 | ||
66 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) | 69 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) |
67 | int ipv6_chk_home_addr(struct net *net, const struct in6_addr *addr); | 70 | int ipv6_chk_home_addr(struct net *net, const struct in6_addr *addr); |
diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h index 58695ffeb138..e00455aab18c 100644 --- a/include/net/bluetooth/bluetooth.h +++ b/include/net/bluetooth/bluetooth.h | |||
@@ -273,7 +273,7 @@ struct l2cap_ctrl { | |||
273 | 273 | ||
274 | struct hci_dev; | 274 | struct hci_dev; |
275 | 275 | ||
276 | typedef void (*hci_req_complete_t)(struct hci_dev *hdev, u8 status); | 276 | typedef void (*hci_req_complete_t)(struct hci_dev *hdev, u8 status, u16 opcode); |
277 | 277 | ||
278 | struct hci_req_ctrl { | 278 | struct hci_req_ctrl { |
279 | bool start; | 279 | bool start; |
diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h index 40129b3838b2..8e54f825153c 100644 --- a/include/net/bluetooth/hci.h +++ b/include/net/bluetooth/hci.h | |||
@@ -102,6 +102,28 @@ enum { | |||
102 | */ | 102 | */ |
103 | HCI_QUIRK_FIXUP_BUFFER_SIZE, | 103 | HCI_QUIRK_FIXUP_BUFFER_SIZE, |
104 | 104 | ||
105 | /* When this quirk is set, then a controller that does not | ||
106 | * indicate support for Inquiry Result with RSSI is assumed to | ||
107 | * support it anyway. Some early Bluetooth 1.2 controllers had | ||
108 | * wrongly configured local features that will require forcing | ||
109 | * them to enable this mode. Getting RSSI information with the | ||
110 | * inquiry responses is preferred since it allows for a better | ||
111 | * user expierence. | ||
112 | * | ||
113 | * This quirk must be set before hci_register_dev is called. | ||
114 | */ | ||
115 | HCI_QUIRK_FIXUP_INQUIRY_MODE, | ||
116 | |||
117 | /* When this quirk is set, then the HCI Read Local Supported | ||
118 | * Commands command is not supported. In general Bluetooth 1.2 | ||
119 | * and later controllers should support this command. However | ||
120 | * some controllers indicate Bluetooth 1.2 support, but do | ||
121 | * not support this command. | ||
122 | * | ||
123 | * This quirk must be set before hci_register_dev is called. | ||
124 | */ | ||
125 | HCI_QUIRK_BROKEN_LOCAL_COMMANDS, | ||
126 | |||
105 | /* When this quirk is set, then no stored link key handling | 127 | /* When this quirk is set, then no stored link key handling |
106 | * is performed. This is mainly due to the fact that the | 128 | * is performed. This is mainly due to the fact that the |
107 | * HCI Delete Stored Link Key command is advertised, but | 129 | * HCI Delete Stored Link Key command is advertised, but |
@@ -162,8 +184,7 @@ enum { | |||
162 | */ | 184 | */ |
163 | enum { | 185 | enum { |
164 | HCI_DUT_MODE, | 186 | HCI_DUT_MODE, |
165 | HCI_FORCE_SC, | 187 | HCI_FORCE_BREDR_SMP, |
166 | HCI_FORCE_LESC, | ||
167 | HCI_FORCE_STATIC_ADDR, | 188 | HCI_FORCE_STATIC_ADDR, |
168 | }; | 189 | }; |
169 | 190 | ||
@@ -343,6 +364,7 @@ enum { | |||
343 | #define HCI_LE_ENCRYPTION 0x01 | 364 | #define HCI_LE_ENCRYPTION 0x01 |
344 | #define HCI_LE_CONN_PARAM_REQ_PROC 0x02 | 365 | #define HCI_LE_CONN_PARAM_REQ_PROC 0x02 |
345 | #define HCI_LE_PING 0x10 | 366 | #define HCI_LE_PING 0x10 |
367 | #define HCI_LE_DATA_LEN_EXT 0x20 | ||
346 | #define HCI_LE_EXT_SCAN_POLICY 0x80 | 368 | #define HCI_LE_EXT_SCAN_POLICY 0x80 |
347 | 369 | ||
348 | /* Connection modes */ | 370 | /* Connection modes */ |
@@ -833,11 +855,26 @@ struct hci_cp_set_event_flt { | |||
833 | #define HCI_CONN_SETUP_AUTO_OFF 0x01 | 855 | #define HCI_CONN_SETUP_AUTO_OFF 0x01 |
834 | #define HCI_CONN_SETUP_AUTO_ON 0x02 | 856 | #define HCI_CONN_SETUP_AUTO_ON 0x02 |
835 | 857 | ||
858 | #define HCI_OP_READ_STORED_LINK_KEY 0x0c0d | ||
859 | struct hci_cp_read_stored_link_key { | ||
860 | bdaddr_t bdaddr; | ||
861 | __u8 read_all; | ||
862 | } __packed; | ||
863 | struct hci_rp_read_stored_link_key { | ||
864 | __u8 status; | ||
865 | __u8 max_keys; | ||
866 | __u8 num_keys; | ||
867 | } __packed; | ||
868 | |||
836 | #define HCI_OP_DELETE_STORED_LINK_KEY 0x0c12 | 869 | #define HCI_OP_DELETE_STORED_LINK_KEY 0x0c12 |
837 | struct hci_cp_delete_stored_link_key { | 870 | struct hci_cp_delete_stored_link_key { |
838 | bdaddr_t bdaddr; | 871 | bdaddr_t bdaddr; |
839 | __u8 delete_all; | 872 | __u8 delete_all; |
840 | } __packed; | 873 | } __packed; |
874 | struct hci_rp_delete_stored_link_key { | ||
875 | __u8 status; | ||
876 | __u8 num_keys; | ||
877 | } __packed; | ||
841 | 878 | ||
842 | #define HCI_MAX_NAME_LENGTH 248 | 879 | #define HCI_MAX_NAME_LENGTH 248 |
843 | 880 | ||
@@ -1371,6 +1408,39 @@ struct hci_cp_le_conn_param_req_neg_reply { | |||
1371 | __u8 reason; | 1408 | __u8 reason; |
1372 | } __packed; | 1409 | } __packed; |
1373 | 1410 | ||
1411 | #define HCI_OP_LE_SET_DATA_LEN 0x2022 | ||
1412 | struct hci_cp_le_set_data_len { | ||
1413 | __le16 handle; | ||
1414 | __le16 tx_len; | ||
1415 | __le16 tx_time; | ||
1416 | } __packed; | ||
1417 | struct hci_rp_le_set_data_len { | ||
1418 | __u8 status; | ||
1419 | __le16 handle; | ||
1420 | } __packed; | ||
1421 | |||
1422 | #define HCI_OP_LE_READ_DEF_DATA_LEN 0x2023 | ||
1423 | struct hci_rp_le_read_def_data_len { | ||
1424 | __u8 status; | ||
1425 | __le16 tx_len; | ||
1426 | __le16 tx_time; | ||
1427 | } __packed; | ||
1428 | |||
1429 | #define HCI_OP_LE_WRITE_DEF_DATA_LEN 0x2024 | ||
1430 | struct hci_cp_le_write_def_data_len { | ||
1431 | __le16 tx_len; | ||
1432 | __le16 tx_time; | ||
1433 | } __packed; | ||
1434 | |||
1435 | #define HCI_OP_LE_READ_MAX_DATA_LEN 0x202f | ||
1436 | struct hci_rp_le_read_max_data_len { | ||
1437 | __u8 status; | ||
1438 | __le16 tx_len; | ||
1439 | __le16 tx_time; | ||
1440 | __le16 rx_len; | ||
1441 | __le16 rx_time; | ||
1442 | } __packed; | ||
1443 | |||
1374 | /* ---- HCI Events ---- */ | 1444 | /* ---- HCI Events ---- */ |
1375 | #define HCI_EV_INQUIRY_COMPLETE 0x01 | 1445 | #define HCI_EV_INQUIRY_COMPLETE 0x01 |
1376 | 1446 | ||
@@ -1796,6 +1866,15 @@ struct hci_ev_le_remote_conn_param_req { | |||
1796 | __le16 timeout; | 1866 | __le16 timeout; |
1797 | } __packed; | 1867 | } __packed; |
1798 | 1868 | ||
1869 | #define HCI_EV_LE_DATA_LEN_CHANGE 0x07 | ||
1870 | struct hci_ev_le_data_len_change { | ||
1871 | __le16 handle; | ||
1872 | __le16 tx_len; | ||
1873 | __le16 tx_time; | ||
1874 | __le16 rx_len; | ||
1875 | __le16 rx_time; | ||
1876 | } __packed; | ||
1877 | |||
1799 | #define HCI_EV_LE_DIRECT_ADV_REPORT 0x0B | 1878 | #define HCI_EV_LE_DIRECT_ADV_REPORT 0x0B |
1800 | struct hci_ev_le_direct_adv_info { | 1879 | struct hci_ev_le_direct_adv_info { |
1801 | __u8 evt_type; | 1880 | __u8 evt_type; |
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index 3c7827005c25..52863c3e0b13 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h | |||
@@ -79,6 +79,8 @@ struct discovery_state { | |||
79 | s8 rssi; | 79 | s8 rssi; |
80 | u16 uuid_count; | 80 | u16 uuid_count; |
81 | u8 (*uuids)[16]; | 81 | u8 (*uuids)[16]; |
82 | unsigned long scan_start; | ||
83 | unsigned long scan_duration; | ||
82 | }; | 84 | }; |
83 | 85 | ||
84 | struct hci_conn_hash { | 86 | struct hci_conn_hash { |
@@ -145,6 +147,7 @@ struct oob_data { | |||
145 | struct list_head list; | 147 | struct list_head list; |
146 | bdaddr_t bdaddr; | 148 | bdaddr_t bdaddr; |
147 | u8 bdaddr_type; | 149 | u8 bdaddr_type; |
150 | u8 present; | ||
148 | u8 hash192[16]; | 151 | u8 hash192[16]; |
149 | u8 rand192[16]; | 152 | u8 rand192[16]; |
150 | u8 hash256[16]; | 153 | u8 hash256[16]; |
@@ -205,6 +208,8 @@ struct hci_dev { | |||
205 | __u16 lmp_subver; | 208 | __u16 lmp_subver; |
206 | __u16 voice_setting; | 209 | __u16 voice_setting; |
207 | __u8 num_iac; | 210 | __u8 num_iac; |
211 | __u8 stored_max_keys; | ||
212 | __u8 stored_num_keys; | ||
208 | __u8 io_capability; | 213 | __u8 io_capability; |
209 | __s8 inq_tx_power; | 214 | __s8 inq_tx_power; |
210 | __u16 page_scan_interval; | 215 | __u16 page_scan_interval; |
@@ -220,10 +225,17 @@ struct hci_dev { | |||
220 | __u16 le_conn_max_interval; | 225 | __u16 le_conn_max_interval; |
221 | __u16 le_conn_latency; | 226 | __u16 le_conn_latency; |
222 | __u16 le_supv_timeout; | 227 | __u16 le_supv_timeout; |
228 | __u16 le_def_tx_len; | ||
229 | __u16 le_def_tx_time; | ||
230 | __u16 le_max_tx_len; | ||
231 | __u16 le_max_tx_time; | ||
232 | __u16 le_max_rx_len; | ||
233 | __u16 le_max_rx_time; | ||
223 | __u16 discov_interleaved_timeout; | 234 | __u16 discov_interleaved_timeout; |
224 | __u16 conn_info_min_age; | 235 | __u16 conn_info_min_age; |
225 | __u16 conn_info_max_age; | 236 | __u16 conn_info_max_age; |
226 | __u8 ssp_debug_mode; | 237 | __u8 ssp_debug_mode; |
238 | __u8 hw_error_code; | ||
227 | __u32 clock; | 239 | __u32 clock; |
228 | 240 | ||
229 | __u16 devid_source; | 241 | __u16 devid_source; |
@@ -285,6 +297,7 @@ struct hci_dev { | |||
285 | 297 | ||
286 | struct work_struct power_on; | 298 | struct work_struct power_on; |
287 | struct delayed_work power_off; | 299 | struct delayed_work power_off; |
300 | struct work_struct error_reset; | ||
288 | 301 | ||
289 | __u16 discov_timeout; | 302 | __u16 discov_timeout; |
290 | struct delayed_work discov_off; | 303 | struct delayed_work discov_off; |
@@ -343,6 +356,7 @@ struct hci_dev { | |||
343 | unsigned long dev_flags; | 356 | unsigned long dev_flags; |
344 | 357 | ||
345 | struct delayed_work le_scan_disable; | 358 | struct delayed_work le_scan_disable; |
359 | struct delayed_work le_scan_restart; | ||
346 | 360 | ||
347 | __s8 adv_tx_power; | 361 | __s8 adv_tx_power; |
348 | __u8 adv_data[HCI_MAX_AD_LENGTH]; | 362 | __u8 adv_data[HCI_MAX_AD_LENGTH]; |
@@ -361,6 +375,7 @@ struct hci_dev { | |||
361 | int (*setup)(struct hci_dev *hdev); | 375 | int (*setup)(struct hci_dev *hdev); |
362 | int (*send)(struct hci_dev *hdev, struct sk_buff *skb); | 376 | int (*send)(struct hci_dev *hdev, struct sk_buff *skb); |
363 | void (*notify)(struct hci_dev *hdev, unsigned int evt); | 377 | void (*notify)(struct hci_dev *hdev, unsigned int evt); |
378 | void (*hw_error)(struct hci_dev *hdev, u8 code); | ||
364 | int (*set_bdaddr)(struct hci_dev *hdev, const bdaddr_t *bdaddr); | 379 | int (*set_bdaddr)(struct hci_dev *hdev, const bdaddr_t *bdaddr); |
365 | }; | 380 | }; |
366 | 381 | ||
@@ -434,6 +449,7 @@ struct hci_conn { | |||
434 | struct delayed_work le_conn_timeout; | 449 | struct delayed_work le_conn_timeout; |
435 | 450 | ||
436 | struct device dev; | 451 | struct device dev; |
452 | struct dentry *debugfs; | ||
437 | 453 | ||
438 | struct hci_dev *hdev; | 454 | struct hci_dev *hdev; |
439 | void *l2cap_data; | 455 | void *l2cap_data; |
@@ -518,6 +534,8 @@ static inline void hci_discovery_filter_clear(struct hci_dev *hdev) | |||
518 | hdev->discovery.uuid_count = 0; | 534 | hdev->discovery.uuid_count = 0; |
519 | kfree(hdev->discovery.uuids); | 535 | kfree(hdev->discovery.uuids); |
520 | hdev->discovery.uuids = NULL; | 536 | hdev->discovery.uuids = NULL; |
537 | hdev->discovery.scan_start = 0; | ||
538 | hdev->discovery.scan_duration = 0; | ||
521 | } | 539 | } |
522 | 540 | ||
523 | bool hci_discovery_active(struct hci_dev *hdev); | 541 | bool hci_discovery_active(struct hci_dev *hdev); |
@@ -772,7 +790,6 @@ int hci_conn_check_link_mode(struct hci_conn *conn); | |||
772 | int hci_conn_check_secure(struct hci_conn *conn, __u8 sec_level); | 790 | int hci_conn_check_secure(struct hci_conn *conn, __u8 sec_level); |
773 | int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type, | 791 | int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type, |
774 | bool initiator); | 792 | bool initiator); |
775 | int hci_conn_change_link_key(struct hci_conn *conn); | ||
776 | int hci_conn_switch_role(struct hci_conn *conn, __u8 role); | 793 | int hci_conn_switch_role(struct hci_conn *conn, __u8 role); |
777 | 794 | ||
778 | void hci_conn_enter_active_mode(struct hci_conn *conn, __u8 force_active); | 795 | void hci_conn_enter_active_mode(struct hci_conn *conn, __u8 force_active); |
@@ -920,8 +937,6 @@ struct hci_conn_params *hci_conn_params_lookup(struct hci_dev *hdev, | |||
920 | bdaddr_t *addr, u8 addr_type); | 937 | bdaddr_t *addr, u8 addr_type); |
921 | struct hci_conn_params *hci_conn_params_add(struct hci_dev *hdev, | 938 | struct hci_conn_params *hci_conn_params_add(struct hci_dev *hdev, |
922 | bdaddr_t *addr, u8 addr_type); | 939 | bdaddr_t *addr, u8 addr_type); |
923 | int hci_conn_params_set(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type, | ||
924 | u8 auto_connect); | ||
925 | void hci_conn_params_del(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type); | 940 | void hci_conn_params_del(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type); |
926 | void hci_conn_params_clear_all(struct hci_dev *hdev); | 941 | void hci_conn_params_clear_all(struct hci_dev *hdev); |
927 | void hci_conn_params_clear_disabled(struct hci_dev *hdev); | 942 | void hci_conn_params_clear_disabled(struct hci_dev *hdev); |
@@ -930,8 +945,6 @@ struct hci_conn_params *hci_pend_le_action_lookup(struct list_head *list, | |||
930 | bdaddr_t *addr, | 945 | bdaddr_t *addr, |
931 | u8 addr_type); | 946 | u8 addr_type); |
932 | 947 | ||
933 | void hci_update_background_scan(struct hci_dev *hdev); | ||
934 | |||
935 | void hci_uuids_clear(struct hci_dev *hdev); | 948 | void hci_uuids_clear(struct hci_dev *hdev); |
936 | 949 | ||
937 | void hci_link_keys_clear(struct hci_dev *hdev); | 950 | void hci_link_keys_clear(struct hci_dev *hdev); |
@@ -1014,8 +1027,7 @@ void hci_conn_del_sysfs(struct hci_conn *conn); | |||
1014 | 1027 | ||
1015 | #define hdev_is_powered(hdev) (test_bit(HCI_UP, &hdev->flags) && \ | 1028 | #define hdev_is_powered(hdev) (test_bit(HCI_UP, &hdev->flags) && \ |
1016 | !test_bit(HCI_AUTO_OFF, &hdev->dev_flags)) | 1029 | !test_bit(HCI_AUTO_OFF, &hdev->dev_flags)) |
1017 | #define bredr_sc_enabled(dev) ((lmp_sc_capable(dev) || \ | 1030 | #define bredr_sc_enabled(dev) (lmp_sc_capable(dev) && \ |
1018 | test_bit(HCI_FORCE_SC, &(dev)->dbg_flags)) && \ | ||
1019 | test_bit(HCI_SC_ENABLED, &(dev)->dev_flags)) | 1031 | test_bit(HCI_SC_ENABLED, &(dev)->dev_flags)) |
1020 | 1032 | ||
1021 | /* ----- HCI protocols ----- */ | 1033 | /* ----- HCI protocols ----- */ |
@@ -1284,30 +1296,8 @@ static inline int hci_check_conn_params(u16 min, u16 max, u16 latency, | |||
1284 | int hci_register_cb(struct hci_cb *hcb); | 1296 | int hci_register_cb(struct hci_cb *hcb); |
1285 | int hci_unregister_cb(struct hci_cb *hcb); | 1297 | int hci_unregister_cb(struct hci_cb *hcb); |
1286 | 1298 | ||
1287 | struct hci_request { | ||
1288 | struct hci_dev *hdev; | ||
1289 | struct sk_buff_head cmd_q; | ||
1290 | |||
1291 | /* If something goes wrong when building the HCI request, the error | ||
1292 | * value is stored in this field. | ||
1293 | */ | ||
1294 | int err; | ||
1295 | }; | ||
1296 | |||
1297 | void hci_req_init(struct hci_request *req, struct hci_dev *hdev); | ||
1298 | int hci_req_run(struct hci_request *req, hci_req_complete_t complete); | ||
1299 | void hci_req_add(struct hci_request *req, u16 opcode, u32 plen, | ||
1300 | const void *param); | ||
1301 | void hci_req_add_ev(struct hci_request *req, u16 opcode, u32 plen, | ||
1302 | const void *param, u8 event); | ||
1303 | void hci_req_cmd_complete(struct hci_dev *hdev, u16 opcode, u8 status); | ||
1304 | bool hci_req_pending(struct hci_dev *hdev); | 1299 | bool hci_req_pending(struct hci_dev *hdev); |
1305 | 1300 | ||
1306 | void hci_req_add_le_scan_disable(struct hci_request *req); | ||
1307 | void hci_req_add_le_passive_scan(struct hci_request *req); | ||
1308 | |||
1309 | void hci_update_page_scan(struct hci_dev *hdev, struct hci_request *req); | ||
1310 | |||
1311 | struct sk_buff *__hci_cmd_sync(struct hci_dev *hdev, u16 opcode, u32 plen, | 1301 | struct sk_buff *__hci_cmd_sync(struct hci_dev *hdev, u16 opcode, u32 plen, |
1312 | const void *param, u32 timeout); | 1302 | const void *param, u32 timeout); |
1313 | struct sk_buff *__hci_cmd_sync_ev(struct hci_dev *hdev, u16 opcode, u32 plen, | 1303 | struct sk_buff *__hci_cmd_sync_ev(struct hci_dev *hdev, u16 opcode, u32 plen, |
@@ -1344,6 +1334,7 @@ void hci_sock_dev_event(struct hci_dev *hdev, int event); | |||
1344 | #define DISCOV_INTERLEAVED_TIMEOUT 5120 /* msec */ | 1334 | #define DISCOV_INTERLEAVED_TIMEOUT 5120 /* msec */ |
1345 | #define DISCOV_INTERLEAVED_INQUIRY_LEN 0x04 | 1335 | #define DISCOV_INTERLEAVED_INQUIRY_LEN 0x04 |
1346 | #define DISCOV_BREDR_INQUIRY_LEN 0x08 | 1336 | #define DISCOV_BREDR_INQUIRY_LEN 0x08 |
1337 | #define DISCOV_LE_RESTART_DELAY msecs_to_jiffies(200) /* msec */ | ||
1347 | 1338 | ||
1348 | int mgmt_control(struct sock *sk, struct msghdr *msg, size_t len); | 1339 | int mgmt_control(struct sock *sk, struct msghdr *msg, size_t len); |
1349 | int mgmt_new_settings(struct hci_dev *hdev); | 1340 | int mgmt_new_settings(struct hci_dev *hdev); |
@@ -1388,7 +1379,6 @@ int mgmt_user_passkey_notify(struct hci_dev *hdev, bdaddr_t *bdaddr, | |||
1388 | void mgmt_auth_failed(struct hci_conn *conn, u8 status); | 1379 | void mgmt_auth_failed(struct hci_conn *conn, u8 status); |
1389 | void mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status); | 1380 | void mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status); |
1390 | void mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status); | 1381 | void mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status); |
1391 | void mgmt_sc_enable_complete(struct hci_dev *hdev, u8 enable, u8 status); | ||
1392 | void mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class, | 1382 | void mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class, |
1393 | u8 status); | 1383 | u8 status); |
1394 | void mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status); | 1384 | void mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status); |
@@ -1417,8 +1407,6 @@ u8 hci_le_conn_update(struct hci_conn *conn, u16 min, u16 max, u16 latency, | |||
1417 | void hci_le_start_enc(struct hci_conn *conn, __le16 ediv, __le64 rand, | 1407 | void hci_le_start_enc(struct hci_conn *conn, __le16 ediv, __le64 rand, |
1418 | __u8 ltk[16]); | 1408 | __u8 ltk[16]); |
1419 | 1409 | ||
1420 | int hci_update_random_address(struct hci_request *req, bool require_privacy, | ||
1421 | u8 *own_addr_type); | ||
1422 | void hci_copy_identity_address(struct hci_dev *hdev, bdaddr_t *bdaddr, | 1410 | void hci_copy_identity_address(struct hci_dev *hdev, bdaddr_t *bdaddr, |
1423 | u8 *bdaddr_type); | 1411 | u8 *bdaddr_type); |
1424 | 1412 | ||
diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h index d1bb342d083f..2239a3753092 100644 --- a/include/net/bluetooth/l2cap.h +++ b/include/net/bluetooth/l2cap.h | |||
@@ -248,6 +248,7 @@ struct l2cap_conn_rsp { | |||
248 | #define L2CAP_PSM_SDP 0x0001 | 248 | #define L2CAP_PSM_SDP 0x0001 |
249 | #define L2CAP_PSM_RFCOMM 0x0003 | 249 | #define L2CAP_PSM_RFCOMM 0x0003 |
250 | #define L2CAP_PSM_3DSP 0x0021 | 250 | #define L2CAP_PSM_3DSP 0x0021 |
251 | #define L2CAP_PSM_IPSP 0x0023 /* 6LoWPAN */ | ||
251 | 252 | ||
252 | /* channel identifier */ | 253 | /* channel identifier */ |
253 | #define L2CAP_CID_SIGNALING 0x0001 | 254 | #define L2CAP_CID_SIGNALING 0x0001 |
diff --git a/include/net/bluetooth/mgmt.h b/include/net/bluetooth/mgmt.h index 95c34d5180fa..e218a30f2061 100644 --- a/include/net/bluetooth/mgmt.h +++ b/include/net/bluetooth/mgmt.h | |||
@@ -301,10 +301,6 @@ struct mgmt_cp_user_passkey_neg_reply { | |||
301 | #define MGMT_OP_READ_LOCAL_OOB_DATA 0x0020 | 301 | #define MGMT_OP_READ_LOCAL_OOB_DATA 0x0020 |
302 | #define MGMT_READ_LOCAL_OOB_DATA_SIZE 0 | 302 | #define MGMT_READ_LOCAL_OOB_DATA_SIZE 0 |
303 | struct mgmt_rp_read_local_oob_data { | 303 | struct mgmt_rp_read_local_oob_data { |
304 | __u8 hash[16]; | ||
305 | __u8 rand[16]; | ||
306 | } __packed; | ||
307 | struct mgmt_rp_read_local_oob_ext_data { | ||
308 | __u8 hash192[16]; | 304 | __u8 hash192[16]; |
309 | __u8 rand192[16]; | 305 | __u8 rand192[16]; |
310 | __u8 hash256[16]; | 306 | __u8 hash256[16]; |
diff --git a/include/net/bluetooth/rfcomm.h b/include/net/bluetooth/rfcomm.h index 578b83127af1..4190af53a46a 100644 --- a/include/net/bluetooth/rfcomm.h +++ b/include/net/bluetooth/rfcomm.h | |||
@@ -24,8 +24,6 @@ | |||
24 | #ifndef __RFCOMM_H | 24 | #ifndef __RFCOMM_H |
25 | #define __RFCOMM_H | 25 | #define __RFCOMM_H |
26 | 26 | ||
27 | #define RFCOMM_PSM 3 | ||
28 | |||
29 | #define RFCOMM_CONN_TIMEOUT (HZ * 30) | 27 | #define RFCOMM_CONN_TIMEOUT (HZ * 30) |
30 | #define RFCOMM_DISC_TIMEOUT (HZ * 20) | 28 | #define RFCOMM_DISC_TIMEOUT (HZ * 20) |
31 | #define RFCOMM_AUTH_TIMEOUT (HZ * 25) | 29 | #define RFCOMM_AUTH_TIMEOUT (HZ * 25) |
diff --git a/include/net/bond_3ad.h b/include/net/bond_3ad.h index e01d903633ef..f04cdbb7848e 100644 --- a/include/net/bond_3ad.h +++ b/include/net/bond_3ad.h | |||
@@ -274,7 +274,6 @@ void bond_3ad_handle_link_change(struct slave *slave, char link); | |||
274 | int bond_3ad_get_active_agg_info(struct bonding *bond, struct ad_info *ad_info); | 274 | int bond_3ad_get_active_agg_info(struct bonding *bond, struct ad_info *ad_info); |
275 | int __bond_3ad_get_active_agg_info(struct bonding *bond, | 275 | int __bond_3ad_get_active_agg_info(struct bonding *bond, |
276 | struct ad_info *ad_info); | 276 | struct ad_info *ad_info); |
277 | int bond_3ad_xmit_xor(struct sk_buff *skb, struct net_device *dev); | ||
278 | int bond_3ad_lacpdu_recv(const struct sk_buff *skb, struct bonding *bond, | 277 | int bond_3ad_lacpdu_recv(const struct sk_buff *skb, struct bonding *bond, |
279 | struct slave *slave); | 278 | struct slave *slave); |
280 | int bond_3ad_set_carrier(struct bonding *bond); | 279 | int bond_3ad_set_carrier(struct bonding *bond); |
diff --git a/include/net/bonding.h b/include/net/bonding.h index 983a94b86b95..fda6feeb6c1f 100644 --- a/include/net/bonding.h +++ b/include/net/bonding.h | |||
@@ -150,6 +150,12 @@ struct bond_parm_tbl { | |||
150 | int mode; | 150 | int mode; |
151 | }; | 151 | }; |
152 | 152 | ||
153 | struct netdev_notify_work { | ||
154 | struct delayed_work work; | ||
155 | struct net_device *dev; | ||
156 | struct netdev_bonding_info bonding_info; | ||
157 | }; | ||
158 | |||
153 | struct slave { | 159 | struct slave { |
154 | struct net_device *dev; /* first - useful for panic debug */ | 160 | struct net_device *dev; /* first - useful for panic debug */ |
155 | struct bonding *bond; /* our master */ | 161 | struct bonding *bond; /* our master */ |
@@ -243,6 +249,8 @@ struct bonding { | |||
243 | #define bond_slave_get_rtnl(dev) \ | 249 | #define bond_slave_get_rtnl(dev) \ |
244 | ((struct slave *) rtnl_dereference(dev->rx_handler_data)) | 250 | ((struct slave *) rtnl_dereference(dev->rx_handler_data)) |
245 | 251 | ||
252 | void bond_queue_slave_event(struct slave *slave); | ||
253 | |||
246 | struct bond_vlan_tag { | 254 | struct bond_vlan_tag { |
247 | __be16 vlan_proto; | 255 | __be16 vlan_proto; |
248 | unsigned short vlan_id; | 256 | unsigned short vlan_id; |
@@ -315,6 +323,7 @@ static inline void bond_set_active_slave(struct slave *slave) | |||
315 | { | 323 | { |
316 | if (slave->backup) { | 324 | if (slave->backup) { |
317 | slave->backup = 0; | 325 | slave->backup = 0; |
326 | bond_queue_slave_event(slave); | ||
318 | rtmsg_ifinfo(RTM_NEWLINK, slave->dev, 0, GFP_ATOMIC); | 327 | rtmsg_ifinfo(RTM_NEWLINK, slave->dev, 0, GFP_ATOMIC); |
319 | } | 328 | } |
320 | } | 329 | } |
@@ -323,6 +332,7 @@ static inline void bond_set_backup_slave(struct slave *slave) | |||
323 | { | 332 | { |
324 | if (!slave->backup) { | 333 | if (!slave->backup) { |
325 | slave->backup = 1; | 334 | slave->backup = 1; |
335 | bond_queue_slave_event(slave); | ||
326 | rtmsg_ifinfo(RTM_NEWLINK, slave->dev, 0, GFP_ATOMIC); | 336 | rtmsg_ifinfo(RTM_NEWLINK, slave->dev, 0, GFP_ATOMIC); |
327 | } | 337 | } |
328 | } | 338 | } |
@@ -336,6 +346,7 @@ static inline void bond_set_slave_state(struct slave *slave, | |||
336 | slave->backup = slave_state; | 346 | slave->backup = slave_state; |
337 | if (notify) { | 347 | if (notify) { |
338 | rtmsg_ifinfo(RTM_NEWLINK, slave->dev, 0, GFP_ATOMIC); | 348 | rtmsg_ifinfo(RTM_NEWLINK, slave->dev, 0, GFP_ATOMIC); |
349 | bond_queue_slave_event(slave); | ||
339 | slave->should_notify = 0; | 350 | slave->should_notify = 0; |
340 | } else { | 351 | } else { |
341 | if (slave->should_notify) | 352 | if (slave->should_notify) |
@@ -490,6 +501,12 @@ static inline bool bond_is_slave_inactive(struct slave *slave) | |||
490 | return slave->inactive; | 501 | return slave->inactive; |
491 | } | 502 | } |
492 | 503 | ||
504 | static inline void bond_set_slave_link_state(struct slave *slave, int state) | ||
505 | { | ||
506 | slave->link = state; | ||
507 | bond_queue_slave_event(slave); | ||
508 | } | ||
509 | |||
493 | static inline __be32 bond_confirm_addr(struct net_device *dev, __be32 dst, __be32 local) | 510 | static inline __be32 bond_confirm_addr(struct net_device *dev, __be32 dst, __be32 local) |
494 | { | 511 | { |
495 | struct in_device *in_dev; | 512 | struct in_device *in_dev; |
@@ -525,6 +542,7 @@ void bond_sysfs_slave_del(struct slave *slave); | |||
525 | int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev); | 542 | int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev); |
526 | int bond_release(struct net_device *bond_dev, struct net_device *slave_dev); | 543 | int bond_release(struct net_device *bond_dev, struct net_device *slave_dev); |
527 | u32 bond_xmit_hash(struct bonding *bond, struct sk_buff *skb); | 544 | u32 bond_xmit_hash(struct bonding *bond, struct sk_buff *skb); |
545 | int bond_set_carrier(struct bonding *bond); | ||
528 | void bond_select_active_slave(struct bonding *bond); | 546 | void bond_select_active_slave(struct bonding *bond); |
529 | void bond_change_active_slave(struct bonding *bond, struct slave *new_active); | 547 | void bond_change_active_slave(struct bonding *bond, struct slave *new_active); |
530 | void bond_create_debugfs(void); | 548 | void bond_create_debugfs(void); |
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index 4ebb816241fa..64e09e1e8099 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h | |||
@@ -520,37 +520,41 @@ ieee80211_chandef_max_power(struct cfg80211_chan_def *chandef) | |||
520 | * | 520 | * |
521 | * @SURVEY_INFO_NOISE_DBM: noise (in dBm) was filled in | 521 | * @SURVEY_INFO_NOISE_DBM: noise (in dBm) was filled in |
522 | * @SURVEY_INFO_IN_USE: channel is currently being used | 522 | * @SURVEY_INFO_IN_USE: channel is currently being used |
523 | * @SURVEY_INFO_CHANNEL_TIME: channel active time (in ms) was filled in | 523 | * @SURVEY_INFO_TIME: active time (in ms) was filled in |
524 | * @SURVEY_INFO_CHANNEL_TIME_BUSY: channel busy time was filled in | 524 | * @SURVEY_INFO_TIME_BUSY: busy time was filled in |
525 | * @SURVEY_INFO_CHANNEL_TIME_EXT_BUSY: extension channel busy time was filled in | 525 | * @SURVEY_INFO_TIME_EXT_BUSY: extension channel busy time was filled in |
526 | * @SURVEY_INFO_CHANNEL_TIME_RX: channel receive time was filled in | 526 | * @SURVEY_INFO_TIME_RX: receive time was filled in |
527 | * @SURVEY_INFO_CHANNEL_TIME_TX: channel transmit time was filled in | 527 | * @SURVEY_INFO_TIME_TX: transmit time was filled in |
528 | * @SURVEY_INFO_TIME_SCAN: scan time was filled in | ||
528 | * | 529 | * |
529 | * Used by the driver to indicate which info in &struct survey_info | 530 | * Used by the driver to indicate which info in &struct survey_info |
530 | * it has filled in during the get_survey(). | 531 | * it has filled in during the get_survey(). |
531 | */ | 532 | */ |
532 | enum survey_info_flags { | 533 | enum survey_info_flags { |
533 | SURVEY_INFO_NOISE_DBM = 1<<0, | 534 | SURVEY_INFO_NOISE_DBM = BIT(0), |
534 | SURVEY_INFO_IN_USE = 1<<1, | 535 | SURVEY_INFO_IN_USE = BIT(1), |
535 | SURVEY_INFO_CHANNEL_TIME = 1<<2, | 536 | SURVEY_INFO_TIME = BIT(2), |
536 | SURVEY_INFO_CHANNEL_TIME_BUSY = 1<<3, | 537 | SURVEY_INFO_TIME_BUSY = BIT(3), |
537 | SURVEY_INFO_CHANNEL_TIME_EXT_BUSY = 1<<4, | 538 | SURVEY_INFO_TIME_EXT_BUSY = BIT(4), |
538 | SURVEY_INFO_CHANNEL_TIME_RX = 1<<5, | 539 | SURVEY_INFO_TIME_RX = BIT(5), |
539 | SURVEY_INFO_CHANNEL_TIME_TX = 1<<6, | 540 | SURVEY_INFO_TIME_TX = BIT(6), |
541 | SURVEY_INFO_TIME_SCAN = BIT(7), | ||
540 | }; | 542 | }; |
541 | 543 | ||
542 | /** | 544 | /** |
543 | * struct survey_info - channel survey response | 545 | * struct survey_info - channel survey response |
544 | * | 546 | * |
545 | * @channel: the channel this survey record reports, mandatory | 547 | * @channel: the channel this survey record reports, may be %NULL for a single |
548 | * record to report global statistics | ||
546 | * @filled: bitflag of flags from &enum survey_info_flags | 549 | * @filled: bitflag of flags from &enum survey_info_flags |
547 | * @noise: channel noise in dBm. This and all following fields are | 550 | * @noise: channel noise in dBm. This and all following fields are |
548 | * optional | 551 | * optional |
549 | * @channel_time: amount of time in ms the radio spent on the channel | 552 | * @time: amount of time in ms the radio was turn on (on the channel) |
550 | * @channel_time_busy: amount of time the primary channel was sensed busy | 553 | * @time_busy: amount of time the primary channel was sensed busy |
551 | * @channel_time_ext_busy: amount of time the extension channel was sensed busy | 554 | * @time_ext_busy: amount of time the extension channel was sensed busy |
552 | * @channel_time_rx: amount of time the radio spent receiving data | 555 | * @time_rx: amount of time the radio spent receiving data |
553 | * @channel_time_tx: amount of time the radio spent transmitting data | 556 | * @time_tx: amount of time the radio spent transmitting data |
557 | * @time_scan: amount of time the radio spent for scanning | ||
554 | * | 558 | * |
555 | * Used by dump_survey() to report back per-channel survey information. | 559 | * Used by dump_survey() to report back per-channel survey information. |
556 | * | 560 | * |
@@ -559,11 +563,12 @@ enum survey_info_flags { | |||
559 | */ | 563 | */ |
560 | struct survey_info { | 564 | struct survey_info { |
561 | struct ieee80211_channel *channel; | 565 | struct ieee80211_channel *channel; |
562 | u64 channel_time; | 566 | u64 time; |
563 | u64 channel_time_busy; | 567 | u64 time_busy; |
564 | u64 channel_time_ext_busy; | 568 | u64 time_ext_busy; |
565 | u64 channel_time_rx; | 569 | u64 time_rx; |
566 | u64 channel_time_tx; | 570 | u64 time_tx; |
571 | u64 time_scan; | ||
567 | u32 filled; | 572 | u32 filled; |
568 | s8 noise; | 573 | s8 noise; |
569 | }; | 574 | }; |
@@ -861,75 +866,6 @@ int cfg80211_check_station_change(struct wiphy *wiphy, | |||
861 | enum cfg80211_station_type statype); | 866 | enum cfg80211_station_type statype); |
862 | 867 | ||
863 | /** | 868 | /** |
864 | * enum station_info_flags - station information flags | ||
865 | * | ||
866 | * Used by the driver to indicate which info in &struct station_info | ||
867 | * it has filled in during get_station() or dump_station(). | ||
868 | * | ||
869 | * @STATION_INFO_INACTIVE_TIME: @inactive_time filled | ||
870 | * @STATION_INFO_RX_BYTES: @rx_bytes filled | ||
871 | * @STATION_INFO_TX_BYTES: @tx_bytes filled | ||
872 | * @STATION_INFO_RX_BYTES64: @rx_bytes filled with 64-bit value | ||
873 | * @STATION_INFO_TX_BYTES64: @tx_bytes filled with 64-bit value | ||
874 | * @STATION_INFO_LLID: @llid filled | ||
875 | * @STATION_INFO_PLID: @plid filled | ||
876 | * @STATION_INFO_PLINK_STATE: @plink_state filled | ||
877 | * @STATION_INFO_SIGNAL: @signal filled | ||
878 | * @STATION_INFO_TX_BITRATE: @txrate fields are filled | ||
879 | * (tx_bitrate, tx_bitrate_flags and tx_bitrate_mcs) | ||
880 | * @STATION_INFO_RX_PACKETS: @rx_packets filled with 32-bit value | ||
881 | * @STATION_INFO_TX_PACKETS: @tx_packets filled with 32-bit value | ||
882 | * @STATION_INFO_TX_RETRIES: @tx_retries filled | ||
883 | * @STATION_INFO_TX_FAILED: @tx_failed filled | ||
884 | * @STATION_INFO_RX_DROP_MISC: @rx_dropped_misc filled | ||
885 | * @STATION_INFO_SIGNAL_AVG: @signal_avg filled | ||
886 | * @STATION_INFO_RX_BITRATE: @rxrate fields are filled | ||
887 | * @STATION_INFO_BSS_PARAM: @bss_param filled | ||
888 | * @STATION_INFO_CONNECTED_TIME: @connected_time filled | ||
889 | * @STATION_INFO_ASSOC_REQ_IES: @assoc_req_ies filled | ||
890 | * @STATION_INFO_STA_FLAGS: @sta_flags filled | ||
891 | * @STATION_INFO_BEACON_LOSS_COUNT: @beacon_loss_count filled | ||
892 | * @STATION_INFO_T_OFFSET: @t_offset filled | ||
893 | * @STATION_INFO_LOCAL_PM: @local_pm filled | ||
894 | * @STATION_INFO_PEER_PM: @peer_pm filled | ||
895 | * @STATION_INFO_NONPEER_PM: @nonpeer_pm filled | ||
896 | * @STATION_INFO_CHAIN_SIGNAL: @chain_signal filled | ||
897 | * @STATION_INFO_CHAIN_SIGNAL_AVG: @chain_signal_avg filled | ||
898 | * @STATION_INFO_EXPECTED_THROUGHPUT: @expected_throughput filled | ||
899 | */ | ||
900 | enum station_info_flags { | ||
901 | STATION_INFO_INACTIVE_TIME = BIT(0), | ||
902 | STATION_INFO_RX_BYTES = BIT(1), | ||
903 | STATION_INFO_TX_BYTES = BIT(2), | ||
904 | STATION_INFO_LLID = BIT(3), | ||
905 | STATION_INFO_PLID = BIT(4), | ||
906 | STATION_INFO_PLINK_STATE = BIT(5), | ||
907 | STATION_INFO_SIGNAL = BIT(6), | ||
908 | STATION_INFO_TX_BITRATE = BIT(7), | ||
909 | STATION_INFO_RX_PACKETS = BIT(8), | ||
910 | STATION_INFO_TX_PACKETS = BIT(9), | ||
911 | STATION_INFO_TX_RETRIES = BIT(10), | ||
912 | STATION_INFO_TX_FAILED = BIT(11), | ||
913 | STATION_INFO_RX_DROP_MISC = BIT(12), | ||
914 | STATION_INFO_SIGNAL_AVG = BIT(13), | ||
915 | STATION_INFO_RX_BITRATE = BIT(14), | ||
916 | STATION_INFO_BSS_PARAM = BIT(15), | ||
917 | STATION_INFO_CONNECTED_TIME = BIT(16), | ||
918 | STATION_INFO_ASSOC_REQ_IES = BIT(17), | ||
919 | STATION_INFO_STA_FLAGS = BIT(18), | ||
920 | STATION_INFO_BEACON_LOSS_COUNT = BIT(19), | ||
921 | STATION_INFO_T_OFFSET = BIT(20), | ||
922 | STATION_INFO_LOCAL_PM = BIT(21), | ||
923 | STATION_INFO_PEER_PM = BIT(22), | ||
924 | STATION_INFO_NONPEER_PM = BIT(23), | ||
925 | STATION_INFO_RX_BYTES64 = BIT(24), | ||
926 | STATION_INFO_TX_BYTES64 = BIT(25), | ||
927 | STATION_INFO_CHAIN_SIGNAL = BIT(26), | ||
928 | STATION_INFO_CHAIN_SIGNAL_AVG = BIT(27), | ||
929 | STATION_INFO_EXPECTED_THROUGHPUT = BIT(28), | ||
930 | }; | ||
931 | |||
932 | /** | ||
933 | * enum station_info_rate_flags - bitrate info flags | 869 | * enum station_info_rate_flags - bitrate info flags |
934 | * | 870 | * |
935 | * Used by the driver to indicate the specific rate transmission | 871 | * Used by the driver to indicate the specific rate transmission |
@@ -937,22 +873,35 @@ enum station_info_flags { | |||
937 | * | 873 | * |
938 | * @RATE_INFO_FLAGS_MCS: mcs field filled with HT MCS | 874 | * @RATE_INFO_FLAGS_MCS: mcs field filled with HT MCS |
939 | * @RATE_INFO_FLAGS_VHT_MCS: mcs field filled with VHT MCS | 875 | * @RATE_INFO_FLAGS_VHT_MCS: mcs field filled with VHT MCS |
940 | * @RATE_INFO_FLAGS_40_MHZ_WIDTH: 40 MHz width transmission | ||
941 | * @RATE_INFO_FLAGS_80_MHZ_WIDTH: 80 MHz width transmission | ||
942 | * @RATE_INFO_FLAGS_80P80_MHZ_WIDTH: 80+80 MHz width transmission | ||
943 | * @RATE_INFO_FLAGS_160_MHZ_WIDTH: 160 MHz width transmission | ||
944 | * @RATE_INFO_FLAGS_SHORT_GI: 400ns guard interval | 876 | * @RATE_INFO_FLAGS_SHORT_GI: 400ns guard interval |
945 | * @RATE_INFO_FLAGS_60G: 60GHz MCS | 877 | * @RATE_INFO_FLAGS_60G: 60GHz MCS |
946 | */ | 878 | */ |
947 | enum rate_info_flags { | 879 | enum rate_info_flags { |
948 | RATE_INFO_FLAGS_MCS = BIT(0), | 880 | RATE_INFO_FLAGS_MCS = BIT(0), |
949 | RATE_INFO_FLAGS_VHT_MCS = BIT(1), | 881 | RATE_INFO_FLAGS_VHT_MCS = BIT(1), |
950 | RATE_INFO_FLAGS_40_MHZ_WIDTH = BIT(2), | 882 | RATE_INFO_FLAGS_SHORT_GI = BIT(2), |
951 | RATE_INFO_FLAGS_80_MHZ_WIDTH = BIT(3), | 883 | RATE_INFO_FLAGS_60G = BIT(3), |
952 | RATE_INFO_FLAGS_80P80_MHZ_WIDTH = BIT(4), | 884 | }; |
953 | RATE_INFO_FLAGS_160_MHZ_WIDTH = BIT(5), | 885 | |
954 | RATE_INFO_FLAGS_SHORT_GI = BIT(6), | 886 | /** |
955 | RATE_INFO_FLAGS_60G = BIT(7), | 887 | * enum rate_info_bw - rate bandwidth information |
888 | * | ||
889 | * Used by the driver to indicate the rate bandwidth. | ||
890 | * | ||
891 | * @RATE_INFO_BW_5: 5 MHz bandwidth | ||
892 | * @RATE_INFO_BW_10: 10 MHz bandwidth | ||
893 | * @RATE_INFO_BW_20: 20 MHz bandwidth | ||
894 | * @RATE_INFO_BW_40: 40 MHz bandwidth | ||
895 | * @RATE_INFO_BW_80: 80 MHz bandwidth | ||
896 | * @RATE_INFO_BW_160: 160 MHz bandwidth | ||
897 | */ | ||
898 | enum rate_info_bw { | ||
899 | RATE_INFO_BW_5, | ||
900 | RATE_INFO_BW_10, | ||
901 | RATE_INFO_BW_20, | ||
902 | RATE_INFO_BW_40, | ||
903 | RATE_INFO_BW_80, | ||
904 | RATE_INFO_BW_160, | ||
956 | }; | 905 | }; |
957 | 906 | ||
958 | /** | 907 | /** |
@@ -964,12 +913,14 @@ enum rate_info_flags { | |||
964 | * @mcs: mcs index if struct describes a 802.11n bitrate | 913 | * @mcs: mcs index if struct describes a 802.11n bitrate |
965 | * @legacy: bitrate in 100kbit/s for 802.11abg | 914 | * @legacy: bitrate in 100kbit/s for 802.11abg |
966 | * @nss: number of streams (VHT only) | 915 | * @nss: number of streams (VHT only) |
916 | * @bw: bandwidth (from &enum rate_info_bw) | ||
967 | */ | 917 | */ |
968 | struct rate_info { | 918 | struct rate_info { |
969 | u8 flags; | 919 | u8 flags; |
970 | u8 mcs; | 920 | u8 mcs; |
971 | u16 legacy; | 921 | u16 legacy; |
972 | u8 nss; | 922 | u8 nss; |
923 | u8 bw; | ||
973 | }; | 924 | }; |
974 | 925 | ||
975 | /** | 926 | /** |
@@ -1003,6 +954,24 @@ struct sta_bss_parameters { | |||
1003 | u16 beacon_interval; | 954 | u16 beacon_interval; |
1004 | }; | 955 | }; |
1005 | 956 | ||
957 | /** | ||
958 | * struct cfg80211_tid_stats - per-TID statistics | ||
959 | * @filled: bitmap of flags using the bits of &enum nl80211_tid_stats to | ||
960 | * indicate the relevant values in this struct are filled | ||
961 | * @rx_msdu: number of received MSDUs | ||
962 | * @tx_msdu: number of (attempted) transmitted MSDUs | ||
963 | * @tx_msdu_retries: number of retries (not counting the first) for | ||
964 | * transmitted MSDUs | ||
965 | * @tx_msdu_failed: number of failed transmitted MSDUs | ||
966 | */ | ||
967 | struct cfg80211_tid_stats { | ||
968 | u32 filled; | ||
969 | u64 rx_msdu; | ||
970 | u64 tx_msdu; | ||
971 | u64 tx_msdu_retries; | ||
972 | u64 tx_msdu_failed; | ||
973 | }; | ||
974 | |||
1006 | #define IEEE80211_MAX_CHAINS 4 | 975 | #define IEEE80211_MAX_CHAINS 4 |
1007 | 976 | ||
1008 | /** | 977 | /** |
@@ -1010,11 +979,12 @@ struct sta_bss_parameters { | |||
1010 | * | 979 | * |
1011 | * Station information filled by driver for get_station() and dump_station. | 980 | * Station information filled by driver for get_station() and dump_station. |
1012 | * | 981 | * |
1013 | * @filled: bitflag of flags from &enum station_info_flags | 982 | * @filled: bitflag of flags using the bits of &enum nl80211_sta_info to |
983 | * indicate the relevant values in this struct for them | ||
1014 | * @connected_time: time(in secs) since a station is last connected | 984 | * @connected_time: time(in secs) since a station is last connected |
1015 | * @inactive_time: time since last station activity (tx/rx) in milliseconds | 985 | * @inactive_time: time since last station activity (tx/rx) in milliseconds |
1016 | * @rx_bytes: bytes received from this station | 986 | * @rx_bytes: bytes (size of MPDUs) received from this station |
1017 | * @tx_bytes: bytes transmitted to this station | 987 | * @tx_bytes: bytes (size of MPDUs) transmitted to this station |
1018 | * @llid: mesh local link id | 988 | * @llid: mesh local link id |
1019 | * @plid: mesh peer link id | 989 | * @plid: mesh peer link id |
1020 | * @plink_state: mesh peer link state | 990 | * @plink_state: mesh peer link state |
@@ -1027,10 +997,10 @@ struct sta_bss_parameters { | |||
1027 | * @chain_signal_avg: per-chain signal strength average in dBm | 997 | * @chain_signal_avg: per-chain signal strength average in dBm |
1028 | * @txrate: current unicast bitrate from this station | 998 | * @txrate: current unicast bitrate from this station |
1029 | * @rxrate: current unicast bitrate to this station | 999 | * @rxrate: current unicast bitrate to this station |
1030 | * @rx_packets: packets received from this station | 1000 | * @rx_packets: packets (MSDUs & MMPDUs) received from this station |
1031 | * @tx_packets: packets transmitted to this station | 1001 | * @tx_packets: packets (MSDUs & MMPDUs) transmitted to this station |
1032 | * @tx_retries: cumulative retry counts | 1002 | * @tx_retries: cumulative retry counts (MPDUs) |
1033 | * @tx_failed: number of failed transmissions (retries exceeded, no ACK) | 1003 | * @tx_failed: number of failed transmissions (MPDUs) (retries exceeded, no ACK) |
1034 | * @rx_dropped_misc: Dropped for un-specified reason. | 1004 | * @rx_dropped_misc: Dropped for un-specified reason. |
1035 | * @bss_param: current BSS parameters | 1005 | * @bss_param: current BSS parameters |
1036 | * @generation: generation number for nl80211 dumps. | 1006 | * @generation: generation number for nl80211 dumps. |
@@ -1050,6 +1020,11 @@ struct sta_bss_parameters { | |||
1050 | * @nonpeer_pm: non-peer mesh STA power save mode | 1020 | * @nonpeer_pm: non-peer mesh STA power save mode |
1051 | * @expected_throughput: expected throughput in kbps (including 802.11 headers) | 1021 | * @expected_throughput: expected throughput in kbps (including 802.11 headers) |
1052 | * towards this station. | 1022 | * towards this station. |
1023 | * @rx_beacon: number of beacons received from this peer | ||
1024 | * @rx_beacon_signal_avg: signal strength average (in dBm) for beacons received | ||
1025 | * from this peer | ||
1026 | * @pertid: per-TID statistics, see &struct cfg80211_tid_stats, using the last | ||
1027 | * (IEEE80211_NUM_TIDS) index for MSDUs not encapsulated in QoS-MPDUs. | ||
1053 | */ | 1028 | */ |
1054 | struct station_info { | 1029 | struct station_info { |
1055 | u32 filled; | 1030 | u32 filled; |
@@ -1090,10 +1065,9 @@ struct station_info { | |||
1090 | 1065 | ||
1091 | u32 expected_throughput; | 1066 | u32 expected_throughput; |
1092 | 1067 | ||
1093 | /* | 1068 | u64 rx_beacon; |
1094 | * Note: Add a new enum station_info_flags value for each new field and | 1069 | u8 rx_beacon_signal_avg; |
1095 | * use it to check which fields are initialized. | 1070 | struct cfg80211_tid_stats pertid[IEEE80211_NUM_TIDS + 1]; |
1096 | */ | ||
1097 | }; | 1071 | }; |
1098 | 1072 | ||
1099 | /** | 1073 | /** |
@@ -1516,6 +1490,13 @@ struct cfg80211_match_set { | |||
1516 | * @mac_addr_mask: MAC address mask used with randomisation, bits that | 1490 | * @mac_addr_mask: MAC address mask used with randomisation, bits that |
1517 | * are 0 in the mask should be randomised, bits that are 1 should | 1491 | * are 0 in the mask should be randomised, bits that are 1 should |
1518 | * be taken from the @mac_addr | 1492 | * be taken from the @mac_addr |
1493 | * @rcu_head: RCU callback used to free the struct | ||
1494 | * @owner_nlportid: netlink portid of owner (if this should is a request | ||
1495 | * owned by a particular socket) | ||
1496 | * @delay: delay in seconds to use before starting the first scan | ||
1497 | * cycle. The driver may ignore this parameter and start | ||
1498 | * immediately (or at any other time), if this feature is not | ||
1499 | * supported. | ||
1519 | */ | 1500 | */ |
1520 | struct cfg80211_sched_scan_request { | 1501 | struct cfg80211_sched_scan_request { |
1521 | struct cfg80211_ssid *ssids; | 1502 | struct cfg80211_ssid *ssids; |
@@ -1529,6 +1510,7 @@ struct cfg80211_sched_scan_request { | |||
1529 | struct cfg80211_match_set *match_sets; | 1510 | struct cfg80211_match_set *match_sets; |
1530 | int n_match_sets; | 1511 | int n_match_sets; |
1531 | s32 min_rssi_thold; | 1512 | s32 min_rssi_thold; |
1513 | u32 delay; | ||
1532 | 1514 | ||
1533 | u8 mac_addr[ETH_ALEN] __aligned(2); | 1515 | u8 mac_addr[ETH_ALEN] __aligned(2); |
1534 | u8 mac_addr_mask[ETH_ALEN] __aligned(2); | 1516 | u8 mac_addr_mask[ETH_ALEN] __aligned(2); |
@@ -1537,6 +1519,8 @@ struct cfg80211_sched_scan_request { | |||
1537 | struct wiphy *wiphy; | 1519 | struct wiphy *wiphy; |
1538 | struct net_device *dev; | 1520 | struct net_device *dev; |
1539 | unsigned long scan_start; | 1521 | unsigned long scan_start; |
1522 | struct rcu_head rcu_head; | ||
1523 | u32 owner_nlportid; | ||
1540 | 1524 | ||
1541 | /* keep last */ | 1525 | /* keep last */ |
1542 | struct ieee80211_channel *channels[0]; | 1526 | struct ieee80211_channel *channels[0]; |
@@ -3011,6 +2995,8 @@ struct wiphy_vendor_command { | |||
3011 | * @regulatory_flags: wiphy regulatory flags, see | 2995 | * @regulatory_flags: wiphy regulatory flags, see |
3012 | * &enum ieee80211_regulatory_flags | 2996 | * &enum ieee80211_regulatory_flags |
3013 | * @features: features advertised to nl80211, see &enum nl80211_feature_flags. | 2997 | * @features: features advertised to nl80211, see &enum nl80211_feature_flags. |
2998 | * @ext_features: extended features advertised to nl80211, see | ||
2999 | * &enum nl80211_ext_feature_index. | ||
3014 | * @bss_priv_size: each BSS struct has private data allocated with it, | 3000 | * @bss_priv_size: each BSS struct has private data allocated with it, |
3015 | * this variable determines its size | 3001 | * this variable determines its size |
3016 | * @max_scan_ssids: maximum number of SSIDs the device can scan for in | 3002 | * @max_scan_ssids: maximum number of SSIDs the device can scan for in |
@@ -3120,6 +3106,7 @@ struct wiphy { | |||
3120 | u16 max_acl_mac_addrs; | 3106 | u16 max_acl_mac_addrs; |
3121 | 3107 | ||
3122 | u32 flags, regulatory_flags, features; | 3108 | u32 flags, regulatory_flags, features; |
3109 | u8 ext_features[DIV_ROUND_UP(NUM_NL80211_EXT_FEATURES, 8)]; | ||
3123 | 3110 | ||
3124 | u32 ap_sme_capa; | 3111 | u32 ap_sme_capa; |
3125 | 3112 | ||
@@ -3808,6 +3795,34 @@ const u8 *cfg80211_find_vendor_ie(unsigned int oui, u8 oui_type, | |||
3808 | int regulatory_hint(struct wiphy *wiphy, const char *alpha2); | 3795 | int regulatory_hint(struct wiphy *wiphy, const char *alpha2); |
3809 | 3796 | ||
3810 | /** | 3797 | /** |
3798 | * regulatory_set_wiphy_regd - set regdom info for self managed drivers | ||
3799 | * @wiphy: the wireless device we want to process the regulatory domain on | ||
3800 | * @rd: the regulatory domain informatoin to use for this wiphy | ||
3801 | * | ||
3802 | * Set the regulatory domain information for self-managed wiphys, only they | ||
3803 | * may use this function. See %REGULATORY_WIPHY_SELF_MANAGED for more | ||
3804 | * information. | ||
3805 | * | ||
3806 | * Return: 0 on success. -EINVAL, -EPERM | ||
3807 | */ | ||
3808 | int regulatory_set_wiphy_regd(struct wiphy *wiphy, | ||
3809 | struct ieee80211_regdomain *rd); | ||
3810 | |||
3811 | /** | ||
3812 | * regulatory_set_wiphy_regd_sync_rtnl - set regdom for self-managed drivers | ||
3813 | * @wiphy: the wireless device we want to process the regulatory domain on | ||
3814 | * @rd: the regulatory domain information to use for this wiphy | ||
3815 | * | ||
3816 | * This functions requires the RTNL to be held and applies the new regdomain | ||
3817 | * synchronously to this wiphy. For more details see | ||
3818 | * regulatory_set_wiphy_regd(). | ||
3819 | * | ||
3820 | * Return: 0 on success. -EINVAL, -EPERM | ||
3821 | */ | ||
3822 | int regulatory_set_wiphy_regd_sync_rtnl(struct wiphy *wiphy, | ||
3823 | struct ieee80211_regdomain *rd); | ||
3824 | |||
3825 | /** | ||
3811 | * wiphy_apply_custom_regulatory - apply a custom driver regulatory domain | 3826 | * wiphy_apply_custom_regulatory - apply a custom driver regulatory domain |
3812 | * @wiphy: the wireless device we want to process the regulatory domain on | 3827 | * @wiphy: the wireless device we want to process the regulatory domain on |
3813 | * @regd: the custom regulatory domain to use for this wiphy | 3828 | * @regd: the custom regulatory domain to use for this wiphy |
@@ -4565,13 +4580,27 @@ void cfg80211_new_sta(struct net_device *dev, const u8 *mac_addr, | |||
4565 | struct station_info *sinfo, gfp_t gfp); | 4580 | struct station_info *sinfo, gfp_t gfp); |
4566 | 4581 | ||
4567 | /** | 4582 | /** |
4583 | * cfg80211_del_sta_sinfo - notify userspace about deletion of a station | ||
4584 | * @dev: the netdev | ||
4585 | * @mac_addr: the station's address | ||
4586 | * @sinfo: the station information/statistics | ||
4587 | * @gfp: allocation flags | ||
4588 | */ | ||
4589 | void cfg80211_del_sta_sinfo(struct net_device *dev, const u8 *mac_addr, | ||
4590 | struct station_info *sinfo, gfp_t gfp); | ||
4591 | |||
4592 | /** | ||
4568 | * cfg80211_del_sta - notify userspace about deletion of a station | 4593 | * cfg80211_del_sta - notify userspace about deletion of a station |
4569 | * | 4594 | * |
4570 | * @dev: the netdev | 4595 | * @dev: the netdev |
4571 | * @mac_addr: the station's address | 4596 | * @mac_addr: the station's address |
4572 | * @gfp: allocation flags | 4597 | * @gfp: allocation flags |
4573 | */ | 4598 | */ |
4574 | void cfg80211_del_sta(struct net_device *dev, const u8 *mac_addr, gfp_t gfp); | 4599 | static inline void cfg80211_del_sta(struct net_device *dev, |
4600 | const u8 *mac_addr, gfp_t gfp) | ||
4601 | { | ||
4602 | cfg80211_del_sta_sinfo(dev, mac_addr, NULL, gfp); | ||
4603 | } | ||
4575 | 4604 | ||
4576 | /** | 4605 | /** |
4577 | * cfg80211_conn_failed - connection request failed notification | 4606 | * cfg80211_conn_failed - connection request failed notification |
@@ -5033,6 +5062,42 @@ void cfg80211_stop_iface(struct wiphy *wiphy, struct wireless_dev *wdev, | |||
5033 | */ | 5062 | */ |
5034 | void cfg80211_shutdown_all_interfaces(struct wiphy *wiphy); | 5063 | void cfg80211_shutdown_all_interfaces(struct wiphy *wiphy); |
5035 | 5064 | ||
5065 | /** | ||
5066 | * wiphy_ext_feature_set - set the extended feature flag | ||
5067 | * | ||
5068 | * @wiphy: the wiphy to modify. | ||
5069 | * @ftidx: extended feature bit index. | ||
5070 | * | ||
5071 | * The extended features are flagged in multiple bytes (see | ||
5072 | * &struct wiphy.@ext_features) | ||
5073 | */ | ||
5074 | static inline void wiphy_ext_feature_set(struct wiphy *wiphy, | ||
5075 | enum nl80211_ext_feature_index ftidx) | ||
5076 | { | ||
5077 | u8 *ft_byte; | ||
5078 | |||
5079 | ft_byte = &wiphy->ext_features[ftidx / 8]; | ||
5080 | *ft_byte |= BIT(ftidx % 8); | ||
5081 | } | ||
5082 | |||
5083 | /** | ||
5084 | * wiphy_ext_feature_isset - check the extended feature flag | ||
5085 | * | ||
5086 | * @wiphy: the wiphy to modify. | ||
5087 | * @ftidx: extended feature bit index. | ||
5088 | * | ||
5089 | * The extended features are flagged in multiple bytes (see | ||
5090 | * &struct wiphy.@ext_features) | ||
5091 | */ | ||
5092 | static inline bool | ||
5093 | wiphy_ext_feature_isset(struct wiphy *wiphy, | ||
5094 | enum nl80211_ext_feature_index ftidx) | ||
5095 | { | ||
5096 | u8 ft_byte; | ||
5097 | |||
5098 | ft_byte = wiphy->ext_features[ftidx / 8]; | ||
5099 | return (ft_byte & BIT(ftidx % 8)) != 0; | ||
5100 | } | ||
5036 | 5101 | ||
5037 | /* ethtool helper */ | 5102 | /* ethtool helper */ |
5038 | void cfg80211_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info); | 5103 | void cfg80211_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info); |
diff --git a/include/net/cfg802154.h b/include/net/cfg802154.h index 7f713acfa106..eeda67652766 100644 --- a/include/net/cfg802154.h +++ b/include/net/cfg802154.h | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <net/nl802154.h> | 25 | #include <net/nl802154.h> |
26 | 26 | ||
27 | struct wpan_phy; | 27 | struct wpan_phy; |
28 | struct wpan_phy_cca; | ||
28 | 29 | ||
29 | struct cfg802154_ops { | 30 | struct cfg802154_ops { |
30 | struct net_device * (*add_virtual_intf_deprecated)(struct wpan_phy *wpan_phy, | 31 | struct net_device * (*add_virtual_intf_deprecated)(struct wpan_phy *wpan_phy, |
@@ -39,6 +40,8 @@ struct cfg802154_ops { | |||
39 | int (*del_virtual_intf)(struct wpan_phy *wpan_phy, | 40 | int (*del_virtual_intf)(struct wpan_phy *wpan_phy, |
40 | struct wpan_dev *wpan_dev); | 41 | struct wpan_dev *wpan_dev); |
41 | int (*set_channel)(struct wpan_phy *wpan_phy, u8 page, u8 channel); | 42 | int (*set_channel)(struct wpan_phy *wpan_phy, u8 page, u8 channel); |
43 | int (*set_cca_mode)(struct wpan_phy *wpan_phy, | ||
44 | const struct wpan_phy_cca *cca); | ||
42 | int (*set_pan_id)(struct wpan_phy *wpan_phy, | 45 | int (*set_pan_id)(struct wpan_phy *wpan_phy, |
43 | struct wpan_dev *wpan_dev, __le16 pan_id); | 46 | struct wpan_dev *wpan_dev, __le16 pan_id); |
44 | int (*set_short_addr)(struct wpan_phy *wpan_phy, | 47 | int (*set_short_addr)(struct wpan_phy *wpan_phy, |
@@ -56,6 +59,11 @@ struct cfg802154_ops { | |||
56 | struct wpan_dev *wpan_dev, bool mode); | 59 | struct wpan_dev *wpan_dev, bool mode); |
57 | }; | 60 | }; |
58 | 61 | ||
62 | struct wpan_phy_cca { | ||
63 | enum nl802154_cca_modes mode; | ||
64 | enum nl802154_cca_opts opt; | ||
65 | }; | ||
66 | |||
59 | struct wpan_phy { | 67 | struct wpan_phy { |
60 | struct mutex pib_lock; | 68 | struct mutex pib_lock; |
61 | 69 | ||
@@ -76,7 +84,7 @@ struct wpan_phy { | |||
76 | u8 current_page; | 84 | u8 current_page; |
77 | u32 channels_supported[IEEE802154_MAX_PAGE + 1]; | 85 | u32 channels_supported[IEEE802154_MAX_PAGE + 1]; |
78 | s8 transmit_power; | 86 | s8 transmit_power; |
79 | u8 cca_mode; | 87 | struct wpan_phy_cca cca; |
80 | 88 | ||
81 | __le64 perm_extended_addr; | 89 | __le64 perm_extended_addr; |
82 | 90 | ||
diff --git a/include/net/checksum.h b/include/net/checksum.h index e339a9513e29..0a55ac715077 100644 --- a/include/net/checksum.h +++ b/include/net/checksum.h | |||
@@ -167,4 +167,9 @@ static inline __wsum remcsum_adjust(void *ptr, __wsum csum, | |||
167 | return delta; | 167 | return delta; |
168 | } | 168 | } |
169 | 169 | ||
170 | static inline void remcsum_unadjust(__sum16 *psum, __wsum delta) | ||
171 | { | ||
172 | *psum = csum_fold(csum_sub(delta, *psum)); | ||
173 | } | ||
174 | |||
170 | #endif | 175 | #endif |
diff --git a/include/net/cipso_ipv4.h b/include/net/cipso_ipv4.h index a6fd939f202d..3ebb168b9afc 100644 --- a/include/net/cipso_ipv4.h +++ b/include/net/cipso_ipv4.h | |||
@@ -121,13 +121,6 @@ extern int cipso_v4_rbm_strictvalid; | |||
121 | #endif | 121 | #endif |
122 | 122 | ||
123 | /* | 123 | /* |
124 | * Helper Functions | ||
125 | */ | ||
126 | |||
127 | #define CIPSO_V4_OPTEXIST(x) (IPCB(x)->opt.cipso != 0) | ||
128 | #define CIPSO_V4_OPTPTR(x) (skb_network_header(x) + IPCB(x)->opt.cipso) | ||
129 | |||
130 | /* | ||
131 | * DOI List Functions | 124 | * DOI List Functions |
132 | */ | 125 | */ |
133 | 126 | ||
@@ -190,7 +183,7 @@ static inline int cipso_v4_doi_domhsh_remove(struct cipso_v4_doi *doi_def, | |||
190 | 183 | ||
191 | #ifdef CONFIG_NETLABEL | 184 | #ifdef CONFIG_NETLABEL |
192 | void cipso_v4_cache_invalidate(void); | 185 | void cipso_v4_cache_invalidate(void); |
193 | int cipso_v4_cache_add(const struct sk_buff *skb, | 186 | int cipso_v4_cache_add(const unsigned char *cipso_ptr, |
194 | const struct netlbl_lsm_secattr *secattr); | 187 | const struct netlbl_lsm_secattr *secattr); |
195 | #else | 188 | #else |
196 | static inline void cipso_v4_cache_invalidate(void) | 189 | static inline void cipso_v4_cache_invalidate(void) |
@@ -198,7 +191,7 @@ static inline void cipso_v4_cache_invalidate(void) | |||
198 | return; | 191 | return; |
199 | } | 192 | } |
200 | 193 | ||
201 | static inline int cipso_v4_cache_add(const struct sk_buff *skb, | 194 | static inline int cipso_v4_cache_add(const unsigned char *cipso_ptr, |
202 | const struct netlbl_lsm_secattr *secattr) | 195 | const struct netlbl_lsm_secattr *secattr) |
203 | { | 196 | { |
204 | return 0; | 197 | return 0; |
@@ -211,6 +204,8 @@ static inline int cipso_v4_cache_add(const struct sk_buff *skb, | |||
211 | 204 | ||
212 | #ifdef CONFIG_NETLABEL | 205 | #ifdef CONFIG_NETLABEL |
213 | void cipso_v4_error(struct sk_buff *skb, int error, u32 gateway); | 206 | void cipso_v4_error(struct sk_buff *skb, int error, u32 gateway); |
207 | int cipso_v4_getattr(const unsigned char *cipso, | ||
208 | struct netlbl_lsm_secattr *secattr); | ||
214 | int cipso_v4_sock_setattr(struct sock *sk, | 209 | int cipso_v4_sock_setattr(struct sock *sk, |
215 | const struct cipso_v4_doi *doi_def, | 210 | const struct cipso_v4_doi *doi_def, |
216 | const struct netlbl_lsm_secattr *secattr); | 211 | const struct netlbl_lsm_secattr *secattr); |
@@ -226,6 +221,7 @@ int cipso_v4_skbuff_setattr(struct sk_buff *skb, | |||
226 | int cipso_v4_skbuff_delattr(struct sk_buff *skb); | 221 | int cipso_v4_skbuff_delattr(struct sk_buff *skb); |
227 | int cipso_v4_skbuff_getattr(const struct sk_buff *skb, | 222 | int cipso_v4_skbuff_getattr(const struct sk_buff *skb, |
228 | struct netlbl_lsm_secattr *secattr); | 223 | struct netlbl_lsm_secattr *secattr); |
224 | unsigned char *cipso_v4_optptr(const struct sk_buff *skb); | ||
229 | int cipso_v4_validate(const struct sk_buff *skb, unsigned char **option); | 225 | int cipso_v4_validate(const struct sk_buff *skb, unsigned char **option); |
230 | #else | 226 | #else |
231 | static inline void cipso_v4_error(struct sk_buff *skb, | 227 | static inline void cipso_v4_error(struct sk_buff *skb, |
@@ -235,6 +231,12 @@ static inline void cipso_v4_error(struct sk_buff *skb, | |||
235 | return; | 231 | return; |
236 | } | 232 | } |
237 | 233 | ||
234 | static inline int cipso_v4_getattr(const unsigned char *cipso, | ||
235 | struct netlbl_lsm_secattr *secattr) | ||
236 | { | ||
237 | return -ENOSYS; | ||
238 | } | ||
239 | |||
238 | static inline int cipso_v4_sock_setattr(struct sock *sk, | 240 | static inline int cipso_v4_sock_setattr(struct sock *sk, |
239 | const struct cipso_v4_doi *doi_def, | 241 | const struct cipso_v4_doi *doi_def, |
240 | const struct netlbl_lsm_secattr *secattr) | 242 | const struct netlbl_lsm_secattr *secattr) |
@@ -282,6 +284,11 @@ static inline int cipso_v4_skbuff_getattr(const struct sk_buff *skb, | |||
282 | return -ENOSYS; | 284 | return -ENOSYS; |
283 | } | 285 | } |
284 | 286 | ||
287 | static inline unsigned char *cipso_v4_optptr(const struct sk_buff *skb) | ||
288 | { | ||
289 | return NULL; | ||
290 | } | ||
291 | |||
285 | static inline int cipso_v4_validate(const struct sk_buff *skb, | 292 | static inline int cipso_v4_validate(const struct sk_buff *skb, |
286 | unsigned char **option) | 293 | unsigned char **option) |
287 | { | 294 | { |
diff --git a/include/net/genetlink.h b/include/net/genetlink.h index 6c92415311ca..0574abd3db86 100644 --- a/include/net/genetlink.h +++ b/include/net/genetlink.h | |||
@@ -211,6 +211,23 @@ static inline struct nlmsghdr *genlmsg_nlhdr(void *user_hdr, | |||
211 | } | 211 | } |
212 | 212 | ||
213 | /** | 213 | /** |
214 | * genlmsg_parse - parse attributes of a genetlink message | ||
215 | * @nlh: netlink message header | ||
216 | * @family: genetlink message family | ||
217 | * @tb: destination array with maxtype+1 elements | ||
218 | * @maxtype: maximum attribute type to be expected | ||
219 | * @policy: validation policy | ||
220 | * */ | ||
221 | static inline int genlmsg_parse(const struct nlmsghdr *nlh, | ||
222 | const struct genl_family *family, | ||
223 | struct nlattr *tb[], int maxtype, | ||
224 | const struct nla_policy *policy) | ||
225 | { | ||
226 | return nlmsg_parse(nlh, family->hdrsize + GENL_HDRLEN, tb, maxtype, | ||
227 | policy); | ||
228 | } | ||
229 | |||
230 | /** | ||
214 | * genl_dump_check_consistent - check if sequence is consistent and advertise if not | 231 | * genl_dump_check_consistent - check if sequence is consistent and advertise if not |
215 | * @cb: netlink callback structure that stores the sequence number | 232 | * @cb: netlink callback structure that stores the sequence number |
216 | * @user_hdr: user header as returned from genlmsg_put() | 233 | * @user_hdr: user header as returned from genlmsg_put() |
@@ -250,9 +267,9 @@ static inline void *genlmsg_put_reply(struct sk_buff *skb, | |||
250 | * @skb: socket buffer the message is stored in | 267 | * @skb: socket buffer the message is stored in |
251 | * @hdr: user specific header | 268 | * @hdr: user specific header |
252 | */ | 269 | */ |
253 | static inline int genlmsg_end(struct sk_buff *skb, void *hdr) | 270 | static inline void genlmsg_end(struct sk_buff *skb, void *hdr) |
254 | { | 271 | { |
255 | return nlmsg_end(skb, hdr - GENL_HDRLEN - NLMSG_HDRLEN); | 272 | nlmsg_end(skb, hdr - GENL_HDRLEN - NLMSG_HDRLEN); |
256 | } | 273 | } |
257 | 274 | ||
258 | /** | 275 | /** |
diff --git a/include/net/geneve.h b/include/net/geneve.h index 112132cf8e2e..14fb8d3390b4 100644 --- a/include/net/geneve.h +++ b/include/net/geneve.h | |||
@@ -68,13 +68,12 @@ struct geneve_sock; | |||
68 | typedef void (geneve_rcv_t)(struct geneve_sock *gs, struct sk_buff *skb); | 68 | typedef void (geneve_rcv_t)(struct geneve_sock *gs, struct sk_buff *skb); |
69 | 69 | ||
70 | struct geneve_sock { | 70 | struct geneve_sock { |
71 | struct hlist_node hlist; | 71 | struct list_head list; |
72 | geneve_rcv_t *rcv; | 72 | geneve_rcv_t *rcv; |
73 | void *rcv_data; | 73 | void *rcv_data; |
74 | struct work_struct del_work; | ||
75 | struct socket *sock; | 74 | struct socket *sock; |
76 | struct rcu_head rcu; | 75 | struct rcu_head rcu; |
77 | atomic_t refcnt; | 76 | int refcnt; |
78 | struct udp_offload udp_offloads; | 77 | struct udp_offload udp_offloads; |
79 | }; | 78 | }; |
80 | 79 | ||
@@ -91,7 +90,7 @@ int geneve_xmit_skb(struct geneve_sock *gs, struct rtable *rt, | |||
91 | struct sk_buff *skb, __be32 src, __be32 dst, __u8 tos, | 90 | struct sk_buff *skb, __be32 src, __be32 dst, __u8 tos, |
92 | __u8 ttl, __be16 df, __be16 src_port, __be16 dst_port, | 91 | __u8 ttl, __be16 df, __be16 src_port, __be16 dst_port, |
93 | __be16 tun_flags, u8 vni[3], u8 opt_len, u8 *opt, | 92 | __be16 tun_flags, u8 vni[3], u8 opt_len, u8 *opt, |
94 | bool xnet); | 93 | bool csum, bool xnet); |
95 | #endif /*ifdef CONFIG_INET */ | 94 | #endif /*ifdef CONFIG_INET */ |
96 | 95 | ||
97 | #endif /*ifdef__NET_GENEVE_H */ | 96 | #endif /*ifdef__NET_GENEVE_H */ |
diff --git a/include/net/gro_cells.h b/include/net/gro_cells.h index 734d9b5f577a..0f712c0bc0bf 100644 --- a/include/net/gro_cells.h +++ b/include/net/gro_cells.h | |||
@@ -8,25 +8,23 @@ | |||
8 | struct gro_cell { | 8 | struct gro_cell { |
9 | struct sk_buff_head napi_skbs; | 9 | struct sk_buff_head napi_skbs; |
10 | struct napi_struct napi; | 10 | struct napi_struct napi; |
11 | } ____cacheline_aligned_in_smp; | 11 | }; |
12 | 12 | ||
13 | struct gro_cells { | 13 | struct gro_cells { |
14 | unsigned int gro_cells_mask; | 14 | struct gro_cell __percpu *cells; |
15 | struct gro_cell *cells; | ||
16 | }; | 15 | }; |
17 | 16 | ||
18 | static inline void gro_cells_receive(struct gro_cells *gcells, struct sk_buff *skb) | 17 | static inline void gro_cells_receive(struct gro_cells *gcells, struct sk_buff *skb) |
19 | { | 18 | { |
20 | struct gro_cell *cell = gcells->cells; | 19 | struct gro_cell *cell; |
21 | struct net_device *dev = skb->dev; | 20 | struct net_device *dev = skb->dev; |
22 | 21 | ||
23 | if (!cell || skb_cloned(skb) || !(dev->features & NETIF_F_GRO)) { | 22 | if (!gcells->cells || skb_cloned(skb) || !(dev->features & NETIF_F_GRO)) { |
24 | netif_rx(skb); | 23 | netif_rx(skb); |
25 | return; | 24 | return; |
26 | } | 25 | } |
27 | 26 | ||
28 | if (skb_rx_queue_recorded(skb)) | 27 | cell = this_cpu_ptr(gcells->cells); |
29 | cell += skb_get_rx_queue(skb) & gcells->gro_cells_mask; | ||
30 | 28 | ||
31 | if (skb_queue_len(&cell->napi_skbs) > netdev_max_backlog) { | 29 | if (skb_queue_len(&cell->napi_skbs) > netdev_max_backlog) { |
32 | atomic_long_inc(&dev->rx_dropped); | 30 | atomic_long_inc(&dev->rx_dropped); |
@@ -72,15 +70,12 @@ static inline int gro_cells_init(struct gro_cells *gcells, struct net_device *de | |||
72 | { | 70 | { |
73 | int i; | 71 | int i; |
74 | 72 | ||
75 | gcells->gro_cells_mask = roundup_pow_of_two(netif_get_num_default_rss_queues()) - 1; | 73 | gcells->cells = alloc_percpu(struct gro_cell); |
76 | gcells->cells = kcalloc(gcells->gro_cells_mask + 1, | ||
77 | sizeof(struct gro_cell), | ||
78 | GFP_KERNEL); | ||
79 | if (!gcells->cells) | 74 | if (!gcells->cells) |
80 | return -ENOMEM; | 75 | return -ENOMEM; |
81 | 76 | ||
82 | for (i = 0; i <= gcells->gro_cells_mask; i++) { | 77 | for_each_possible_cpu(i) { |
83 | struct gro_cell *cell = gcells->cells + i; | 78 | struct gro_cell *cell = per_cpu_ptr(gcells->cells, i); |
84 | 79 | ||
85 | skb_queue_head_init(&cell->napi_skbs); | 80 | skb_queue_head_init(&cell->napi_skbs); |
86 | netif_napi_add(dev, &cell->napi, gro_cell_poll, 64); | 81 | netif_napi_add(dev, &cell->napi, gro_cell_poll, 64); |
@@ -91,16 +86,16 @@ static inline int gro_cells_init(struct gro_cells *gcells, struct net_device *de | |||
91 | 86 | ||
92 | static inline void gro_cells_destroy(struct gro_cells *gcells) | 87 | static inline void gro_cells_destroy(struct gro_cells *gcells) |
93 | { | 88 | { |
94 | struct gro_cell *cell = gcells->cells; | ||
95 | int i; | 89 | int i; |
96 | 90 | ||
97 | if (!cell) | 91 | if (!gcells->cells) |
98 | return; | 92 | return; |
99 | for (i = 0; i <= gcells->gro_cells_mask; i++,cell++) { | 93 | for_each_possible_cpu(i) { |
94 | struct gro_cell *cell = per_cpu_ptr(gcells->cells, i); | ||
100 | netif_napi_del(&cell->napi); | 95 | netif_napi_del(&cell->napi); |
101 | skb_queue_purge(&cell->napi_skbs); | 96 | skb_queue_purge(&cell->napi_skbs); |
102 | } | 97 | } |
103 | kfree(gcells->cells); | 98 | free_percpu(gcells->cells); |
104 | gcells->cells = NULL; | 99 | gcells->cells = NULL; |
105 | } | 100 | } |
106 | 101 | ||
diff --git a/include/net/ieee802154_netdev.h b/include/net/ieee802154_netdev.h index 83bb8a73d23c..94a297052442 100644 --- a/include/net/ieee802154_netdev.h +++ b/include/net/ieee802154_netdev.h | |||
@@ -28,6 +28,8 @@ | |||
28 | #include <linux/skbuff.h> | 28 | #include <linux/skbuff.h> |
29 | #include <linux/ieee802154.h> | 29 | #include <linux/ieee802154.h> |
30 | 30 | ||
31 | #include <net/cfg802154.h> | ||
32 | |||
31 | struct ieee802154_sechdr { | 33 | struct ieee802154_sechdr { |
32 | #if defined(__LITTLE_ENDIAN_BITFIELD) | 34 | #if defined(__LITTLE_ENDIAN_BITFIELD) |
33 | u8 level:3, | 35 | u8 level:3, |
@@ -337,7 +339,7 @@ struct ieee802154_mac_params { | |||
337 | s8 frame_retries; | 339 | s8 frame_retries; |
338 | 340 | ||
339 | bool lbt; | 341 | bool lbt; |
340 | u8 cca_mode; | 342 | struct wpan_phy_cca cca; |
341 | s32 cca_ed_level; | 343 | s32 cca_ed_level; |
342 | }; | 344 | }; |
343 | 345 | ||
diff --git a/include/net/inet_connection_sock.h b/include/net/inet_connection_sock.h index 848e85cb5c61..5976bdecf58b 100644 --- a/include/net/inet_connection_sock.h +++ b/include/net/inet_connection_sock.h | |||
@@ -98,7 +98,8 @@ struct inet_connection_sock { | |||
98 | const struct tcp_congestion_ops *icsk_ca_ops; | 98 | const struct tcp_congestion_ops *icsk_ca_ops; |
99 | const struct inet_connection_sock_af_ops *icsk_af_ops; | 99 | const struct inet_connection_sock_af_ops *icsk_af_ops; |
100 | unsigned int (*icsk_sync_mss)(struct sock *sk, u32 pmtu); | 100 | unsigned int (*icsk_sync_mss)(struct sock *sk, u32 pmtu); |
101 | __u8 icsk_ca_state; | 101 | __u8 icsk_ca_state:7, |
102 | icsk_ca_dst_locked:1; | ||
102 | __u8 icsk_retransmits; | 103 | __u8 icsk_retransmits; |
103 | __u8 icsk_pending; | 104 | __u8 icsk_pending; |
104 | __u8 icsk_backoff; | 105 | __u8 icsk_backoff; |
diff --git a/include/net/inet_sock.h b/include/net/inet_sock.h index a829b77523cf..eb16c7beed1e 100644 --- a/include/net/inet_sock.h +++ b/include/net/inet_sock.h | |||
@@ -16,7 +16,7 @@ | |||
16 | #ifndef _INET_SOCK_H | 16 | #ifndef _INET_SOCK_H |
17 | #define _INET_SOCK_H | 17 | #define _INET_SOCK_H |
18 | 18 | ||
19 | 19 | #include <linux/bitops.h> | |
20 | #include <linux/kmemcheck.h> | 20 | #include <linux/kmemcheck.h> |
21 | #include <linux/string.h> | 21 | #include <linux/string.h> |
22 | #include <linux/types.h> | 22 | #include <linux/types.h> |
@@ -184,6 +184,7 @@ struct inet_sock { | |||
184 | mc_all:1, | 184 | mc_all:1, |
185 | nodefrag:1; | 185 | nodefrag:1; |
186 | __u8 rcv_tos; | 186 | __u8 rcv_tos; |
187 | __u8 convert_csum; | ||
187 | int uc_index; | 188 | int uc_index; |
188 | int mc_index; | 189 | int mc_index; |
189 | __be32 mc_addr; | 190 | __be32 mc_addr; |
@@ -194,6 +195,16 @@ struct inet_sock { | |||
194 | #define IPCORK_OPT 1 /* ip-options has been held in ipcork.opt */ | 195 | #define IPCORK_OPT 1 /* ip-options has been held in ipcork.opt */ |
195 | #define IPCORK_ALLFRAG 2 /* always fragment (for ipv6 for now) */ | 196 | #define IPCORK_ALLFRAG 2 /* always fragment (for ipv6 for now) */ |
196 | 197 | ||
198 | /* cmsg flags for inet */ | ||
199 | #define IP_CMSG_PKTINFO BIT(0) | ||
200 | #define IP_CMSG_TTL BIT(1) | ||
201 | #define IP_CMSG_TOS BIT(2) | ||
202 | #define IP_CMSG_RECVOPTS BIT(3) | ||
203 | #define IP_CMSG_RETOPTS BIT(4) | ||
204 | #define IP_CMSG_PASSSEC BIT(5) | ||
205 | #define IP_CMSG_ORIGDSTADDR BIT(6) | ||
206 | #define IP_CMSG_CHECKSUM BIT(7) | ||
207 | |||
197 | static inline struct inet_sock *inet_sk(const struct sock *sk) | 208 | static inline struct inet_sock *inet_sk(const struct sock *sk) |
198 | { | 209 | { |
199 | return (struct inet_sock *)sk; | 210 | return (struct inet_sock *)sk; |
@@ -250,4 +261,20 @@ static inline __u8 inet_sk_flowi_flags(const struct sock *sk) | |||
250 | return flags; | 261 | return flags; |
251 | } | 262 | } |
252 | 263 | ||
264 | static inline void inet_inc_convert_csum(struct sock *sk) | ||
265 | { | ||
266 | inet_sk(sk)->convert_csum++; | ||
267 | } | ||
268 | |||
269 | static inline void inet_dec_convert_csum(struct sock *sk) | ||
270 | { | ||
271 | if (inet_sk(sk)->convert_csum > 0) | ||
272 | inet_sk(sk)->convert_csum--; | ||
273 | } | ||
274 | |||
275 | static inline bool inet_get_convert_csum(struct sock *sk) | ||
276 | { | ||
277 | return !!inet_sk(sk)->convert_csum; | ||
278 | } | ||
279 | |||
253 | #endif /* _INET_SOCK_H */ | 280 | #endif /* _INET_SOCK_H */ |
diff --git a/include/net/ip.h b/include/net/ip.h index 09cf5aebb283..025c61c0dffb 100644 --- a/include/net/ip.h +++ b/include/net/ip.h | |||
@@ -538,7 +538,7 @@ int ip_options_rcv_srr(struct sk_buff *skb); | |||
538 | */ | 538 | */ |
539 | 539 | ||
540 | void ipv4_pktinfo_prepare(const struct sock *sk, struct sk_buff *skb); | 540 | void ipv4_pktinfo_prepare(const struct sock *sk, struct sk_buff *skb); |
541 | void ip_cmsg_recv(struct msghdr *msg, struct sk_buff *skb); | 541 | void ip_cmsg_recv_offset(struct msghdr *msg, struct sk_buff *skb, int offset); |
542 | int ip_cmsg_send(struct net *net, struct msghdr *msg, | 542 | int ip_cmsg_send(struct net *net, struct msghdr *msg, |
543 | struct ipcm_cookie *ipc, bool allow_ipv6); | 543 | struct ipcm_cookie *ipc, bool allow_ipv6); |
544 | int ip_setsockopt(struct sock *sk, int level, int optname, char __user *optval, | 544 | int ip_setsockopt(struct sock *sk, int level, int optname, char __user *optval, |
@@ -558,6 +558,11 @@ void ip_icmp_error(struct sock *sk, struct sk_buff *skb, int err, __be16 port, | |||
558 | void ip_local_error(struct sock *sk, int err, __be32 daddr, __be16 dport, | 558 | void ip_local_error(struct sock *sk, int err, __be32 daddr, __be16 dport, |
559 | u32 info); | 559 | u32 info); |
560 | 560 | ||
561 | static inline void ip_cmsg_recv(struct msghdr *msg, struct sk_buff *skb) | ||
562 | { | ||
563 | ip_cmsg_recv_offset(msg, skb, 0); | ||
564 | } | ||
565 | |||
561 | bool icmp_global_allow(void); | 566 | bool icmp_global_allow(void); |
562 | extern int sysctl_icmp_msgs_per_sec; | 567 | extern int sysctl_icmp_msgs_per_sec; |
563 | extern int sysctl_icmp_msgs_burst; | 568 | extern int sysctl_icmp_msgs_burst; |
diff --git a/include/net/ip6_fib.h b/include/net/ip6_fib.h index 8eea35d32a75..20e80fa7bbdd 100644 --- a/include/net/ip6_fib.h +++ b/include/net/ip6_fib.h | |||
@@ -74,6 +74,11 @@ struct fib6_node { | |||
74 | #define FIB6_SUBTREE(fn) ((fn)->subtree) | 74 | #define FIB6_SUBTREE(fn) ((fn)->subtree) |
75 | #endif | 75 | #endif |
76 | 76 | ||
77 | struct mx6_config { | ||
78 | const u32 *mx; | ||
79 | DECLARE_BITMAP(mx_valid, RTAX_MAX); | ||
80 | }; | ||
81 | |||
77 | /* | 82 | /* |
78 | * routing information | 83 | * routing information |
79 | * | 84 | * |
@@ -291,9 +296,8 @@ struct fib6_node *fib6_locate(struct fib6_node *root, | |||
291 | void fib6_clean_all(struct net *net, int (*func)(struct rt6_info *, void *arg), | 296 | void fib6_clean_all(struct net *net, int (*func)(struct rt6_info *, void *arg), |
292 | void *arg); | 297 | void *arg); |
293 | 298 | ||
294 | int fib6_add(struct fib6_node *root, struct rt6_info *rt, struct nl_info *info, | 299 | int fib6_add(struct fib6_node *root, struct rt6_info *rt, |
295 | struct nlattr *mx, int mx_len); | 300 | struct nl_info *info, struct mx6_config *mxc); |
296 | |||
297 | int fib6_del(struct rt6_info *rt, struct nl_info *info); | 301 | int fib6_del(struct rt6_info *rt, struct nl_info *info); |
298 | 302 | ||
299 | void inet6_rt_notify(int event, struct rt6_info *rt, struct nl_info *info); | 303 | void inet6_rt_notify(int event, struct rt6_info *rt, struct nl_info *info); |
diff --git a/include/net/ip6_tunnel.h b/include/net/ip6_tunnel.h index 9326c41c2d7f..76c091b53dae 100644 --- a/include/net/ip6_tunnel.h +++ b/include/net/ip6_tunnel.h | |||
@@ -70,6 +70,7 @@ int ip6_tnl_xmit_ctl(struct ip6_tnl *t, const struct in6_addr *laddr, | |||
70 | __u16 ip6_tnl_parse_tlv_enc_lim(struct sk_buff *skb, __u8 *raw); | 70 | __u16 ip6_tnl_parse_tlv_enc_lim(struct sk_buff *skb, __u8 *raw); |
71 | __u32 ip6_tnl_get_cap(struct ip6_tnl *t, const struct in6_addr *laddr, | 71 | __u32 ip6_tnl_get_cap(struct ip6_tnl *t, const struct in6_addr *laddr, |
72 | const struct in6_addr *raddr); | 72 | const struct in6_addr *raddr); |
73 | struct net *ip6_tnl_get_link_net(const struct net_device *dev); | ||
73 | 74 | ||
74 | static inline void ip6tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | 75 | static inline void ip6tunnel_xmit(struct sk_buff *skb, struct net_device *dev) |
75 | { | 76 | { |
diff --git a/include/net/ip_fib.h b/include/net/ip_fib.h index 09a819ee2151..5bd120e4bc0a 100644 --- a/include/net/ip_fib.h +++ b/include/net/ip_fib.h | |||
@@ -222,16 +222,19 @@ static inline struct fib_table *fib_new_table(struct net *net, u32 id) | |||
222 | static inline int fib_lookup(struct net *net, const struct flowi4 *flp, | 222 | static inline int fib_lookup(struct net *net, const struct flowi4 *flp, |
223 | struct fib_result *res) | 223 | struct fib_result *res) |
224 | { | 224 | { |
225 | struct fib_table *table; | 225 | int err = -ENETUNREACH; |
226 | |||
227 | rcu_read_lock(); | ||
228 | |||
229 | if (!fib_table_lookup(fib_get_table(net, RT_TABLE_LOCAL), flp, res, | ||
230 | FIB_LOOKUP_NOREF) || | ||
231 | !fib_table_lookup(fib_get_table(net, RT_TABLE_MAIN), flp, res, | ||
232 | FIB_LOOKUP_NOREF)) | ||
233 | err = 0; | ||
226 | 234 | ||
227 | table = fib_get_table(net, RT_TABLE_LOCAL); | 235 | rcu_read_unlock(); |
228 | if (!fib_table_lookup(table, flp, res, FIB_LOOKUP_NOREF)) | ||
229 | return 0; | ||
230 | 236 | ||
231 | table = fib_get_table(net, RT_TABLE_MAIN); | 237 | return err; |
232 | if (!fib_table_lookup(table, flp, res, FIB_LOOKUP_NOREF)) | ||
233 | return 0; | ||
234 | return -ENETUNREACH; | ||
235 | } | 238 | } |
236 | 239 | ||
237 | #else /* CONFIG_IP_MULTIPLE_TABLES */ | 240 | #else /* CONFIG_IP_MULTIPLE_TABLES */ |
@@ -247,20 +250,25 @@ static inline int fib_lookup(struct net *net, struct flowi4 *flp, | |||
247 | struct fib_result *res) | 250 | struct fib_result *res) |
248 | { | 251 | { |
249 | if (!net->ipv4.fib_has_custom_rules) { | 252 | if (!net->ipv4.fib_has_custom_rules) { |
253 | int err = -ENETUNREACH; | ||
254 | |||
255 | rcu_read_lock(); | ||
256 | |||
250 | res->tclassid = 0; | 257 | res->tclassid = 0; |
251 | if (net->ipv4.fib_local && | 258 | if ((net->ipv4.fib_local && |
252 | !fib_table_lookup(net->ipv4.fib_local, flp, res, | 259 | !fib_table_lookup(net->ipv4.fib_local, flp, res, |
253 | FIB_LOOKUP_NOREF)) | 260 | FIB_LOOKUP_NOREF)) || |
254 | return 0; | 261 | (net->ipv4.fib_main && |
255 | if (net->ipv4.fib_main && | 262 | !fib_table_lookup(net->ipv4.fib_main, flp, res, |
256 | !fib_table_lookup(net->ipv4.fib_main, flp, res, | 263 | FIB_LOOKUP_NOREF)) || |
257 | FIB_LOOKUP_NOREF)) | 264 | (net->ipv4.fib_default && |
258 | return 0; | 265 | !fib_table_lookup(net->ipv4.fib_default, flp, res, |
259 | if (net->ipv4.fib_default && | 266 | FIB_LOOKUP_NOREF))) |
260 | !fib_table_lookup(net->ipv4.fib_default, flp, res, | 267 | err = 0; |
261 | FIB_LOOKUP_NOREF)) | 268 | |
262 | return 0; | 269 | rcu_read_unlock(); |
263 | return -ENETUNREACH; | 270 | |
271 | return err; | ||
264 | } | 272 | } |
265 | return __fib_lookup(net, flp, res); | 273 | return __fib_lookup(net, flp, res); |
266 | } | 274 | } |
diff --git a/include/net/ip_tunnels.h b/include/net/ip_tunnels.h index 25a59eb388a6..2c47061a6954 100644 --- a/include/net/ip_tunnels.h +++ b/include/net/ip_tunnels.h | |||
@@ -97,7 +97,10 @@ struct ip_tunnel { | |||
97 | #define TUNNEL_DONT_FRAGMENT __cpu_to_be16(0x0100) | 97 | #define TUNNEL_DONT_FRAGMENT __cpu_to_be16(0x0100) |
98 | #define TUNNEL_OAM __cpu_to_be16(0x0200) | 98 | #define TUNNEL_OAM __cpu_to_be16(0x0200) |
99 | #define TUNNEL_CRIT_OPT __cpu_to_be16(0x0400) | 99 | #define TUNNEL_CRIT_OPT __cpu_to_be16(0x0400) |
100 | #define TUNNEL_OPTIONS_PRESENT __cpu_to_be16(0x0800) | 100 | #define TUNNEL_GENEVE_OPT __cpu_to_be16(0x0800) |
101 | #define TUNNEL_VXLAN_OPT __cpu_to_be16(0x1000) | ||
102 | |||
103 | #define TUNNEL_OPTIONS_PRESENT (TUNNEL_GENEVE_OPT | TUNNEL_VXLAN_OPT) | ||
101 | 104 | ||
102 | struct tnl_ptk_info { | 105 | struct tnl_ptk_info { |
103 | __be16 flags; | 106 | __be16 flags; |
@@ -138,6 +141,7 @@ int ip_tunnel_encap_del_ops(const struct ip_tunnel_encap_ops *op, | |||
138 | int ip_tunnel_init(struct net_device *dev); | 141 | int ip_tunnel_init(struct net_device *dev); |
139 | void ip_tunnel_uninit(struct net_device *dev); | 142 | void ip_tunnel_uninit(struct net_device *dev); |
140 | void ip_tunnel_dellink(struct net_device *dev, struct list_head *head); | 143 | void ip_tunnel_dellink(struct net_device *dev, struct list_head *head); |
144 | struct net *ip_tunnel_get_link_net(const struct net_device *dev); | ||
141 | int ip_tunnel_init_net(struct net *net, int ip_tnl_net_id, | 145 | int ip_tunnel_init_net(struct net *net, int ip_tnl_net_id, |
142 | struct rtnl_link_ops *ops, char *devname); | 146 | struct rtnl_link_ops *ops, char *devname); |
143 | 147 | ||
diff --git a/include/net/ipv6.h b/include/net/ipv6.h index 6e416f6d3e3c..4c9fe224d73b 100644 --- a/include/net/ipv6.h +++ b/include/net/ipv6.h | |||
@@ -671,8 +671,6 @@ static inline int ipv6_addr_diff(const struct in6_addr *a1, const struct in6_add | |||
671 | return __ipv6_addr_diff(a1, a2, sizeof(struct in6_addr)); | 671 | return __ipv6_addr_diff(a1, a2, sizeof(struct in6_addr)); |
672 | } | 672 | } |
673 | 673 | ||
674 | u32 __ipv6_select_ident(u32 hashrnd, struct in6_addr *dst, | ||
675 | struct in6_addr *src); | ||
676 | void ipv6_select_ident(struct frag_hdr *fhdr, struct rt6_info *rt); | 674 | void ipv6_select_ident(struct frag_hdr *fhdr, struct rt6_info *rt); |
677 | void ipv6_proxy_select_ident(struct sk_buff *skb); | 675 | void ipv6_proxy_select_ident(struct sk_buff *skb); |
678 | 676 | ||
@@ -791,6 +789,25 @@ int ip6_push_pending_frames(struct sock *sk); | |||
791 | 789 | ||
792 | void ip6_flush_pending_frames(struct sock *sk); | 790 | void ip6_flush_pending_frames(struct sock *sk); |
793 | 791 | ||
792 | int ip6_send_skb(struct sk_buff *skb); | ||
793 | |||
794 | struct sk_buff *__ip6_make_skb(struct sock *sk, struct sk_buff_head *queue, | ||
795 | struct inet_cork_full *cork, | ||
796 | struct inet6_cork *v6_cork); | ||
797 | struct sk_buff *ip6_make_skb(struct sock *sk, | ||
798 | int getfrag(void *from, char *to, int offset, | ||
799 | int len, int odd, struct sk_buff *skb), | ||
800 | void *from, int length, int transhdrlen, | ||
801 | int hlimit, int tclass, struct ipv6_txoptions *opt, | ||
802 | struct flowi6 *fl6, struct rt6_info *rt, | ||
803 | unsigned int flags, int dontfrag); | ||
804 | |||
805 | static inline struct sk_buff *ip6_finish_skb(struct sock *sk) | ||
806 | { | ||
807 | return __ip6_make_skb(sk, &sk->sk_write_queue, &inet_sk(sk)->cork, | ||
808 | &inet6_sk(sk)->cork); | ||
809 | } | ||
810 | |||
794 | int ip6_dst_lookup(struct sock *sk, struct dst_entry **dst, struct flowi6 *fl6); | 811 | int ip6_dst_lookup(struct sock *sk, struct dst_entry **dst, struct flowi6 *fl6); |
795 | struct dst_entry *ip6_dst_lookup_flow(struct sock *sk, struct flowi6 *fl6, | 812 | struct dst_entry *ip6_dst_lookup_flow(struct sock *sk, struct flowi6 *fl6, |
796 | const struct in6_addr *final_dst); | 813 | const struct in6_addr *final_dst); |
diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 29c7be8808d5..d52914b75331 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h | |||
@@ -376,6 +376,12 @@ enum ieee80211_rssi_event { | |||
376 | * @ssid_len: Length of SSID given in @ssid. | 376 | * @ssid_len: Length of SSID given in @ssid. |
377 | * @hidden_ssid: The SSID of the current vif is hidden. Only valid in AP-mode. | 377 | * @hidden_ssid: The SSID of the current vif is hidden. Only valid in AP-mode. |
378 | * @txpower: TX power in dBm | 378 | * @txpower: TX power in dBm |
379 | * @txpower_type: TX power adjustment used to control per packet Transmit | ||
380 | * Power Control (TPC) in lower driver for the current vif. In particular | ||
381 | * TPC is enabled if value passed in %txpower_type is | ||
382 | * NL80211_TX_POWER_LIMITED (allow using less than specified from | ||
383 | * userspace), whereas TPC is disabled if %txpower_type is set to | ||
384 | * NL80211_TX_POWER_FIXED (use value configured from userspace) | ||
379 | * @p2p_noa_attr: P2P NoA attribute for P2P powersave | 385 | * @p2p_noa_attr: P2P NoA attribute for P2P powersave |
380 | */ | 386 | */ |
381 | struct ieee80211_bss_conf { | 387 | struct ieee80211_bss_conf { |
@@ -411,6 +417,7 @@ struct ieee80211_bss_conf { | |||
411 | size_t ssid_len; | 417 | size_t ssid_len; |
412 | bool hidden_ssid; | 418 | bool hidden_ssid; |
413 | int txpower; | 419 | int txpower; |
420 | enum nl80211_tx_power_setting txpower_type; | ||
414 | struct ieee80211_p2p_noa_attr p2p_noa_attr; | 421 | struct ieee80211_p2p_noa_attr p2p_noa_attr; |
415 | }; | 422 | }; |
416 | 423 | ||
@@ -505,8 +512,11 @@ struct ieee80211_bss_conf { | |||
505 | * @IEEE80211_TX_CTL_DONTFRAG: Don't fragment this packet even if it | 512 | * @IEEE80211_TX_CTL_DONTFRAG: Don't fragment this packet even if it |
506 | * would be fragmented by size (this is optional, only used for | 513 | * would be fragmented by size (this is optional, only used for |
507 | * monitor injection). | 514 | * monitor injection). |
508 | * @IEEE80211_TX_CTL_PS_RESPONSE: This frame is a response to a poll | 515 | * @IEEE80211_TX_STAT_NOACK_TRANSMITTED: A frame that was marked with |
509 | * frame (PS-Poll or uAPSD). | 516 | * IEEE80211_TX_CTL_NO_ACK has been successfully transmitted without |
517 | * any errors (like issues specific to the driver/HW). | ||
518 | * This flag must not be set for frames that don't request no-ack | ||
519 | * behaviour with IEEE80211_TX_CTL_NO_ACK. | ||
510 | * | 520 | * |
511 | * Note: If you have to add new flags to the enumeration, then don't | 521 | * Note: If you have to add new flags to the enumeration, then don't |
512 | * forget to update %IEEE80211_TX_TEMPORARY_FLAGS when necessary. | 522 | * forget to update %IEEE80211_TX_TEMPORARY_FLAGS when necessary. |
@@ -542,7 +552,7 @@ enum mac80211_tx_info_flags { | |||
542 | IEEE80211_TX_STATUS_EOSP = BIT(28), | 552 | IEEE80211_TX_STATUS_EOSP = BIT(28), |
543 | IEEE80211_TX_CTL_USE_MINRATE = BIT(29), | 553 | IEEE80211_TX_CTL_USE_MINRATE = BIT(29), |
544 | IEEE80211_TX_CTL_DONTFRAG = BIT(30), | 554 | IEEE80211_TX_CTL_DONTFRAG = BIT(30), |
545 | IEEE80211_TX_CTL_PS_RESPONSE = BIT(31), | 555 | IEEE80211_TX_STAT_NOACK_TRANSMITTED = BIT(31), |
546 | }; | 556 | }; |
547 | 557 | ||
548 | #define IEEE80211_TX_CTL_STBC_SHIFT 23 | 558 | #define IEEE80211_TX_CTL_STBC_SHIFT 23 |
@@ -552,11 +562,14 @@ enum mac80211_tx_info_flags { | |||
552 | * | 562 | * |
553 | * @IEEE80211_TX_CTRL_PORT_CTRL_PROTO: this frame is a port control | 563 | * @IEEE80211_TX_CTRL_PORT_CTRL_PROTO: this frame is a port control |
554 | * protocol frame (e.g. EAP) | 564 | * protocol frame (e.g. EAP) |
565 | * @IEEE80211_TX_CTRL_PS_RESPONSE: This frame is a response to a poll | ||
566 | * frame (PS-Poll or uAPSD). | ||
555 | * | 567 | * |
556 | * These flags are used in tx_info->control.flags. | 568 | * These flags are used in tx_info->control.flags. |
557 | */ | 569 | */ |
558 | enum mac80211_tx_control_flags { | 570 | enum mac80211_tx_control_flags { |
559 | IEEE80211_TX_CTRL_PORT_CTRL_PROTO = BIT(0), | 571 | IEEE80211_TX_CTRL_PORT_CTRL_PROTO = BIT(0), |
572 | IEEE80211_TX_CTRL_PS_RESPONSE = BIT(1), | ||
560 | }; | 573 | }; |
561 | 574 | ||
562 | /* | 575 | /* |
@@ -925,15 +938,13 @@ enum mac80211_rx_flags { | |||
925 | * These flags are used with the @vht_flag member of | 938 | * These flags are used with the @vht_flag member of |
926 | * &struct ieee80211_rx_status. | 939 | * &struct ieee80211_rx_status. |
927 | * @RX_VHT_FLAG_80MHZ: 80 MHz was used | 940 | * @RX_VHT_FLAG_80MHZ: 80 MHz was used |
928 | * @RX_VHT_FLAG_80P80MHZ: 80+80 MHz was used | ||
929 | * @RX_VHT_FLAG_160MHZ: 160 MHz was used | 941 | * @RX_VHT_FLAG_160MHZ: 160 MHz was used |
930 | * @RX_VHT_FLAG_BF: packet was beamformed | 942 | * @RX_VHT_FLAG_BF: packet was beamformed |
931 | */ | 943 | */ |
932 | enum mac80211_rx_vht_flags { | 944 | enum mac80211_rx_vht_flags { |
933 | RX_VHT_FLAG_80MHZ = BIT(0), | 945 | RX_VHT_FLAG_80MHZ = BIT(0), |
934 | RX_VHT_FLAG_80P80MHZ = BIT(1), | 946 | RX_VHT_FLAG_160MHZ = BIT(1), |
935 | RX_VHT_FLAG_160MHZ = BIT(2), | 947 | RX_VHT_FLAG_BF = BIT(2), |
936 | RX_VHT_FLAG_BF = BIT(3), | ||
937 | }; | 948 | }; |
938 | 949 | ||
939 | /** | 950 | /** |
@@ -1181,10 +1192,15 @@ struct ieee80211_channel_switch { | |||
1181 | * monitoring on this virtual interface -- i.e. it can monitor | 1192 | * monitoring on this virtual interface -- i.e. it can monitor |
1182 | * connection quality related parameters, such as the RSSI level and | 1193 | * connection quality related parameters, such as the RSSI level and |
1183 | * provide notifications if configured trigger levels are reached. | 1194 | * provide notifications if configured trigger levels are reached. |
1195 | * @IEEE80211_VIF_SUPPORTS_UAPSD: The device can do U-APSD for this | ||
1196 | * interface. This flag should be set during interface addition, | ||
1197 | * but may be set/cleared as late as authentication to an AP. It is | ||
1198 | * only valid for managed/station mode interfaces. | ||
1184 | */ | 1199 | */ |
1185 | enum ieee80211_vif_flags { | 1200 | enum ieee80211_vif_flags { |
1186 | IEEE80211_VIF_BEACON_FILTER = BIT(0), | 1201 | IEEE80211_VIF_BEACON_FILTER = BIT(0), |
1187 | IEEE80211_VIF_SUPPORTS_CQM_RSSI = BIT(1), | 1202 | IEEE80211_VIF_SUPPORTS_CQM_RSSI = BIT(1), |
1203 | IEEE80211_VIF_SUPPORTS_UAPSD = BIT(2), | ||
1188 | }; | 1204 | }; |
1189 | 1205 | ||
1190 | /** | 1206 | /** |
@@ -1270,19 +1286,22 @@ struct ieee80211_vif *wdev_to_ieee80211_vif(struct wireless_dev *wdev); | |||
1270 | * | 1286 | * |
1271 | * @IEEE80211_KEY_FLAG_GENERATE_IV: This flag should be set by the | 1287 | * @IEEE80211_KEY_FLAG_GENERATE_IV: This flag should be set by the |
1272 | * driver to indicate that it requires IV generation for this | 1288 | * driver to indicate that it requires IV generation for this |
1273 | * particular key. | 1289 | * particular key. Setting this flag does not necessarily mean that SKBs |
1290 | * will have sufficient tailroom for ICV or MIC. | ||
1274 | * @IEEE80211_KEY_FLAG_GENERATE_MMIC: This flag should be set by | 1291 | * @IEEE80211_KEY_FLAG_GENERATE_MMIC: This flag should be set by |
1275 | * the driver for a TKIP key if it requires Michael MIC | 1292 | * the driver for a TKIP key if it requires Michael MIC |
1276 | * generation in software. | 1293 | * generation in software. |
1277 | * @IEEE80211_KEY_FLAG_PAIRWISE: Set by mac80211, this flag indicates | 1294 | * @IEEE80211_KEY_FLAG_PAIRWISE: Set by mac80211, this flag indicates |
1278 | * that the key is pairwise rather then a shared key. | 1295 | * that the key is pairwise rather then a shared key. |
1279 | * @IEEE80211_KEY_FLAG_SW_MGMT_TX: This flag should be set by the driver for a | 1296 | * @IEEE80211_KEY_FLAG_SW_MGMT_TX: This flag should be set by the driver for a |
1280 | * CCMP key if it requires CCMP encryption of management frames (MFP) to | 1297 | * CCMP/GCMP key if it requires CCMP/GCMP encryption of management frames |
1281 | * be done in software. | 1298 | * (MFP) to be done in software. |
1282 | * @IEEE80211_KEY_FLAG_PUT_IV_SPACE: This flag should be set by the driver | 1299 | * @IEEE80211_KEY_FLAG_PUT_IV_SPACE: This flag should be set by the driver |
1283 | * if space should be prepared for the IV, but the IV | 1300 | * if space should be prepared for the IV, but the IV |
1284 | * itself should not be generated. Do not set together with | 1301 | * itself should not be generated. Do not set together with |
1285 | * @IEEE80211_KEY_FLAG_GENERATE_IV on the same key. | 1302 | * @IEEE80211_KEY_FLAG_GENERATE_IV on the same key. Setting this flag does |
1303 | * not necessarily mean that SKBs will have sufficient tailroom for ICV or | ||
1304 | * MIC. | ||
1286 | * @IEEE80211_KEY_FLAG_RX_MGMT: This key will be used to decrypt received | 1305 | * @IEEE80211_KEY_FLAG_RX_MGMT: This key will be used to decrypt received |
1287 | * management frames. The flag can help drivers that have a hardware | 1306 | * management frames. The flag can help drivers that have a hardware |
1288 | * crypto implementation that doesn't deal with management frames | 1307 | * crypto implementation that doesn't deal with management frames |
@@ -1291,8 +1310,11 @@ struct ieee80211_vif *wdev_to_ieee80211_vif(struct wireless_dev *wdev); | |||
1291 | * RX, if your crypto engine can't deal with TX you can also set the | 1310 | * RX, if your crypto engine can't deal with TX you can also set the |
1292 | * %IEEE80211_KEY_FLAG_SW_MGMT_TX flag to encrypt such frames in SW. | 1311 | * %IEEE80211_KEY_FLAG_SW_MGMT_TX flag to encrypt such frames in SW. |
1293 | * @IEEE80211_KEY_FLAG_GENERATE_IV_MGMT: This flag should be set by the | 1312 | * @IEEE80211_KEY_FLAG_GENERATE_IV_MGMT: This flag should be set by the |
1294 | * driver for a CCMP key to indicate that is requires IV generation | 1313 | * driver for a CCMP/GCMP key to indicate that is requires IV generation |
1295 | * only for managment frames (MFP). | 1314 | * only for managment frames (MFP). |
1315 | * @IEEE80211_KEY_FLAG_RESERVE_TAILROOM: This flag should be set by the | ||
1316 | * driver for a key to indicate that sufficient tailroom must always | ||
1317 | * be reserved for ICV or MIC, even when HW encryption is enabled. | ||
1296 | */ | 1318 | */ |
1297 | enum ieee80211_key_flags { | 1319 | enum ieee80211_key_flags { |
1298 | IEEE80211_KEY_FLAG_GENERATE_IV_MGMT = BIT(0), | 1320 | IEEE80211_KEY_FLAG_GENERATE_IV_MGMT = BIT(0), |
@@ -1302,6 +1324,7 @@ enum ieee80211_key_flags { | |||
1302 | IEEE80211_KEY_FLAG_SW_MGMT_TX = BIT(4), | 1324 | IEEE80211_KEY_FLAG_SW_MGMT_TX = BIT(4), |
1303 | IEEE80211_KEY_FLAG_PUT_IV_SPACE = BIT(5), | 1325 | IEEE80211_KEY_FLAG_PUT_IV_SPACE = BIT(5), |
1304 | IEEE80211_KEY_FLAG_RX_MGMT = BIT(6), | 1326 | IEEE80211_KEY_FLAG_RX_MGMT = BIT(6), |
1327 | IEEE80211_KEY_FLAG_RESERVE_TAILROOM = BIT(7), | ||
1305 | }; | 1328 | }; |
1306 | 1329 | ||
1307 | /** | 1330 | /** |
@@ -1580,11 +1603,6 @@ struct ieee80211_tx_control { | |||
1580 | * @IEEE80211_HW_MFP_CAPABLE: | 1603 | * @IEEE80211_HW_MFP_CAPABLE: |
1581 | * Hardware supports management frame protection (MFP, IEEE 802.11w). | 1604 | * Hardware supports management frame protection (MFP, IEEE 802.11w). |
1582 | * | 1605 | * |
1583 | * @IEEE80211_HW_SUPPORTS_UAPSD: | ||
1584 | * Hardware supports Unscheduled Automatic Power Save Delivery | ||
1585 | * (U-APSD) in managed mode. The mode is configured with | ||
1586 | * conf_tx() operation. | ||
1587 | * | ||
1588 | * @IEEE80211_HW_REPORTS_TX_ACK_STATUS: | 1606 | * @IEEE80211_HW_REPORTS_TX_ACK_STATUS: |
1589 | * Hardware can provide ack status reports of Tx frames to | 1607 | * Hardware can provide ack status reports of Tx frames to |
1590 | * the stack. | 1608 | * the stack. |
@@ -1623,6 +1641,12 @@ struct ieee80211_tx_control { | |||
1623 | * be created. It is expected user-space will create vifs as | 1641 | * be created. It is expected user-space will create vifs as |
1624 | * desired (and thus have them named as desired). | 1642 | * desired (and thus have them named as desired). |
1625 | * | 1643 | * |
1644 | * @IEEE80211_HW_SW_CRYPTO_CONTROL: The driver wants to control which of the | ||
1645 | * crypto algorithms can be done in software - so don't automatically | ||
1646 | * try to fall back to it if hardware crypto fails, but do so only if | ||
1647 | * the driver returns 1. This also forces the driver to advertise its | ||
1648 | * supported cipher suites. | ||
1649 | * | ||
1626 | * @IEEE80211_HW_QUEUE_CONTROL: The driver wants to control per-interface | 1650 | * @IEEE80211_HW_QUEUE_CONTROL: The driver wants to control per-interface |
1627 | * queue mapping in order to use different queues (not just one per AC) | 1651 | * queue mapping in order to use different queues (not just one per AC) |
1628 | * for different virtual interfaces. See the doc section on HW queue | 1652 | * for different virtual interfaces. See the doc section on HW queue |
@@ -1670,8 +1694,8 @@ enum ieee80211_hw_flags { | |||
1670 | IEEE80211_HW_MFP_CAPABLE = 1<<13, | 1694 | IEEE80211_HW_MFP_CAPABLE = 1<<13, |
1671 | IEEE80211_HW_WANT_MONITOR_VIF = 1<<14, | 1695 | IEEE80211_HW_WANT_MONITOR_VIF = 1<<14, |
1672 | IEEE80211_HW_NO_AUTO_VIF = 1<<15, | 1696 | IEEE80211_HW_NO_AUTO_VIF = 1<<15, |
1673 | /* free slot */ | 1697 | IEEE80211_HW_SW_CRYPTO_CONTROL = 1<<16, |
1674 | IEEE80211_HW_SUPPORTS_UAPSD = 1<<17, | 1698 | /* free slots */ |
1675 | IEEE80211_HW_REPORTS_TX_ACK_STATUS = 1<<18, | 1699 | IEEE80211_HW_REPORTS_TX_ACK_STATUS = 1<<18, |
1676 | IEEE80211_HW_CONNECTION_MONITOR = 1<<19, | 1700 | IEEE80211_HW_CONNECTION_MONITOR = 1<<19, |
1677 | IEEE80211_HW_QUEUE_CONTROL = 1<<20, | 1701 | IEEE80211_HW_QUEUE_CONTROL = 1<<20, |
@@ -1945,6 +1969,11 @@ void ieee80211_free_txskb(struct ieee80211_hw *hw, struct sk_buff *skb); | |||
1945 | * added; if you return 0 then hw_key_idx must be assigned to the | 1969 | * added; if you return 0 then hw_key_idx must be assigned to the |
1946 | * hardware key index, you are free to use the full u8 range. | 1970 | * hardware key index, you are free to use the full u8 range. |
1947 | * | 1971 | * |
1972 | * Note that in the case that the @IEEE80211_HW_SW_CRYPTO_CONTROL flag is | ||
1973 | * set, mac80211 will not automatically fall back to software crypto if | ||
1974 | * enabling hardware crypto failed. The set_key() call may also return the | ||
1975 | * value 1 to permit this specific key/algorithm to be done in software. | ||
1976 | * | ||
1948 | * When the cmd is %DISABLE_KEY then it must succeed. | 1977 | * When the cmd is %DISABLE_KEY then it must succeed. |
1949 | * | 1978 | * |
1950 | * Note that it is permissible to not decrypt a frame even if a key | 1979 | * Note that it is permissible to not decrypt a frame even if a key |
@@ -2023,7 +2052,7 @@ void ieee80211_free_txskb(struct ieee80211_hw *hw, struct sk_buff *skb); | |||
2023 | * enabled whenever user has enabled powersave. | 2052 | * enabled whenever user has enabled powersave. |
2024 | * | 2053 | * |
2025 | * Driver informs U-APSD client support by enabling | 2054 | * Driver informs U-APSD client support by enabling |
2026 | * %IEEE80211_HW_SUPPORTS_UAPSD flag. The mode is configured through the | 2055 | * %IEEE80211_VIF_SUPPORTS_UAPSD flag. The mode is configured through the |
2027 | * uapsd parameter in conf_tx() operation. Hardware needs to send the QoS | 2056 | * uapsd parameter in conf_tx() operation. Hardware needs to send the QoS |
2028 | * Nullfunc frames and stay awake until the service period has ended. To | 2057 | * Nullfunc frames and stay awake until the service period has ended. To |
2029 | * utilize U-APSD, dynamic powersave is disabled for voip AC and all frames | 2058 | * utilize U-APSD, dynamic powersave is disabled for voip AC and all frames |
@@ -2696,6 +2725,14 @@ enum ieee80211_reconfig_type { | |||
2696 | * is only used if the configured rate control algorithm actually uses | 2725 | * is only used if the configured rate control algorithm actually uses |
2697 | * the new rate table API, and is therefore optional. Must be atomic. | 2726 | * the new rate table API, and is therefore optional. Must be atomic. |
2698 | * | 2727 | * |
2728 | * @sta_statistics: Get statistics for this station. For example with beacon | ||
2729 | * filtering, the statistics kept by mac80211 might not be accurate, so | ||
2730 | * let the driver pre-fill the statistics. The driver can fill most of | ||
2731 | * the values (indicating which by setting the filled bitmap), but not | ||
2732 | * all of them make sense - see the source for which ones are possible. | ||
2733 | * Statistics that the driver doesn't fill will be filled by mac80211. | ||
2734 | * The callback can sleep. | ||
2735 | * | ||
2699 | * @conf_tx: Configure TX queue parameters (EDCF (aifs, cw_min, cw_max), | 2736 | * @conf_tx: Configure TX queue parameters (EDCF (aifs, cw_min, cw_max), |
2700 | * bursting) for a hardware TX queue. | 2737 | * bursting) for a hardware TX queue. |
2701 | * Returns a negative error code on failure. | 2738 | * Returns a negative error code on failure. |
@@ -2856,9 +2893,6 @@ enum ieee80211_reconfig_type { | |||
2856 | * @get_et_strings: Ethtool API to get a set of strings to describe stats | 2893 | * @get_et_strings: Ethtool API to get a set of strings to describe stats |
2857 | * and perhaps other supported types of ethtool data-sets. | 2894 | * and perhaps other supported types of ethtool data-sets. |
2858 | * | 2895 | * |
2859 | * @get_rssi: Get current signal strength in dBm, the function is optional | ||
2860 | * and can sleep. | ||
2861 | * | ||
2862 | * @mgd_prepare_tx: Prepare for transmitting a management frame for association | 2896 | * @mgd_prepare_tx: Prepare for transmitting a management frame for association |
2863 | * before associated. In multi-channel scenarios, a virtual interface is | 2897 | * before associated. In multi-channel scenarios, a virtual interface is |
2864 | * bound to a channel before it is associated, but as it isn't associated | 2898 | * bound to a channel before it is associated, but as it isn't associated |
@@ -3059,6 +3093,10 @@ struct ieee80211_ops { | |||
3059 | void (*sta_rate_tbl_update)(struct ieee80211_hw *hw, | 3093 | void (*sta_rate_tbl_update)(struct ieee80211_hw *hw, |
3060 | struct ieee80211_vif *vif, | 3094 | struct ieee80211_vif *vif, |
3061 | struct ieee80211_sta *sta); | 3095 | struct ieee80211_sta *sta); |
3096 | void (*sta_statistics)(struct ieee80211_hw *hw, | ||
3097 | struct ieee80211_vif *vif, | ||
3098 | struct ieee80211_sta *sta, | ||
3099 | struct station_info *sinfo); | ||
3062 | int (*conf_tx)(struct ieee80211_hw *hw, | 3100 | int (*conf_tx)(struct ieee80211_hw *hw, |
3063 | struct ieee80211_vif *vif, u16 ac, | 3101 | struct ieee80211_vif *vif, u16 ac, |
3064 | const struct ieee80211_tx_queue_params *params); | 3102 | const struct ieee80211_tx_queue_params *params); |
@@ -3126,8 +3164,6 @@ struct ieee80211_ops { | |||
3126 | void (*get_et_strings)(struct ieee80211_hw *hw, | 3164 | void (*get_et_strings)(struct ieee80211_hw *hw, |
3127 | struct ieee80211_vif *vif, | 3165 | struct ieee80211_vif *vif, |
3128 | u32 sset, u8 *data); | 3166 | u32 sset, u8 *data); |
3129 | int (*get_rssi)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, | ||
3130 | struct ieee80211_sta *sta, s8 *rssi_dbm); | ||
3131 | 3167 | ||
3132 | void (*mgd_prepare_tx)(struct ieee80211_hw *hw, | 3168 | void (*mgd_prepare_tx)(struct ieee80211_hw *hw, |
3133 | struct ieee80211_vif *vif); | 3169 | struct ieee80211_vif *vif); |
@@ -4062,6 +4098,10 @@ void ieee80211_aes_cmac_calculate_k1_k2(struct ieee80211_key_conf *keyconf, | |||
4062 | * reverse order than in packet) | 4098 | * reverse order than in packet) |
4063 | * @aes_cmac: PN data, most significant byte first (big endian, | 4099 | * @aes_cmac: PN data, most significant byte first (big endian, |
4064 | * reverse order than in packet) | 4100 | * reverse order than in packet) |
4101 | * @aes_gmac: PN data, most significant byte first (big endian, | ||
4102 | * reverse order than in packet) | ||
4103 | * @gcmp: PN data, most significant byte first (big endian, | ||
4104 | * reverse order than in packet) | ||
4065 | */ | 4105 | */ |
4066 | struct ieee80211_key_seq { | 4106 | struct ieee80211_key_seq { |
4067 | union { | 4107 | union { |
@@ -4075,6 +4115,12 @@ struct ieee80211_key_seq { | |||
4075 | struct { | 4115 | struct { |
4076 | u8 pn[6]; | 4116 | u8 pn[6]; |
4077 | } aes_cmac; | 4117 | } aes_cmac; |
4118 | struct { | ||
4119 | u8 pn[6]; | ||
4120 | } aes_gmac; | ||
4121 | struct { | ||
4122 | u8 pn[6]; | ||
4123 | } gcmp; | ||
4078 | }; | 4124 | }; |
4079 | }; | 4125 | }; |
4080 | 4126 | ||
@@ -4099,7 +4145,7 @@ void ieee80211_get_key_tx_seq(struct ieee80211_key_conf *keyconf, | |||
4099 | * ieee80211_get_key_rx_seq - get key RX sequence counter | 4145 | * ieee80211_get_key_rx_seq - get key RX sequence counter |
4100 | * | 4146 | * |
4101 | * @keyconf: the parameter passed with the set key | 4147 | * @keyconf: the parameter passed with the set key |
4102 | * @tid: The TID, or -1 for the management frame value (CCMP only); | 4148 | * @tid: The TID, or -1 for the management frame value (CCMP/GCMP only); |
4103 | * the value on TID 0 is also used for non-QoS frames. For | 4149 | * the value on TID 0 is also used for non-QoS frames. For |
4104 | * CMAC, only TID 0 is valid. | 4150 | * CMAC, only TID 0 is valid. |
4105 | * @seq: buffer to receive the sequence data | 4151 | * @seq: buffer to receive the sequence data |
@@ -4135,7 +4181,7 @@ void ieee80211_set_key_tx_seq(struct ieee80211_key_conf *keyconf, | |||
4135 | * ieee80211_set_key_rx_seq - set key RX sequence counter | 4181 | * ieee80211_set_key_rx_seq - set key RX sequence counter |
4136 | * | 4182 | * |
4137 | * @keyconf: the parameter passed with the set key | 4183 | * @keyconf: the parameter passed with the set key |
4138 | * @tid: The TID, or -1 for the management frame value (CCMP only); | 4184 | * @tid: The TID, or -1 for the management frame value (CCMP/GCMP only); |
4139 | * the value on TID 0 is also used for non-QoS frames. For | 4185 | * the value on TID 0 is also used for non-QoS frames. For |
4140 | * CMAC, only TID 0 is valid. | 4186 | * CMAC, only TID 0 is valid. |
4141 | * @seq: new sequence data | 4187 | * @seq: new sequence data |
diff --git a/include/net/mac802154.h b/include/net/mac802154.h index c823d910b46c..850647811749 100644 --- a/include/net/mac802154.h +++ b/include/net/mac802154.h | |||
@@ -20,6 +20,8 @@ | |||
20 | #include <linux/ieee802154.h> | 20 | #include <linux/ieee802154.h> |
21 | #include <linux/skbuff.h> | 21 | #include <linux/skbuff.h> |
22 | 22 | ||
23 | #include <net/cfg802154.h> | ||
24 | |||
23 | /* General MAC frame format: | 25 | /* General MAC frame format: |
24 | * 2 bytes: Frame Control | 26 | * 2 bytes: Frame Control |
25 | * 1 byte: Sequence Number | 27 | * 1 byte: Sequence Number |
@@ -212,7 +214,8 @@ struct ieee802154_ops { | |||
212 | unsigned long changed); | 214 | unsigned long changed); |
213 | int (*set_txpower)(struct ieee802154_hw *hw, int db); | 215 | int (*set_txpower)(struct ieee802154_hw *hw, int db); |
214 | int (*set_lbt)(struct ieee802154_hw *hw, bool on); | 216 | int (*set_lbt)(struct ieee802154_hw *hw, bool on); |
215 | int (*set_cca_mode)(struct ieee802154_hw *hw, u8 mode); | 217 | int (*set_cca_mode)(struct ieee802154_hw *hw, |
218 | const struct wpan_phy_cca *cca); | ||
216 | int (*set_cca_ed_level)(struct ieee802154_hw *hw, | 219 | int (*set_cca_ed_level)(struct ieee802154_hw *hw, |
217 | s32 level); | 220 | s32 level); |
218 | int (*set_csma_params)(struct ieee802154_hw *hw, | 221 | int (*set_csma_params)(struct ieee802154_hw *hw, |
diff --git a/include/net/net_namespace.h b/include/net/net_namespace.h index 2e8756b8c775..36faf4990c4b 100644 --- a/include/net/net_namespace.h +++ b/include/net/net_namespace.h | |||
@@ -60,6 +60,7 @@ struct net { | |||
60 | struct list_head exit_list; /* Use only net_mutex */ | 60 | struct list_head exit_list; /* Use only net_mutex */ |
61 | 61 | ||
62 | struct user_namespace *user_ns; /* Owning user namespace */ | 62 | struct user_namespace *user_ns; /* Owning user namespace */ |
63 | struct idr netns_ids; | ||
63 | 64 | ||
64 | struct ns_common ns; | 65 | struct ns_common ns; |
65 | 66 | ||
@@ -290,6 +291,9 @@ static inline struct net *read_pnet(struct net * const *pnet) | |||
290 | #define __net_initconst __initconst | 291 | #define __net_initconst __initconst |
291 | #endif | 292 | #endif |
292 | 293 | ||
294 | int peernet2id(struct net *net, struct net *peer); | ||
295 | struct net *get_net_ns_by_id(struct net *net, int id); | ||
296 | |||
293 | struct pernet_operations { | 297 | struct pernet_operations { |
294 | struct list_head list; | 298 | struct list_head list; |
295 | int (*init)(struct net *net); | 299 | int (*init)(struct net *net); |
diff --git a/include/net/netfilter/nf_conntrack.h b/include/net/netfilter/nf_conntrack.h index f0daed2b54d1..74f271a172dd 100644 --- a/include/net/netfilter/nf_conntrack.h +++ b/include/net/netfilter/nf_conntrack.h | |||
@@ -191,8 +191,6 @@ __nf_conntrack_find(struct net *net, u16 zone, | |||
191 | int nf_conntrack_hash_check_insert(struct nf_conn *ct); | 191 | int nf_conntrack_hash_check_insert(struct nf_conn *ct); |
192 | bool nf_ct_delete(struct nf_conn *ct, u32 pid, int report); | 192 | bool nf_ct_delete(struct nf_conn *ct, u32 pid, int report); |
193 | 193 | ||
194 | void nf_conntrack_flush_report(struct net *net, u32 portid, int report); | ||
195 | |||
196 | bool nf_ct_get_tuplepr(const struct sk_buff *skb, unsigned int nhoff, | 194 | bool nf_ct_get_tuplepr(const struct sk_buff *skb, unsigned int nhoff, |
197 | u_int16_t l3num, struct nf_conntrack_tuple *tuple); | 195 | u_int16_t l3num, struct nf_conntrack_tuple *tuple); |
198 | bool nf_ct_invert_tuplepr(struct nf_conntrack_tuple *inverse, | 196 | bool nf_ct_invert_tuplepr(struct nf_conntrack_tuple *inverse, |
diff --git a/include/net/netlink.h b/include/net/netlink.h index 64158353ecb2..e010ee8da41d 100644 --- a/include/net/netlink.h +++ b/include/net/netlink.h | |||
@@ -490,14 +490,10 @@ static inline struct sk_buff *nlmsg_new(size_t payload, gfp_t flags) | |||
490 | * Corrects the netlink message header to include the appeneded | 490 | * Corrects the netlink message header to include the appeneded |
491 | * attributes. Only necessary if attributes have been added to | 491 | * attributes. Only necessary if attributes have been added to |
492 | * the message. | 492 | * the message. |
493 | * | ||
494 | * Returns the total data length of the skb. | ||
495 | */ | 493 | */ |
496 | static inline int nlmsg_end(struct sk_buff *skb, struct nlmsghdr *nlh) | 494 | static inline void nlmsg_end(struct sk_buff *skb, struct nlmsghdr *nlh) |
497 | { | 495 | { |
498 | nlh->nlmsg_len = skb_tail_pointer(skb) - (unsigned char *)nlh; | 496 | nlh->nlmsg_len = skb_tail_pointer(skb) - (unsigned char *)nlh; |
499 | |||
500 | return skb->len; | ||
501 | } | 497 | } |
502 | 498 | ||
503 | /** | 499 | /** |
@@ -520,8 +516,10 @@ static inline void *nlmsg_get_pos(struct sk_buff *skb) | |||
520 | */ | 516 | */ |
521 | static inline void nlmsg_trim(struct sk_buff *skb, const void *mark) | 517 | static inline void nlmsg_trim(struct sk_buff *skb, const void *mark) |
522 | { | 518 | { |
523 | if (mark) | 519 | if (mark) { |
520 | WARN_ON((unsigned char *) mark < skb->data); | ||
524 | skb_trim(skb, (unsigned char *) mark - skb->data); | 521 | skb_trim(skb, (unsigned char *) mark - skb->data); |
522 | } | ||
525 | } | 523 | } |
526 | 524 | ||
527 | /** | 525 | /** |
diff --git a/include/net/netns/ipv4.h b/include/net/netns/ipv4.h index 0ffef1a38efc..dbe225478adb 100644 --- a/include/net/netns/ipv4.h +++ b/include/net/netns/ipv4.h | |||
@@ -48,7 +48,8 @@ struct netns_ipv4 { | |||
48 | struct hlist_head *fib_table_hash; | 48 | struct hlist_head *fib_table_hash; |
49 | struct sock *fibnl; | 49 | struct sock *fibnl; |
50 | 50 | ||
51 | struct sock **icmp_sk; | 51 | struct sock * __percpu *icmp_sk; |
52 | |||
52 | struct inet_peer_base *peers; | 53 | struct inet_peer_base *peers; |
53 | struct tcpm_hash_bucket *tcp_metrics_hash; | 54 | struct tcpm_hash_bucket *tcp_metrics_hash; |
54 | unsigned int tcp_metrics_hash_log; | 55 | unsigned int tcp_metrics_hash_log; |
@@ -81,6 +82,8 @@ struct netns_ipv4 { | |||
81 | 82 | ||
82 | int sysctl_fwmark_reflect; | 83 | int sysctl_fwmark_reflect; |
83 | int sysctl_tcp_fwmark_accept; | 84 | int sysctl_tcp_fwmark_accept; |
85 | int sysctl_tcp_mtu_probing; | ||
86 | int sysctl_tcp_base_mss; | ||
84 | 87 | ||
85 | struct ping_group_range ping_group_range; | 88 | struct ping_group_range ping_group_range; |
86 | 89 | ||
diff --git a/include/net/nfc/hci.h b/include/net/nfc/hci.h index 14bd0e1c47fa..ab672b537dd4 100644 --- a/include/net/nfc/hci.h +++ b/include/net/nfc/hci.h | |||
@@ -51,8 +51,10 @@ struct nfc_hci_ops { | |||
51 | int (*tm_send)(struct nfc_hci_dev *hdev, struct sk_buff *skb); | 51 | int (*tm_send)(struct nfc_hci_dev *hdev, struct sk_buff *skb); |
52 | int (*check_presence)(struct nfc_hci_dev *hdev, | 52 | int (*check_presence)(struct nfc_hci_dev *hdev, |
53 | struct nfc_target *target); | 53 | struct nfc_target *target); |
54 | int (*event_received)(struct nfc_hci_dev *hdev, u8 gate, u8 event, | 54 | int (*event_received)(struct nfc_hci_dev *hdev, u8 pipe, u8 event, |
55 | struct sk_buff *skb); | 55 | struct sk_buff *skb); |
56 | void (*cmd_received)(struct nfc_hci_dev *hdev, u8 pipe, u8 cmd, | ||
57 | struct sk_buff *skb); | ||
56 | int (*fw_download)(struct nfc_hci_dev *hdev, const char *firmware_name); | 58 | int (*fw_download)(struct nfc_hci_dev *hdev, const char *firmware_name); |
57 | int (*discover_se)(struct nfc_hci_dev *dev); | 59 | int (*discover_se)(struct nfc_hci_dev *dev); |
58 | int (*enable_se)(struct nfc_hci_dev *dev, u32 se_idx); | 60 | int (*enable_se)(struct nfc_hci_dev *dev, u32 se_idx); |
@@ -63,8 +65,10 @@ struct nfc_hci_ops { | |||
63 | }; | 65 | }; |
64 | 66 | ||
65 | /* Pipes */ | 67 | /* Pipes */ |
66 | #define NFC_HCI_INVALID_PIPE 0x80 | ||
67 | #define NFC_HCI_DO_NOT_CREATE_PIPE 0x81 | 68 | #define NFC_HCI_DO_NOT_CREATE_PIPE 0x81 |
69 | #define NFC_HCI_INVALID_PIPE 0x80 | ||
70 | #define NFC_HCI_INVALID_GATE 0xFF | ||
71 | #define NFC_HCI_INVALID_HOST 0x80 | ||
68 | #define NFC_HCI_LINK_MGMT_PIPE 0x00 | 72 | #define NFC_HCI_LINK_MGMT_PIPE 0x00 |
69 | #define NFC_HCI_ADMIN_PIPE 0x01 | 73 | #define NFC_HCI_ADMIN_PIPE 0x01 |
70 | 74 | ||
@@ -73,7 +77,13 @@ struct nfc_hci_gate { | |||
73 | u8 pipe; | 77 | u8 pipe; |
74 | }; | 78 | }; |
75 | 79 | ||
80 | struct nfc_hci_pipe { | ||
81 | u8 gate; | ||
82 | u8 dest_host; | ||
83 | }; | ||
84 | |||
76 | #define NFC_HCI_MAX_CUSTOM_GATES 50 | 85 | #define NFC_HCI_MAX_CUSTOM_GATES 50 |
86 | #define NFC_HCI_MAX_PIPES 127 | ||
77 | struct nfc_hci_init_data { | 87 | struct nfc_hci_init_data { |
78 | u8 gate_count; | 88 | u8 gate_count; |
79 | struct nfc_hci_gate gates[NFC_HCI_MAX_CUSTOM_GATES]; | 89 | struct nfc_hci_gate gates[NFC_HCI_MAX_CUSTOM_GATES]; |
@@ -125,6 +135,7 @@ struct nfc_hci_dev { | |||
125 | void *clientdata; | 135 | void *clientdata; |
126 | 136 | ||
127 | u8 gate2pipe[NFC_HCI_MAX_GATES]; | 137 | u8 gate2pipe[NFC_HCI_MAX_GATES]; |
138 | struct nfc_hci_pipe pipes[NFC_HCI_MAX_PIPES]; | ||
128 | 139 | ||
129 | u8 sw_romlib; | 140 | u8 sw_romlib; |
130 | u8 sw_patch; | 141 | u8 sw_patch; |
@@ -167,6 +178,8 @@ void *nfc_hci_get_clientdata(struct nfc_hci_dev *hdev); | |||
167 | void nfc_hci_driver_failure(struct nfc_hci_dev *hdev, int err); | 178 | void nfc_hci_driver_failure(struct nfc_hci_dev *hdev, int err); |
168 | 179 | ||
169 | int nfc_hci_result_to_errno(u8 result); | 180 | int nfc_hci_result_to_errno(u8 result); |
181 | void nfc_hci_reset_pipes(struct nfc_hci_dev *dev); | ||
182 | void nfc_hci_reset_pipes_per_host(struct nfc_hci_dev *hdev, u8 host); | ||
170 | 183 | ||
171 | /* Host IDs */ | 184 | /* Host IDs */ |
172 | #define NFC_HCI_HOST_CONTROLLER_ID 0x00 | 185 | #define NFC_HCI_HOST_CONTROLLER_ID 0x00 |
@@ -219,6 +232,12 @@ int nfc_hci_result_to_errno(u8 result); | |||
219 | #define NFC_HCI_EVT_POST_DATA 0x02 | 232 | #define NFC_HCI_EVT_POST_DATA 0x02 |
220 | #define NFC_HCI_EVT_HOT_PLUG 0x03 | 233 | #define NFC_HCI_EVT_HOT_PLUG 0x03 |
221 | 234 | ||
235 | /* Generic commands */ | ||
236 | #define NFC_HCI_ANY_SET_PARAMETER 0x01 | ||
237 | #define NFC_HCI_ANY_GET_PARAMETER 0x02 | ||
238 | #define NFC_HCI_ANY_OPEN_PIPE 0x03 | ||
239 | #define NFC_HCI_ANY_CLOSE_PIPE 0x04 | ||
240 | |||
222 | /* Reader RF gates events */ | 241 | /* Reader RF gates events */ |
223 | #define NFC_HCI_EVT_READER_REQUESTED 0x10 | 242 | #define NFC_HCI_EVT_READER_REQUESTED 0x10 |
224 | #define NFC_HCI_EVT_END_OPERATION 0x11 | 243 | #define NFC_HCI_EVT_END_OPERATION 0x11 |
@@ -249,8 +268,6 @@ int nfc_hci_send_cmd(struct nfc_hci_dev *hdev, u8 gate, u8 cmd, | |||
249 | int nfc_hci_send_cmd_async(struct nfc_hci_dev *hdev, u8 gate, u8 cmd, | 268 | int nfc_hci_send_cmd_async(struct nfc_hci_dev *hdev, u8 gate, u8 cmd, |
250 | const u8 *param, size_t param_len, | 269 | const u8 *param, size_t param_len, |
251 | data_exchange_cb_t cb, void *cb_context); | 270 | data_exchange_cb_t cb, void *cb_context); |
252 | int nfc_hci_send_response(struct nfc_hci_dev *hdev, u8 gate, u8 response, | ||
253 | const u8 *param, size_t param_len); | ||
254 | int nfc_hci_send_event(struct nfc_hci_dev *hdev, u8 gate, u8 event, | 271 | int nfc_hci_send_event(struct nfc_hci_dev *hdev, u8 gate, u8 event, |
255 | const u8 *param, size_t param_len); | 272 | const u8 *param, size_t param_len); |
256 | int nfc_hci_target_discovered(struct nfc_hci_dev *hdev, u8 gate); | 273 | int nfc_hci_target_discovered(struct nfc_hci_dev *hdev, u8 gate); |
diff --git a/include/net/nfc/nci.h b/include/net/nfc/nci.h index e7257a4653b4..a2f2f3d3196d 100644 --- a/include/net/nfc/nci.h +++ b/include/net/nfc/nci.h | |||
@@ -62,6 +62,25 @@ | |||
62 | #define NCI_STATUS_NFCEE_PROTOCOL_ERROR 0xc2 | 62 | #define NCI_STATUS_NFCEE_PROTOCOL_ERROR 0xc2 |
63 | #define NCI_STATUS_NFCEE_TIMEOUT_ERROR 0xc3 | 63 | #define NCI_STATUS_NFCEE_TIMEOUT_ERROR 0xc3 |
64 | 64 | ||
65 | /* NFCEE Interface/Protocols */ | ||
66 | #define NCI_NFCEE_INTERFACE_APDU 0x00 | ||
67 | #define NCI_NFCEE_INTERFACE_HCI_ACCESS 0x01 | ||
68 | #define NCI_NFCEE_INTERFACE_TYPE3_CMD_SET 0x02 | ||
69 | #define NCI_NFCEE_INTERFACE_TRANSPARENT 0x03 | ||
70 | |||
71 | /* Destination type */ | ||
72 | #define NCI_DESTINATION_NFCC_LOOPBACK 0x01 | ||
73 | #define NCI_DESTINATION_REMOTE_NFC_ENDPOINT 0x02 | ||
74 | #define NCI_DESTINATION_NFCEE 0x03 | ||
75 | |||
76 | /* Destination-specific parameters type */ | ||
77 | #define NCI_DESTINATION_SPECIFIC_PARAM_RF_TYPE 0x00 | ||
78 | #define NCI_DESTINATION_SPECIFIC_PARAM_NFCEE_TYPE 0x01 | ||
79 | |||
80 | /* NFCEE Discovery Action */ | ||
81 | #define NCI_NFCEE_DISCOVERY_ACTION_DISABLE 0x00 | ||
82 | #define NCI_NFCEE_DISCOVERY_ACTION_ENABLE 0x01 | ||
83 | |||
65 | /* NCI RF Technology and Mode */ | 84 | /* NCI RF Technology and Mode */ |
66 | #define NCI_NFC_A_PASSIVE_POLL_MODE 0x00 | 85 | #define NCI_NFC_A_PASSIVE_POLL_MODE 0x00 |
67 | #define NCI_NFC_B_PASSIVE_POLL_MODE 0x01 | 86 | #define NCI_NFC_B_PASSIVE_POLL_MODE 0x01 |
@@ -224,6 +243,28 @@ struct nci_core_set_config_cmd { | |||
224 | struct set_config_param param; /* support 1 param per cmd is enough */ | 243 | struct set_config_param param; /* support 1 param per cmd is enough */ |
225 | } __packed; | 244 | } __packed; |
226 | 245 | ||
246 | #define NCI_OP_CORE_CONN_CREATE_CMD nci_opcode_pack(NCI_GID_CORE, 0x04) | ||
247 | #define DEST_SPEC_PARAMS_ID_INDEX 0 | ||
248 | #define DEST_SPEC_PARAMS_PROTOCOL_INDEX 1 | ||
249 | struct dest_spec_params { | ||
250 | __u8 id; | ||
251 | __u8 protocol; | ||
252 | } __packed; | ||
253 | |||
254 | struct core_conn_create_dest_spec_params { | ||
255 | __u8 type; | ||
256 | __u8 length; | ||
257 | __u8 value[0]; | ||
258 | } __packed; | ||
259 | |||
260 | struct nci_core_conn_create_cmd { | ||
261 | __u8 destination_type; | ||
262 | __u8 number_destination_params; | ||
263 | struct core_conn_create_dest_spec_params params[0]; | ||
264 | } __packed; | ||
265 | |||
266 | #define NCI_OP_CORE_CONN_CLOSE_CMD nci_opcode_pack(NCI_GID_CORE, 0x05) | ||
267 | |||
227 | #define NCI_OP_RF_DISCOVER_MAP_CMD nci_opcode_pack(NCI_GID_RF_MGMT, 0x00) | 268 | #define NCI_OP_RF_DISCOVER_MAP_CMD nci_opcode_pack(NCI_GID_RF_MGMT, 0x00) |
228 | struct disc_map_config { | 269 | struct disc_map_config { |
229 | __u8 rf_protocol; | 270 | __u8 rf_protocol; |
@@ -260,6 +301,19 @@ struct nci_rf_deactivate_cmd { | |||
260 | __u8 type; | 301 | __u8 type; |
261 | } __packed; | 302 | } __packed; |
262 | 303 | ||
304 | #define NCI_OP_NFCEE_DISCOVER_CMD nci_opcode_pack(NCI_GID_NFCEE_MGMT, 0x00) | ||
305 | struct nci_nfcee_discover_cmd { | ||
306 | __u8 discovery_action; | ||
307 | } __packed; | ||
308 | |||
309 | #define NCI_OP_NFCEE_MODE_SET_CMD nci_opcode_pack(NCI_GID_NFCEE_MGMT, 0x01) | ||
310 | #define NCI_NFCEE_DISABLE 0x00 | ||
311 | #define NCI_NFCEE_ENABLE 0x01 | ||
312 | struct nci_nfcee_mode_set_cmd { | ||
313 | __u8 nfcee_id; | ||
314 | __u8 nfcee_mode; | ||
315 | } __packed; | ||
316 | |||
263 | /* ----------------------- */ | 317 | /* ----------------------- */ |
264 | /* ---- NCI Responses ---- */ | 318 | /* ---- NCI Responses ---- */ |
265 | /* ----------------------- */ | 319 | /* ----------------------- */ |
@@ -295,6 +349,16 @@ struct nci_core_set_config_rsp { | |||
295 | __u8 params_id[0]; /* variable size array */ | 349 | __u8 params_id[0]; /* variable size array */ |
296 | } __packed; | 350 | } __packed; |
297 | 351 | ||
352 | #define NCI_OP_CORE_CONN_CREATE_RSP nci_opcode_pack(NCI_GID_CORE, 0x04) | ||
353 | struct nci_core_conn_create_rsp { | ||
354 | __u8 status; | ||
355 | __u8 max_ctrl_pkt_payload_len; | ||
356 | __u8 credits_cnt; | ||
357 | __u8 conn_id; | ||
358 | } __packed; | ||
359 | |||
360 | #define NCI_OP_CORE_CONN_CLOSE_RSP nci_opcode_pack(NCI_GID_CORE, 0x05) | ||
361 | |||
298 | #define NCI_OP_RF_DISCOVER_MAP_RSP nci_opcode_pack(NCI_GID_RF_MGMT, 0x00) | 362 | #define NCI_OP_RF_DISCOVER_MAP_RSP nci_opcode_pack(NCI_GID_RF_MGMT, 0x00) |
299 | 363 | ||
300 | #define NCI_OP_RF_DISCOVER_RSP nci_opcode_pack(NCI_GID_RF_MGMT, 0x03) | 364 | #define NCI_OP_RF_DISCOVER_RSP nci_opcode_pack(NCI_GID_RF_MGMT, 0x03) |
@@ -303,6 +367,13 @@ struct nci_core_set_config_rsp { | |||
303 | 367 | ||
304 | #define NCI_OP_RF_DEACTIVATE_RSP nci_opcode_pack(NCI_GID_RF_MGMT, 0x06) | 368 | #define NCI_OP_RF_DEACTIVATE_RSP nci_opcode_pack(NCI_GID_RF_MGMT, 0x06) |
305 | 369 | ||
370 | #define NCI_OP_NFCEE_DISCOVER_RSP nci_opcode_pack(NCI_GID_NFCEE_MGMT, 0x00) | ||
371 | struct nci_nfcee_discover_rsp { | ||
372 | __u8 status; | ||
373 | __u8 num_nfcee; | ||
374 | } __packed; | ||
375 | |||
376 | #define NCI_OP_NFCEE_MODE_SET_RSP nci_opcode_pack(NCI_GID_NFCEE_MGMT, 0x01) | ||
306 | /* --------------------------- */ | 377 | /* --------------------------- */ |
307 | /* ---- NCI Notifications ---- */ | 378 | /* ---- NCI Notifications ---- */ |
308 | /* --------------------------- */ | 379 | /* --------------------------- */ |
@@ -430,4 +501,30 @@ struct nci_rf_deactivate_ntf { | |||
430 | __u8 reason; | 501 | __u8 reason; |
431 | } __packed; | 502 | } __packed; |
432 | 503 | ||
504 | #define NCI_OP_RF_NFCEE_ACTION_NTF nci_opcode_pack(NCI_GID_RF_MGMT, 0x09) | ||
505 | struct nci_rf_nfcee_action_ntf { | ||
506 | __u8 nfcee_id; | ||
507 | __u8 trigger; | ||
508 | __u8 supported_data_length; | ||
509 | __u8 supported_data[0]; | ||
510 | } __packed; | ||
511 | |||
512 | #define NCI_OP_NFCEE_DISCOVER_NTF nci_opcode_pack(NCI_GID_NFCEE_MGMT, 0x00) | ||
513 | struct nci_nfcee_supported_protocol { | ||
514 | __u8 num_protocol; | ||
515 | __u8 supported_protocol[0]; | ||
516 | } __packed; | ||
517 | |||
518 | struct nci_nfcee_information_tlv { | ||
519 | __u8 num_tlv; | ||
520 | __u8 information_tlv[0]; | ||
521 | } __packed; | ||
522 | |||
523 | struct nci_nfcee_discover_ntf { | ||
524 | __u8 nfcee_id; | ||
525 | __u8 nfcee_status; | ||
526 | struct nci_nfcee_supported_protocol supported_protocols; | ||
527 | struct nci_nfcee_information_tlv information_tlv; | ||
528 | } __packed; | ||
529 | |||
433 | #endif /* __NCI_H */ | 530 | #endif /* __NCI_H */ |
diff --git a/include/net/nfc/nci_core.h b/include/net/nfc/nci_core.h index 9e51bb4d841e..ff87f8611fa3 100644 --- a/include/net/nfc/nci_core.h +++ b/include/net/nfc/nci_core.h | |||
@@ -78,15 +78,107 @@ struct nci_ops { | |||
78 | int (*se_io)(struct nci_dev *ndev, u32 se_idx, | 78 | int (*se_io)(struct nci_dev *ndev, u32 se_idx, |
79 | u8 *apdu, size_t apdu_length, | 79 | u8 *apdu, size_t apdu_length, |
80 | se_io_cb_t cb, void *cb_context); | 80 | se_io_cb_t cb, void *cb_context); |
81 | int (*hci_load_session)(struct nci_dev *ndev); | ||
82 | void (*hci_event_received)(struct nci_dev *ndev, u8 pipe, u8 event, | ||
83 | struct sk_buff *skb); | ||
84 | void (*hci_cmd_received)(struct nci_dev *ndev, u8 pipe, u8 cmd, | ||
85 | struct sk_buff *skb); | ||
81 | }; | 86 | }; |
82 | 87 | ||
83 | #define NCI_MAX_SUPPORTED_RF_INTERFACES 4 | 88 | #define NCI_MAX_SUPPORTED_RF_INTERFACES 4 |
84 | #define NCI_MAX_DISCOVERED_TARGETS 10 | 89 | #define NCI_MAX_DISCOVERED_TARGETS 10 |
90 | #define NCI_MAX_NUM_NFCEE 255 | ||
91 | #define NCI_MAX_CONN_ID 7 | ||
92 | |||
93 | struct nci_conn_info { | ||
94 | struct list_head list; | ||
95 | __u8 id; /* can be an RF Discovery ID or an NFCEE ID */ | ||
96 | __u8 conn_id; | ||
97 | __u8 max_pkt_payload_len; | ||
98 | |||
99 | atomic_t credits_cnt; | ||
100 | __u8 initial_num_credits; | ||
101 | |||
102 | data_exchange_cb_t data_exchange_cb; | ||
103 | void *data_exchange_cb_context; | ||
104 | |||
105 | struct sk_buff *rx_skb; | ||
106 | }; | ||
107 | |||
108 | #define NCI_INVALID_CONN_ID 0x80 | ||
109 | |||
110 | #define NCI_HCI_ANY_OPEN_PIPE 0x03 | ||
111 | |||
112 | /* Gates */ | ||
113 | #define NCI_HCI_ADMIN_GATE 0x00 | ||
114 | #define NCI_HCI_LINK_MGMT_GATE 0x06 | ||
115 | |||
116 | /* Pipes */ | ||
117 | #define NCI_HCI_LINK_MGMT_PIPE 0x00 | ||
118 | #define NCI_HCI_ADMIN_PIPE 0x01 | ||
119 | |||
120 | /* Generic responses */ | ||
121 | #define NCI_HCI_ANY_OK 0x00 | ||
122 | #define NCI_HCI_ANY_E_NOT_CONNECTED 0x01 | ||
123 | #define NCI_HCI_ANY_E_CMD_PAR_UNKNOWN 0x02 | ||
124 | #define NCI_HCI_ANY_E_NOK 0x03 | ||
125 | #define NCI_HCI_ANY_E_PIPES_FULL 0x04 | ||
126 | #define NCI_HCI_ANY_E_REG_PAR_UNKNOWN 0x05 | ||
127 | #define NCI_HCI_ANY_E_PIPE_NOT_OPENED 0x06 | ||
128 | #define NCI_HCI_ANY_E_CMD_NOT_SUPPORTED 0x07 | ||
129 | #define NCI_HCI_ANY_E_INHIBITED 0x08 | ||
130 | #define NCI_HCI_ANY_E_TIMEOUT 0x09 | ||
131 | #define NCI_HCI_ANY_E_REG_ACCESS_DENIED 0x0a | ||
132 | #define NCI_HCI_ANY_E_PIPE_ACCESS_DENIED 0x0b | ||
133 | |||
134 | #define NCI_HCI_DO_NOT_OPEN_PIPE 0x81 | ||
135 | #define NCI_HCI_INVALID_PIPE 0x80 | ||
136 | #define NCI_HCI_INVALID_GATE 0xFF | ||
137 | #define NCI_HCI_INVALID_HOST 0x80 | ||
138 | |||
139 | #define NCI_HCI_MAX_CUSTOM_GATES 50 | ||
140 | #define NCI_HCI_MAX_PIPES 127 | ||
141 | |||
142 | struct nci_hci_gate { | ||
143 | u8 gate; | ||
144 | u8 pipe; | ||
145 | u8 dest_host; | ||
146 | } __packed; | ||
147 | |||
148 | struct nci_hci_pipe { | ||
149 | u8 gate; | ||
150 | u8 host; | ||
151 | } __packed; | ||
152 | |||
153 | struct nci_hci_init_data { | ||
154 | u8 gate_count; | ||
155 | struct nci_hci_gate gates[NCI_HCI_MAX_CUSTOM_GATES]; | ||
156 | char session_id[9]; | ||
157 | }; | ||
158 | |||
159 | #define NCI_HCI_MAX_GATES 256 | ||
160 | |||
161 | struct nci_hci_dev { | ||
162 | u8 nfcee_id; | ||
163 | struct nci_dev *ndev; | ||
164 | struct nci_conn_info *conn_info; | ||
165 | |||
166 | struct nci_hci_init_data init_data; | ||
167 | struct nci_hci_pipe pipes[NCI_HCI_MAX_PIPES]; | ||
168 | u8 gate2pipe[NCI_HCI_MAX_GATES]; | ||
169 | int expected_pipes; | ||
170 | int count_pipes; | ||
171 | |||
172 | struct sk_buff_head rx_hcp_frags; | ||
173 | struct work_struct msg_rx_work; | ||
174 | struct sk_buff_head msg_rx_queue; | ||
175 | }; | ||
85 | 176 | ||
86 | /* NCI Core structures */ | 177 | /* NCI Core structures */ |
87 | struct nci_dev { | 178 | struct nci_dev { |
88 | struct nfc_dev *nfc_dev; | 179 | struct nfc_dev *nfc_dev; |
89 | struct nci_ops *ops; | 180 | struct nci_ops *ops; |
181 | struct nci_hci_dev *hci_dev; | ||
90 | 182 | ||
91 | int tx_headroom; | 183 | int tx_headroom; |
92 | int tx_tailroom; | 184 | int tx_tailroom; |
@@ -95,7 +187,10 @@ struct nci_dev { | |||
95 | unsigned long flags; | 187 | unsigned long flags; |
96 | 188 | ||
97 | atomic_t cmd_cnt; | 189 | atomic_t cmd_cnt; |
98 | atomic_t credits_cnt; | 190 | __u8 cur_conn_id; |
191 | |||
192 | struct list_head conn_info_list; | ||
193 | struct nci_conn_info *rf_conn_info; | ||
99 | 194 | ||
100 | struct timer_list cmd_timer; | 195 | struct timer_list cmd_timer; |
101 | struct timer_list data_timer; | 196 | struct timer_list data_timer; |
@@ -141,13 +236,10 @@ struct nci_dev { | |||
141 | __u8 manufact_id; | 236 | __u8 manufact_id; |
142 | __u32 manufact_specific_info; | 237 | __u32 manufact_specific_info; |
143 | 238 | ||
144 | /* received during NCI_OP_RF_INTF_ACTIVATED_NTF */ | 239 | /* Save RF Discovery ID or NFCEE ID under conn_create */ |
145 | __u8 max_data_pkt_payload_size; | 240 | __u8 cur_id; |
146 | __u8 initial_num_credits; | ||
147 | 241 | ||
148 | /* stored during nci_data_exchange */ | 242 | /* stored during nci_data_exchange */ |
149 | data_exchange_cb_t data_exchange_cb; | ||
150 | void *data_exchange_cb_context; | ||
151 | struct sk_buff *rx_data_reassembly; | 243 | struct sk_buff *rx_data_reassembly; |
152 | 244 | ||
153 | /* stored during intf_activated_ntf */ | 245 | /* stored during intf_activated_ntf */ |
@@ -163,9 +255,36 @@ struct nci_dev *nci_allocate_device(struct nci_ops *ops, | |||
163 | void nci_free_device(struct nci_dev *ndev); | 255 | void nci_free_device(struct nci_dev *ndev); |
164 | int nci_register_device(struct nci_dev *ndev); | 256 | int nci_register_device(struct nci_dev *ndev); |
165 | void nci_unregister_device(struct nci_dev *ndev); | 257 | void nci_unregister_device(struct nci_dev *ndev); |
258 | int nci_request(struct nci_dev *ndev, | ||
259 | void (*req)(struct nci_dev *ndev, | ||
260 | unsigned long opt), | ||
261 | unsigned long opt, __u32 timeout); | ||
166 | int nci_recv_frame(struct nci_dev *ndev, struct sk_buff *skb); | 262 | int nci_recv_frame(struct nci_dev *ndev, struct sk_buff *skb); |
167 | int nci_set_config(struct nci_dev *ndev, __u8 id, size_t len, __u8 *val); | 263 | int nci_set_config(struct nci_dev *ndev, __u8 id, size_t len, __u8 *val); |
168 | 264 | ||
265 | int nci_nfcee_discover(struct nci_dev *ndev, u8 action); | ||
266 | int nci_nfcee_mode_set(struct nci_dev *ndev, u8 nfcee_id, u8 nfcee_mode); | ||
267 | int nci_core_conn_create(struct nci_dev *ndev, u8 destination_type, | ||
268 | u8 number_destination_params, | ||
269 | size_t params_len, | ||
270 | struct core_conn_create_dest_spec_params *params); | ||
271 | int nci_core_conn_close(struct nci_dev *ndev, u8 conn_id); | ||
272 | |||
273 | struct nci_hci_dev *nci_hci_allocate(struct nci_dev *ndev); | ||
274 | int nci_hci_send_event(struct nci_dev *ndev, u8 gate, u8 event, | ||
275 | const u8 *param, size_t param_len); | ||
276 | int nci_hci_send_cmd(struct nci_dev *ndev, u8 gate, | ||
277 | u8 cmd, const u8 *param, size_t param_len, | ||
278 | struct sk_buff **skb); | ||
279 | int nci_hci_open_pipe(struct nci_dev *ndev, u8 pipe); | ||
280 | int nci_hci_connect_gate(struct nci_dev *ndev, u8 dest_host, | ||
281 | u8 dest_gate, u8 pipe); | ||
282 | int nci_hci_set_param(struct nci_dev *ndev, u8 gate, u8 idx, | ||
283 | const u8 *param, size_t param_len); | ||
284 | int nci_hci_get_param(struct nci_dev *ndev, u8 gate, u8 idx, | ||
285 | struct sk_buff **skb); | ||
286 | int nci_hci_dev_session_init(struct nci_dev *ndev); | ||
287 | |||
169 | static inline struct sk_buff *nci_skb_alloc(struct nci_dev *ndev, | 288 | static inline struct sk_buff *nci_skb_alloc(struct nci_dev *ndev, |
170 | unsigned int len, | 289 | unsigned int len, |
171 | gfp_t how) | 290 | gfp_t how) |
@@ -200,7 +319,9 @@ void nci_rx_data_packet(struct nci_dev *ndev, struct sk_buff *skb); | |||
200 | int nci_send_cmd(struct nci_dev *ndev, __u16 opcode, __u8 plen, void *payload); | 319 | int nci_send_cmd(struct nci_dev *ndev, __u16 opcode, __u8 plen, void *payload); |
201 | int nci_send_data(struct nci_dev *ndev, __u8 conn_id, struct sk_buff *skb); | 320 | int nci_send_data(struct nci_dev *ndev, __u8 conn_id, struct sk_buff *skb); |
202 | void nci_data_exchange_complete(struct nci_dev *ndev, struct sk_buff *skb, | 321 | void nci_data_exchange_complete(struct nci_dev *ndev, struct sk_buff *skb, |
203 | int err); | 322 | __u8 conn_id, int err); |
323 | void nci_hci_data_received_cb(void *context, struct sk_buff *skb, int err); | ||
324 | |||
204 | void nci_clear_target_list(struct nci_dev *ndev); | 325 | void nci_clear_target_list(struct nci_dev *ndev); |
205 | 326 | ||
206 | /* ----- NCI requests ----- */ | 327 | /* ----- NCI requests ----- */ |
@@ -209,6 +330,8 @@ void nci_clear_target_list(struct nci_dev *ndev); | |||
209 | #define NCI_REQ_CANCELED 2 | 330 | #define NCI_REQ_CANCELED 2 |
210 | 331 | ||
211 | void nci_req_complete(struct nci_dev *ndev, int result); | 332 | void nci_req_complete(struct nci_dev *ndev, int result); |
333 | struct nci_conn_info *nci_get_conn_info_by_conn_id(struct nci_dev *ndev, | ||
334 | int conn_id); | ||
212 | 335 | ||
213 | /* ----- NCI status code ----- */ | 336 | /* ----- NCI status code ----- */ |
214 | int nci_to_errno(__u8 code); | 337 | int nci_to_errno(__u8 code); |
diff --git a/include/net/nfc/nfc.h b/include/net/nfc/nfc.h index 12adb817c27a..73190e65d5c1 100644 --- a/include/net/nfc/nfc.h +++ b/include/net/nfc/nfc.h | |||
@@ -135,6 +135,31 @@ struct nfc_se { | |||
135 | u16 state; | 135 | u16 state; |
136 | }; | 136 | }; |
137 | 137 | ||
138 | /** | ||
139 | * nfc_evt_transaction - A struct for NFC secure element event transaction. | ||
140 | * | ||
141 | * @aid: The application identifier triggering the event | ||
142 | * | ||
143 | * @aid_len: The application identifier length [5:16] | ||
144 | * | ||
145 | * @params: The application parameters transmitted during the transaction | ||
146 | * | ||
147 | * @params_len: The applications parameters length [0:255] | ||
148 | * | ||
149 | */ | ||
150 | #define NFC_MIN_AID_LENGTH 5 | ||
151 | #define NFC_MAX_AID_LENGTH 16 | ||
152 | #define NFC_MAX_PARAMS_LENGTH 255 | ||
153 | |||
154 | #define NFC_EVT_TRANSACTION_AID_TAG 0x81 | ||
155 | #define NFC_EVT_TRANSACTION_PARAMS_TAG 0x82 | ||
156 | struct nfc_evt_transaction { | ||
157 | u32 aid_len; | ||
158 | u8 aid[NFC_MAX_AID_LENGTH]; | ||
159 | u8 params_len; | ||
160 | u8 params[NFC_MAX_PARAMS_LENGTH]; | ||
161 | } __packed; | ||
162 | |||
138 | struct nfc_genl_data { | 163 | struct nfc_genl_data { |
139 | u32 poll_req_portid; | 164 | u32 poll_req_portid; |
140 | struct mutex genl_data_mutex; | 165 | struct mutex genl_data_mutex; |
@@ -262,6 +287,8 @@ int nfc_tm_data_received(struct nfc_dev *dev, struct sk_buff *skb); | |||
262 | 287 | ||
263 | void nfc_driver_failure(struct nfc_dev *dev, int err); | 288 | void nfc_driver_failure(struct nfc_dev *dev, int err); |
264 | 289 | ||
290 | int nfc_se_transaction(struct nfc_dev *dev, u8 se_idx, | ||
291 | struct nfc_evt_transaction *evt_transaction); | ||
265 | int nfc_add_se(struct nfc_dev *dev, u32 se_idx, u16 type); | 292 | int nfc_add_se(struct nfc_dev *dev, u32 se_idx, u16 type); |
266 | int nfc_remove_se(struct nfc_dev *dev, u32 se_idx); | 293 | int nfc_remove_se(struct nfc_dev *dev, u32 se_idx); |
267 | struct nfc_se *nfc_find_se(struct nfc_dev *dev, u32 se_idx); | 294 | struct nfc_se *nfc_find_se(struct nfc_dev *dev, u32 se_idx); |
diff --git a/include/net/nl802154.h b/include/net/nl802154.h index 6dbd406ca41b..f8b5bc997959 100644 --- a/include/net/nl802154.h +++ b/include/net/nl802154.h | |||
@@ -82,7 +82,7 @@ enum nl802154_attrs { | |||
82 | NL802154_ATTR_TX_POWER, | 82 | NL802154_ATTR_TX_POWER, |
83 | 83 | ||
84 | NL802154_ATTR_CCA_MODE, | 84 | NL802154_ATTR_CCA_MODE, |
85 | NL802154_ATTR_CCA_MODE3_AND, | 85 | NL802154_ATTR_CCA_OPT, |
86 | NL802154_ATTR_CCA_ED_LEVEL, | 86 | NL802154_ATTR_CCA_ED_LEVEL, |
87 | 87 | ||
88 | NL802154_ATTR_MAX_FRAME_RETRIES, | 88 | NL802154_ATTR_MAX_FRAME_RETRIES, |
@@ -119,4 +119,47 @@ enum nl802154_iftype { | |||
119 | NL802154_IFTYPE_MAX = NUM_NL802154_IFTYPES - 1 | 119 | NL802154_IFTYPE_MAX = NUM_NL802154_IFTYPES - 1 |
120 | }; | 120 | }; |
121 | 121 | ||
122 | /** | ||
123 | * enum nl802154_cca_modes - cca modes | ||
124 | * | ||
125 | * @__NL802154_CCA_INVALID: cca mode number 0 is reserved | ||
126 | * @NL802154_CCA_ENERGY: Energy above threshold | ||
127 | * @NL802154_CCA_CARRIER: Carrier sense only | ||
128 | * @NL802154_CCA_ENERGY_CARRIER: Carrier sense with energy above threshold | ||
129 | * @NL802154_CCA_ALOHA: CCA shall always report an idle medium | ||
130 | * @NL802154_CCA_UWB_SHR: UWB preamble sense based on the SHR of a frame | ||
131 | * @NL802154_CCA_UWB_MULTIPEXED: UWB preamble sense based on the packet with | ||
132 | * the multiplexed preamble | ||
133 | * @__NL802154_CCA_ATTR_AFTER_LAST: Internal | ||
134 | * @NL802154_CCA_ATTR_MAX: Maximum CCA attribute number | ||
135 | */ | ||
136 | enum nl802154_cca_modes { | ||
137 | __NL802154_CCA_INVALID, | ||
138 | NL802154_CCA_ENERGY, | ||
139 | NL802154_CCA_CARRIER, | ||
140 | NL802154_CCA_ENERGY_CARRIER, | ||
141 | NL802154_CCA_ALOHA, | ||
142 | NL802154_CCA_UWB_SHR, | ||
143 | NL802154_CCA_UWB_MULTIPEXED, | ||
144 | |||
145 | /* keep last */ | ||
146 | __NL802154_CCA_ATTR_AFTER_LAST, | ||
147 | NL802154_CCA_ATTR_MAX = __NL802154_CCA_ATTR_AFTER_LAST - 1 | ||
148 | }; | ||
149 | |||
150 | /** | ||
151 | * enum nl802154_cca_opts - additional options for cca modes | ||
152 | * | ||
153 | * @NL802154_CCA_OPT_ENERGY_CARRIER_OR: NL802154_CCA_ENERGY_CARRIER with OR | ||
154 | * @NL802154_CCA_OPT_ENERGY_CARRIER_AND: NL802154_CCA_ENERGY_CARRIER with AND | ||
155 | */ | ||
156 | enum nl802154_cca_opts { | ||
157 | NL802154_CCA_OPT_ENERGY_CARRIER_AND, | ||
158 | NL802154_CCA_OPT_ENERGY_CARRIER_OR, | ||
159 | |||
160 | /* keep last */ | ||
161 | __NL802154_CCA_OPT_ATTR_AFTER_LAST, | ||
162 | NL802154_CCA_OPT_ATTR_MAX = __NL802154_CCA_OPT_ATTR_AFTER_LAST - 1 | ||
163 | }; | ||
164 | |||
122 | #endif /* __NL802154_H */ | 165 | #endif /* __NL802154_H */ |
diff --git a/include/net/ping.h b/include/net/ping.h index f074060bc5de..cc16d413f681 100644 --- a/include/net/ping.h +++ b/include/net/ping.h | |||
@@ -59,7 +59,7 @@ extern struct pingv6_ops pingv6_ops; | |||
59 | 59 | ||
60 | struct pingfakehdr { | 60 | struct pingfakehdr { |
61 | struct icmphdr icmph; | 61 | struct icmphdr icmph; |
62 | struct iovec *iov; | 62 | struct msghdr *msg; |
63 | sa_family_t family; | 63 | sa_family_t family; |
64 | __wsum wcheck; | 64 | __wsum wcheck; |
65 | }; | 65 | }; |
diff --git a/include/net/pkt_sched.h b/include/net/pkt_sched.h index 27a33833ff4a..2342bf12cb78 100644 --- a/include/net/pkt_sched.h +++ b/include/net/pkt_sched.h | |||
@@ -3,6 +3,7 @@ | |||
3 | 3 | ||
4 | #include <linux/jiffies.h> | 4 | #include <linux/jiffies.h> |
5 | #include <linux/ktime.h> | 5 | #include <linux/ktime.h> |
6 | #include <linux/if_vlan.h> | ||
6 | #include <net/sch_generic.h> | 7 | #include <net/sch_generic.h> |
7 | 8 | ||
8 | struct qdisc_walker { | 9 | struct qdisc_walker { |
@@ -114,6 +115,17 @@ int tc_classify_compat(struct sk_buff *skb, const struct tcf_proto *tp, | |||
114 | int tc_classify(struct sk_buff *skb, const struct tcf_proto *tp, | 115 | int tc_classify(struct sk_buff *skb, const struct tcf_proto *tp, |
115 | struct tcf_result *res); | 116 | struct tcf_result *res); |
116 | 117 | ||
118 | static inline __be16 tc_skb_protocol(const struct sk_buff *skb) | ||
119 | { | ||
120 | /* We need to take extra care in case the skb came via | ||
121 | * vlan accelerated path. In that case, use skb->vlan_proto | ||
122 | * as the original vlan header was already stripped. | ||
123 | */ | ||
124 | if (skb_vlan_tag_present(skb)) | ||
125 | return skb->vlan_proto; | ||
126 | return skb->protocol; | ||
127 | } | ||
128 | |||
117 | /* Calculate maximal size of packet seen by hard_start_xmit | 129 | /* Calculate maximal size of packet seen by hard_start_xmit |
118 | routine of this device. | 130 | routine of this device. |
119 | */ | 131 | */ |
diff --git a/include/net/regulatory.h b/include/net/regulatory.h index b776d72d84be..ebc5a2ed8631 100644 --- a/include/net/regulatory.h +++ b/include/net/regulatory.h | |||
@@ -147,6 +147,24 @@ struct regulatory_request { | |||
147 | * NL80211_IFTYPE_P2P_CLIENT, NL80211_IFTYPE_P2P_GO, | 147 | * NL80211_IFTYPE_P2P_CLIENT, NL80211_IFTYPE_P2P_GO, |
148 | * NL80211_IFTYPE_P2P_DEVICE. The flag will be set by default if a device | 148 | * NL80211_IFTYPE_P2P_DEVICE. The flag will be set by default if a device |
149 | * includes any modes unsupported for enforcement checking. | 149 | * includes any modes unsupported for enforcement checking. |
150 | * @REGULATORY_WIPHY_SELF_MANAGED: for devices that employ wiphy-specific | ||
151 | * regdom management. These devices will ignore all regdom changes not | ||
152 | * originating from their own wiphy. | ||
153 | * A self-managed wiphys only employs regulatory information obtained from | ||
154 | * the FW and driver and does not use other cfg80211 sources like | ||
155 | * beacon-hints, country-code IEs and hints from other devices on the same | ||
156 | * system. Conversely, a self-managed wiphy does not share its regulatory | ||
157 | * hints with other devices in the system. If a system contains several | ||
158 | * devices, one or more of which are self-managed, there might be | ||
159 | * contradictory regulatory settings between them. Usage of flag is | ||
160 | * generally discouraged. Only use it if the FW/driver is incompatible | ||
161 | * with non-locally originated hints. | ||
162 | * This flag is incompatible with the flags: %REGULATORY_CUSTOM_REG, | ||
163 | * %REGULATORY_STRICT_REG, %REGULATORY_COUNTRY_IE_FOLLOW_POWER, | ||
164 | * %REGULATORY_COUNTRY_IE_IGNORE and %REGULATORY_DISABLE_BEACON_HINTS. | ||
165 | * Mixing any of the above flags with this flag will result in a failure | ||
166 | * to register the wiphy. This flag implies | ||
167 | * %REGULATORY_DISABLE_BEACON_HINTS and %REGULATORY_COUNTRY_IE_IGNORE. | ||
150 | */ | 168 | */ |
151 | enum ieee80211_regulatory_flags { | 169 | enum ieee80211_regulatory_flags { |
152 | REGULATORY_CUSTOM_REG = BIT(0), | 170 | REGULATORY_CUSTOM_REG = BIT(0), |
@@ -156,6 +174,7 @@ enum ieee80211_regulatory_flags { | |||
156 | REGULATORY_COUNTRY_IE_IGNORE = BIT(4), | 174 | REGULATORY_COUNTRY_IE_IGNORE = BIT(4), |
157 | REGULATORY_ENABLE_RELAX_NO_IR = BIT(5), | 175 | REGULATORY_ENABLE_RELAX_NO_IR = BIT(5), |
158 | REGULATORY_IGNORE_STALE_KICKOFF = BIT(6), | 176 | REGULATORY_IGNORE_STALE_KICKOFF = BIT(6), |
177 | REGULATORY_WIPHY_SELF_MANAGED = BIT(7), | ||
159 | }; | 178 | }; |
160 | 179 | ||
161 | struct ieee80211_freq_range { | 180 | struct ieee80211_freq_range { |
diff --git a/include/net/route.h b/include/net/route.h index b17cf28f996e..fe22d03afb6a 100644 --- a/include/net/route.h +++ b/include/net/route.h | |||
@@ -46,6 +46,7 @@ | |||
46 | 46 | ||
47 | struct fib_nh; | 47 | struct fib_nh; |
48 | struct fib_info; | 48 | struct fib_info; |
49 | struct uncached_list; | ||
49 | struct rtable { | 50 | struct rtable { |
50 | struct dst_entry dst; | 51 | struct dst_entry dst; |
51 | 52 | ||
@@ -64,6 +65,7 @@ struct rtable { | |||
64 | u32 rt_pmtu; | 65 | u32 rt_pmtu; |
65 | 66 | ||
66 | struct list_head rt_uncached; | 67 | struct list_head rt_uncached; |
68 | struct uncached_list *rt_uncached_list; | ||
67 | }; | 69 | }; |
68 | 70 | ||
69 | static inline bool rt_is_input_route(const struct rtable *rt) | 71 | static inline bool rt_is_input_route(const struct rtable *rt) |
diff --git a/include/net/rtnetlink.h b/include/net/rtnetlink.h index e21b9f9653c0..6c6d5393fc34 100644 --- a/include/net/rtnetlink.h +++ b/include/net/rtnetlink.h | |||
@@ -46,6 +46,7 @@ static inline int rtnl_msg_family(const struct nlmsghdr *nlh) | |||
46 | * to create when creating a new device. | 46 | * to create when creating a new device. |
47 | * @get_num_rx_queues: Function to determine number of receive queues | 47 | * @get_num_rx_queues: Function to determine number of receive queues |
48 | * to create when creating a new device. | 48 | * to create when creating a new device. |
49 | * @get_link_net: Function to get the i/o netns of the device | ||
49 | */ | 50 | */ |
50 | struct rtnl_link_ops { | 51 | struct rtnl_link_ops { |
51 | struct list_head list; | 52 | struct list_head list; |
@@ -93,6 +94,7 @@ struct rtnl_link_ops { | |||
93 | int (*fill_slave_info)(struct sk_buff *skb, | 94 | int (*fill_slave_info)(struct sk_buff *skb, |
94 | const struct net_device *dev, | 95 | const struct net_device *dev, |
95 | const struct net_device *slave_dev); | 96 | const struct net_device *slave_dev); |
97 | struct net *(*get_link_net)(const struct net_device *dev); | ||
96 | }; | 98 | }; |
97 | 99 | ||
98 | int __rtnl_link_register(struct rtnl_link_ops *ops); | 100 | int __rtnl_link_register(struct rtnl_link_ops *ops); |
diff --git a/include/net/sock.h b/include/net/sock.h index 2210fec65669..ab186b1d31ff 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
@@ -857,18 +857,6 @@ static inline void sock_rps_record_flow_hash(__u32 hash) | |||
857 | #endif | 857 | #endif |
858 | } | 858 | } |
859 | 859 | ||
860 | static inline void sock_rps_reset_flow_hash(__u32 hash) | ||
861 | { | ||
862 | #ifdef CONFIG_RPS | ||
863 | struct rps_sock_flow_table *sock_flow_table; | ||
864 | |||
865 | rcu_read_lock(); | ||
866 | sock_flow_table = rcu_dereference(rps_sock_flow_table); | ||
867 | rps_reset_sock_flow(sock_flow_table, hash); | ||
868 | rcu_read_unlock(); | ||
869 | #endif | ||
870 | } | ||
871 | |||
872 | static inline void sock_rps_record_flow(const struct sock *sk) | 860 | static inline void sock_rps_record_flow(const struct sock *sk) |
873 | { | 861 | { |
874 | #ifdef CONFIG_RPS | 862 | #ifdef CONFIG_RPS |
@@ -876,28 +864,18 @@ static inline void sock_rps_record_flow(const struct sock *sk) | |||
876 | #endif | 864 | #endif |
877 | } | 865 | } |
878 | 866 | ||
879 | static inline void sock_rps_reset_flow(const struct sock *sk) | ||
880 | { | ||
881 | #ifdef CONFIG_RPS | ||
882 | sock_rps_reset_flow_hash(sk->sk_rxhash); | ||
883 | #endif | ||
884 | } | ||
885 | |||
886 | static inline void sock_rps_save_rxhash(struct sock *sk, | 867 | static inline void sock_rps_save_rxhash(struct sock *sk, |
887 | const struct sk_buff *skb) | 868 | const struct sk_buff *skb) |
888 | { | 869 | { |
889 | #ifdef CONFIG_RPS | 870 | #ifdef CONFIG_RPS |
890 | if (unlikely(sk->sk_rxhash != skb->hash)) { | 871 | if (unlikely(sk->sk_rxhash != skb->hash)) |
891 | sock_rps_reset_flow(sk); | ||
892 | sk->sk_rxhash = skb->hash; | 872 | sk->sk_rxhash = skb->hash; |
893 | } | ||
894 | #endif | 873 | #endif |
895 | } | 874 | } |
896 | 875 | ||
897 | static inline void sock_rps_reset_rxhash(struct sock *sk) | 876 | static inline void sock_rps_reset_rxhash(struct sock *sk) |
898 | { | 877 | { |
899 | #ifdef CONFIG_RPS | 878 | #ifdef CONFIG_RPS |
900 | sock_rps_reset_flow(sk); | ||
901 | sk->sk_rxhash = 0; | 879 | sk->sk_rxhash = 0; |
902 | #endif | 880 | #endif |
903 | } | 881 | } |
@@ -1099,11 +1077,6 @@ static inline bool memcg_proto_active(struct cg_proto *cg_proto) | |||
1099 | return test_bit(MEMCG_SOCK_ACTIVE, &cg_proto->flags); | 1077 | return test_bit(MEMCG_SOCK_ACTIVE, &cg_proto->flags); |
1100 | } | 1078 | } |
1101 | 1079 | ||
1102 | static inline bool memcg_proto_activated(struct cg_proto *cg_proto) | ||
1103 | { | ||
1104 | return test_bit(MEMCG_SOCK_ACTIVATED, &cg_proto->flags); | ||
1105 | } | ||
1106 | |||
1107 | #ifdef SOCK_REFCNT_DEBUG | 1080 | #ifdef SOCK_REFCNT_DEBUG |
1108 | static inline void sk_refcnt_debug_inc(struct sock *sk) | 1081 | static inline void sk_refcnt_debug_inc(struct sock *sk) |
1109 | { | 1082 | { |
@@ -1374,29 +1347,6 @@ void sk_prot_clear_portaddr_nulls(struct sock *sk, int size); | |||
1374 | #define SOCK_BINDADDR_LOCK 4 | 1347 | #define SOCK_BINDADDR_LOCK 4 |
1375 | #define SOCK_BINDPORT_LOCK 8 | 1348 | #define SOCK_BINDPORT_LOCK 8 |
1376 | 1349 | ||
1377 | /* sock_iocb: used to kick off async processing of socket ios */ | ||
1378 | struct sock_iocb { | ||
1379 | struct list_head list; | ||
1380 | |||
1381 | int flags; | ||
1382 | int size; | ||
1383 | struct socket *sock; | ||
1384 | struct sock *sk; | ||
1385 | struct scm_cookie *scm; | ||
1386 | struct msghdr *msg, async_msg; | ||
1387 | struct kiocb *kiocb; | ||
1388 | }; | ||
1389 | |||
1390 | static inline struct sock_iocb *kiocb_to_siocb(struct kiocb *iocb) | ||
1391 | { | ||
1392 | return (struct sock_iocb *)iocb->private; | ||
1393 | } | ||
1394 | |||
1395 | static inline struct kiocb *siocb_to_kiocb(struct sock_iocb *si) | ||
1396 | { | ||
1397 | return si->kiocb; | ||
1398 | } | ||
1399 | |||
1400 | struct socket_alloc { | 1350 | struct socket_alloc { |
1401 | struct socket socket; | 1351 | struct socket socket; |
1402 | struct inode vfs_inode; | 1352 | struct inode vfs_inode; |
@@ -1826,27 +1776,25 @@ static inline void sk_nocaps_add(struct sock *sk, netdev_features_t flags) | |||
1826 | } | 1776 | } |
1827 | 1777 | ||
1828 | static inline int skb_do_copy_data_nocache(struct sock *sk, struct sk_buff *skb, | 1778 | static inline int skb_do_copy_data_nocache(struct sock *sk, struct sk_buff *skb, |
1829 | char __user *from, char *to, | 1779 | struct iov_iter *from, char *to, |
1830 | int copy, int offset) | 1780 | int copy, int offset) |
1831 | { | 1781 | { |
1832 | if (skb->ip_summed == CHECKSUM_NONE) { | 1782 | if (skb->ip_summed == CHECKSUM_NONE) { |
1833 | int err = 0; | 1783 | __wsum csum = 0; |
1834 | __wsum csum = csum_and_copy_from_user(from, to, copy, 0, &err); | 1784 | if (csum_and_copy_from_iter(to, copy, &csum, from) != copy) |
1835 | if (err) | 1785 | return -EFAULT; |
1836 | return err; | ||
1837 | skb->csum = csum_block_add(skb->csum, csum, offset); | 1786 | skb->csum = csum_block_add(skb->csum, csum, offset); |
1838 | } else if (sk->sk_route_caps & NETIF_F_NOCACHE_COPY) { | 1787 | } else if (sk->sk_route_caps & NETIF_F_NOCACHE_COPY) { |
1839 | if (!access_ok(VERIFY_READ, from, copy) || | 1788 | if (copy_from_iter_nocache(to, copy, from) != copy) |
1840 | __copy_from_user_nocache(to, from, copy)) | ||
1841 | return -EFAULT; | 1789 | return -EFAULT; |
1842 | } else if (copy_from_user(to, from, copy)) | 1790 | } else if (copy_from_iter(to, copy, from) != copy) |
1843 | return -EFAULT; | 1791 | return -EFAULT; |
1844 | 1792 | ||
1845 | return 0; | 1793 | return 0; |
1846 | } | 1794 | } |
1847 | 1795 | ||
1848 | static inline int skb_add_data_nocache(struct sock *sk, struct sk_buff *skb, | 1796 | static inline int skb_add_data_nocache(struct sock *sk, struct sk_buff *skb, |
1849 | char __user *from, int copy) | 1797 | struct iov_iter *from, int copy) |
1850 | { | 1798 | { |
1851 | int err, offset = skb->len; | 1799 | int err, offset = skb->len; |
1852 | 1800 | ||
@@ -1858,7 +1806,7 @@ static inline int skb_add_data_nocache(struct sock *sk, struct sk_buff *skb, | |||
1858 | return err; | 1806 | return err; |
1859 | } | 1807 | } |
1860 | 1808 | ||
1861 | static inline int skb_copy_to_page_nocache(struct sock *sk, char __user *from, | 1809 | static inline int skb_copy_to_page_nocache(struct sock *sk, struct iov_iter *from, |
1862 | struct sk_buff *skb, | 1810 | struct sk_buff *skb, |
1863 | struct page *page, | 1811 | struct page *page, |
1864 | int off, int copy) | 1812 | int off, int copy) |
@@ -2262,6 +2210,7 @@ bool sk_net_capable(const struct sock *sk, int cap); | |||
2262 | extern __u32 sysctl_wmem_max; | 2210 | extern __u32 sysctl_wmem_max; |
2263 | extern __u32 sysctl_rmem_max; | 2211 | extern __u32 sysctl_rmem_max; |
2264 | 2212 | ||
2213 | extern int sysctl_tstamp_allow_data; | ||
2265 | extern int sysctl_optmem_max; | 2214 | extern int sysctl_optmem_max; |
2266 | 2215 | ||
2267 | extern __u32 sysctl_wmem_default; | 2216 | extern __u32 sysctl_wmem_default; |
diff --git a/include/net/switchdev.h b/include/net/switchdev.h index 8a6d1641fd9b..cfcdac2e5d25 100644 --- a/include/net/switchdev.h +++ b/include/net/switchdev.h | |||
@@ -11,13 +11,46 @@ | |||
11 | #define _LINUX_SWITCHDEV_H_ | 11 | #define _LINUX_SWITCHDEV_H_ |
12 | 12 | ||
13 | #include <linux/netdevice.h> | 13 | #include <linux/netdevice.h> |
14 | #include <linux/notifier.h> | ||
15 | |||
16 | enum netdev_switch_notifier_type { | ||
17 | NETDEV_SWITCH_FDB_ADD = 1, | ||
18 | NETDEV_SWITCH_FDB_DEL, | ||
19 | }; | ||
20 | |||
21 | struct netdev_switch_notifier_info { | ||
22 | struct net_device *dev; | ||
23 | }; | ||
24 | |||
25 | struct netdev_switch_notifier_fdb_info { | ||
26 | struct netdev_switch_notifier_info info; /* must be first */ | ||
27 | const unsigned char *addr; | ||
28 | u16 vid; | ||
29 | }; | ||
30 | |||
31 | static inline struct net_device * | ||
32 | netdev_switch_notifier_info_to_dev(const struct netdev_switch_notifier_info *info) | ||
33 | { | ||
34 | return info->dev; | ||
35 | } | ||
14 | 36 | ||
15 | #ifdef CONFIG_NET_SWITCHDEV | 37 | #ifdef CONFIG_NET_SWITCHDEV |
16 | 38 | ||
17 | int netdev_switch_parent_id_get(struct net_device *dev, | 39 | int netdev_switch_parent_id_get(struct net_device *dev, |
18 | struct netdev_phys_item_id *psid); | 40 | struct netdev_phys_item_id *psid); |
19 | int netdev_switch_port_stp_update(struct net_device *dev, u8 state); | 41 | int netdev_switch_port_stp_update(struct net_device *dev, u8 state); |
20 | 42 | int register_netdev_switch_notifier(struct notifier_block *nb); | |
43 | int unregister_netdev_switch_notifier(struct notifier_block *nb); | ||
44 | int call_netdev_switch_notifiers(unsigned long val, struct net_device *dev, | ||
45 | struct netdev_switch_notifier_info *info); | ||
46 | int netdev_switch_port_bridge_setlink(struct net_device *dev, | ||
47 | struct nlmsghdr *nlh, u16 flags); | ||
48 | int netdev_switch_port_bridge_dellink(struct net_device *dev, | ||
49 | struct nlmsghdr *nlh, u16 flags); | ||
50 | int ndo_dflt_netdev_switch_port_bridge_dellink(struct net_device *dev, | ||
51 | struct nlmsghdr *nlh, u16 flags); | ||
52 | int ndo_dflt_netdev_switch_port_bridge_setlink(struct net_device *dev, | ||
53 | struct nlmsghdr *nlh, u16 flags); | ||
21 | #else | 54 | #else |
22 | 55 | ||
23 | static inline int netdev_switch_parent_id_get(struct net_device *dev, | 56 | static inline int netdev_switch_parent_id_get(struct net_device *dev, |
@@ -32,6 +65,50 @@ static inline int netdev_switch_port_stp_update(struct net_device *dev, | |||
32 | return -EOPNOTSUPP; | 65 | return -EOPNOTSUPP; |
33 | } | 66 | } |
34 | 67 | ||
68 | static inline int register_netdev_switch_notifier(struct notifier_block *nb) | ||
69 | { | ||
70 | return 0; | ||
71 | } | ||
72 | |||
73 | static inline int unregister_netdev_switch_notifier(struct notifier_block *nb) | ||
74 | { | ||
75 | return 0; | ||
76 | } | ||
77 | |||
78 | static inline int call_netdev_switch_notifiers(unsigned long val, struct net_device *dev, | ||
79 | struct netdev_switch_notifier_info *info) | ||
80 | { | ||
81 | return NOTIFY_DONE; | ||
82 | } | ||
83 | |||
84 | static inline int netdev_switch_port_bridge_setlink(struct net_device *dev, | ||
85 | struct nlmsghdr *nlh, | ||
86 | u16 flags) | ||
87 | { | ||
88 | return -EOPNOTSUPP; | ||
89 | } | ||
90 | |||
91 | static inline int netdev_switch_port_bridge_dellink(struct net_device *dev, | ||
92 | struct nlmsghdr *nlh, | ||
93 | u16 flags) | ||
94 | { | ||
95 | return -EOPNOTSUPP; | ||
96 | } | ||
97 | |||
98 | static inline int ndo_dflt_netdev_switch_port_bridge_dellink(struct net_device *dev, | ||
99 | struct nlmsghdr *nlh, | ||
100 | u16 flags) | ||
101 | { | ||
102 | return 0; | ||
103 | } | ||
104 | |||
105 | static inline int ndo_dflt_netdev_switch_port_bridge_setlink(struct net_device *dev, | ||
106 | struct nlmsghdr *nlh, | ||
107 | u16 flags) | ||
108 | { | ||
109 | return 0; | ||
110 | } | ||
111 | |||
35 | #endif | 112 | #endif |
36 | 113 | ||
37 | #endif /* _LINUX_SWITCHDEV_H_ */ | 114 | #endif /* _LINUX_SWITCHDEV_H_ */ |
diff --git a/include/net/tc_act/tc_bpf.h b/include/net/tc_act/tc_bpf.h new file mode 100644 index 000000000000..86a070ffc930 --- /dev/null +++ b/include/net/tc_act/tc_bpf.h | |||
@@ -0,0 +1,25 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2015 Jiri Pirko <jiri@resnulli.us> | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License as published by | ||
6 | * the Free Software Foundation; either version 2 of the License, or | ||
7 | * (at your option) any later version. | ||
8 | */ | ||
9 | |||
10 | #ifndef __NET_TC_BPF_H | ||
11 | #define __NET_TC_BPF_H | ||
12 | |||
13 | #include <linux/filter.h> | ||
14 | #include <net/act_api.h> | ||
15 | |||
16 | struct tcf_bpf { | ||
17 | struct tcf_common common; | ||
18 | struct bpf_prog *filter; | ||
19 | struct sock_filter *bpf_ops; | ||
20 | u16 bpf_num_ops; | ||
21 | }; | ||
22 | #define to_bpf(a) \ | ||
23 | container_of(a->priv, struct tcf_bpf, common) | ||
24 | |||
25 | #endif /* __NET_TC_BPF_H */ | ||
diff --git a/include/net/tc_act/tc_connmark.h b/include/net/tc_act/tc_connmark.h new file mode 100644 index 000000000000..5c1104c2e24f --- /dev/null +++ b/include/net/tc_act/tc_connmark.h | |||
@@ -0,0 +1,14 @@ | |||
1 | #ifndef __NET_TC_CONNMARK_H | ||
2 | #define __NET_TC_CONNMARK_H | ||
3 | |||
4 | #include <net/act_api.h> | ||
5 | |||
6 | struct tcf_connmark_info { | ||
7 | struct tcf_common common; | ||
8 | u16 zone; | ||
9 | }; | ||
10 | |||
11 | #define to_connmark(a) \ | ||
12 | container_of(a->priv, struct tcf_connmark_info, common) | ||
13 | |||
14 | #endif /* __NET_TC_CONNMARK_H */ | ||
diff --git a/include/net/tcp.h b/include/net/tcp.h index 9d9111ef43ae..8d6b983d5099 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h | |||
@@ -262,8 +262,6 @@ extern int sysctl_tcp_low_latency; | |||
262 | extern int sysctl_tcp_nometrics_save; | 262 | extern int sysctl_tcp_nometrics_save; |
263 | extern int sysctl_tcp_moderate_rcvbuf; | 263 | extern int sysctl_tcp_moderate_rcvbuf; |
264 | extern int sysctl_tcp_tso_win_divisor; | 264 | extern int sysctl_tcp_tso_win_divisor; |
265 | extern int sysctl_tcp_mtu_probing; | ||
266 | extern int sysctl_tcp_base_mss; | ||
267 | extern int sysctl_tcp_workaround_signed_windows; | 265 | extern int sysctl_tcp_workaround_signed_windows; |
268 | extern int sysctl_tcp_slow_start_after_idle; | 266 | extern int sysctl_tcp_slow_start_after_idle; |
269 | extern int sysctl_tcp_thin_linear_timeouts; | 267 | extern int sysctl_tcp_thin_linear_timeouts; |
@@ -274,6 +272,7 @@ extern int sysctl_tcp_challenge_ack_limit; | |||
274 | extern unsigned int sysctl_tcp_notsent_lowat; | 272 | extern unsigned int sysctl_tcp_notsent_lowat; |
275 | extern int sysctl_tcp_min_tso_segs; | 273 | extern int sysctl_tcp_min_tso_segs; |
276 | extern int sysctl_tcp_autocorking; | 274 | extern int sysctl_tcp_autocorking; |
275 | extern int sysctl_tcp_invalid_ratelimit; | ||
277 | 276 | ||
278 | extern atomic_long_t tcp_memory_allocated; | 277 | extern atomic_long_t tcp_memory_allocated; |
279 | extern struct percpu_counter tcp_sockets_allocated; | 278 | extern struct percpu_counter tcp_sockets_allocated; |
@@ -448,6 +447,7 @@ int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb); | |||
448 | struct sock *tcp_create_openreq_child(struct sock *sk, | 447 | struct sock *tcp_create_openreq_child(struct sock *sk, |
449 | struct request_sock *req, | 448 | struct request_sock *req, |
450 | struct sk_buff *skb); | 449 | struct sk_buff *skb); |
450 | void tcp_ca_openreq_child(struct sock *sk, const struct dst_entry *dst); | ||
451 | struct sock *tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb, | 451 | struct sock *tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb, |
452 | struct request_sock *req, | 452 | struct request_sock *req, |
453 | struct dst_entry *dst); | 453 | struct dst_entry *dst); |
@@ -636,6 +636,11 @@ static inline u32 tcp_rto_min_us(struct sock *sk) | |||
636 | return jiffies_to_usecs(tcp_rto_min(sk)); | 636 | return jiffies_to_usecs(tcp_rto_min(sk)); |
637 | } | 637 | } |
638 | 638 | ||
639 | static inline bool tcp_ca_dst_locked(const struct dst_entry *dst) | ||
640 | { | ||
641 | return dst_metric_locked(dst, RTAX_CC_ALGO); | ||
642 | } | ||
643 | |||
639 | /* Compute the actual receive window we are currently advertising. | 644 | /* Compute the actual receive window we are currently advertising. |
640 | * Rcv_nxt can be after the window if our peer push more data | 645 | * Rcv_nxt can be after the window if our peer push more data |
641 | * than the offered window. | 646 | * than the offered window. |
@@ -787,6 +792,8 @@ enum tcp_ca_ack_event_flags { | |||
787 | #define TCP_CA_MAX 128 | 792 | #define TCP_CA_MAX 128 |
788 | #define TCP_CA_BUF_MAX (TCP_CA_NAME_MAX*TCP_CA_MAX) | 793 | #define TCP_CA_BUF_MAX (TCP_CA_NAME_MAX*TCP_CA_MAX) |
789 | 794 | ||
795 | #define TCP_CA_UNSPEC 0 | ||
796 | |||
790 | /* Algorithm can be set on socket without CAP_NET_ADMIN privileges */ | 797 | /* Algorithm can be set on socket without CAP_NET_ADMIN privileges */ |
791 | #define TCP_CONG_NON_RESTRICTED 0x1 | 798 | #define TCP_CONG_NON_RESTRICTED 0x1 |
792 | /* Requires ECN/ECT set on all packets */ | 799 | /* Requires ECN/ECT set on all packets */ |
@@ -794,7 +801,8 @@ enum tcp_ca_ack_event_flags { | |||
794 | 801 | ||
795 | struct tcp_congestion_ops { | 802 | struct tcp_congestion_ops { |
796 | struct list_head list; | 803 | struct list_head list; |
797 | unsigned long flags; | 804 | u32 key; |
805 | u32 flags; | ||
798 | 806 | ||
799 | /* initialize private data (optional) */ | 807 | /* initialize private data (optional) */ |
800 | void (*init)(struct sock *sk); | 808 | void (*init)(struct sock *sk); |
@@ -841,6 +849,17 @@ u32 tcp_reno_ssthresh(struct sock *sk); | |||
841 | void tcp_reno_cong_avoid(struct sock *sk, u32 ack, u32 acked); | 849 | void tcp_reno_cong_avoid(struct sock *sk, u32 ack, u32 acked); |
842 | extern struct tcp_congestion_ops tcp_reno; | 850 | extern struct tcp_congestion_ops tcp_reno; |
843 | 851 | ||
852 | struct tcp_congestion_ops *tcp_ca_find_key(u32 key); | ||
853 | u32 tcp_ca_get_key_by_name(const char *name); | ||
854 | #ifdef CONFIG_INET | ||
855 | char *tcp_ca_get_name_by_key(u32 key, char *buffer); | ||
856 | #else | ||
857 | static inline char *tcp_ca_get_name_by_key(u32 key, char *buffer) | ||
858 | { | ||
859 | return NULL; | ||
860 | } | ||
861 | #endif | ||
862 | |||
844 | static inline bool tcp_ca_needs_ecn(const struct sock *sk) | 863 | static inline bool tcp_ca_needs_ecn(const struct sock *sk) |
845 | { | 864 | { |
846 | const struct inet_connection_sock *icsk = inet_csk(sk); | 865 | const struct inet_connection_sock *icsk = inet_csk(sk); |
@@ -1124,6 +1143,7 @@ static inline void tcp_openreq_init(struct request_sock *req, | |||
1124 | tcp_rsk(req)->rcv_isn = TCP_SKB_CB(skb)->seq; | 1143 | tcp_rsk(req)->rcv_isn = TCP_SKB_CB(skb)->seq; |
1125 | tcp_rsk(req)->rcv_nxt = TCP_SKB_CB(skb)->seq + 1; | 1144 | tcp_rsk(req)->rcv_nxt = TCP_SKB_CB(skb)->seq + 1; |
1126 | tcp_rsk(req)->snt_synack = tcp_time_stamp; | 1145 | tcp_rsk(req)->snt_synack = tcp_time_stamp; |
1146 | tcp_rsk(req)->last_oow_ack_time = 0; | ||
1127 | req->mss = rx_opt->mss_clamp; | 1147 | req->mss = rx_opt->mss_clamp; |
1128 | req->ts_recent = rx_opt->saw_tstamp ? rx_opt->rcv_tsval : 0; | 1148 | req->ts_recent = rx_opt->saw_tstamp ? rx_opt->rcv_tsval : 0; |
1129 | ireq->tstamp_ok = rx_opt->tstamp_ok; | 1149 | ireq->tstamp_ok = rx_opt->tstamp_ok; |
@@ -1216,6 +1236,37 @@ static inline bool tcp_paws_reject(const struct tcp_options_received *rx_opt, | |||
1216 | return true; | 1236 | return true; |
1217 | } | 1237 | } |
1218 | 1238 | ||
1239 | /* Return true if we're currently rate-limiting out-of-window ACKs and | ||
1240 | * thus shouldn't send a dupack right now. We rate-limit dupacks in | ||
1241 | * response to out-of-window SYNs or ACKs to mitigate ACK loops or DoS | ||
1242 | * attacks that send repeated SYNs or ACKs for the same connection. To | ||
1243 | * do this, we do not send a duplicate SYNACK or ACK if the remote | ||
1244 | * endpoint is sending out-of-window SYNs or pure ACKs at a high rate. | ||
1245 | */ | ||
1246 | static inline bool tcp_oow_rate_limited(struct net *net, | ||
1247 | const struct sk_buff *skb, | ||
1248 | int mib_idx, u32 *last_oow_ack_time) | ||
1249 | { | ||
1250 | /* Data packets without SYNs are not likely part of an ACK loop. */ | ||
1251 | if ((TCP_SKB_CB(skb)->seq != TCP_SKB_CB(skb)->end_seq) && | ||
1252 | !tcp_hdr(skb)->syn) | ||
1253 | goto not_rate_limited; | ||
1254 | |||
1255 | if (*last_oow_ack_time) { | ||
1256 | s32 elapsed = (s32)(tcp_time_stamp - *last_oow_ack_time); | ||
1257 | |||
1258 | if (0 <= elapsed && elapsed < sysctl_tcp_invalid_ratelimit) { | ||
1259 | NET_INC_STATS_BH(net, mib_idx); | ||
1260 | return true; /* rate-limited: don't send yet! */ | ||
1261 | } | ||
1262 | } | ||
1263 | |||
1264 | *last_oow_ack_time = tcp_time_stamp; | ||
1265 | |||
1266 | not_rate_limited: | ||
1267 | return false; /* not rate-limited: go ahead, send dupack now! */ | ||
1268 | } | ||
1269 | |||
1219 | static inline void tcp_mib_init(struct net *net) | 1270 | static inline void tcp_mib_init(struct net *net) |
1220 | { | 1271 | { |
1221 | /* See RFC 2012 */ | 1272 | /* See RFC 2012 */ |
@@ -1693,4 +1744,19 @@ static inline struct ip_options_rcu *tcp_v4_save_options(struct sk_buff *skb) | |||
1693 | return dopt; | 1744 | return dopt; |
1694 | } | 1745 | } |
1695 | 1746 | ||
1747 | /* locally generated TCP pure ACKs have skb->truesize == 2 | ||
1748 | * (check tcp_send_ack() in net/ipv4/tcp_output.c ) | ||
1749 | * This is much faster than dissecting the packet to find out. | ||
1750 | * (Think of GRE encapsulations, IPv4, IPv6, ...) | ||
1751 | */ | ||
1752 | static inline bool skb_is_tcp_pure_ack(const struct sk_buff *skb) | ||
1753 | { | ||
1754 | return skb->truesize == 2; | ||
1755 | } | ||
1756 | |||
1757 | static inline void skb_set_tcp_pure_ack(struct sk_buff *skb) | ||
1758 | { | ||
1759 | skb->truesize = 2; | ||
1760 | } | ||
1761 | |||
1696 | #endif /* _TCP_H */ | 1762 | #endif /* _TCP_H */ |
diff --git a/include/net/udp_tunnel.h b/include/net/udp_tunnel.h index 2a50a70ef587..1a20d33d56bc 100644 --- a/include/net/udp_tunnel.h +++ b/include/net/udp_tunnel.h | |||
@@ -77,17 +77,17 @@ void setup_udp_tunnel_sock(struct net *net, struct socket *sock, | |||
77 | struct udp_tunnel_sock_cfg *sock_cfg); | 77 | struct udp_tunnel_sock_cfg *sock_cfg); |
78 | 78 | ||
79 | /* Transmit the skb using UDP encapsulation. */ | 79 | /* Transmit the skb using UDP encapsulation. */ |
80 | int udp_tunnel_xmit_skb(struct socket *sock, struct rtable *rt, | 80 | int udp_tunnel_xmit_skb(struct rtable *rt, struct sk_buff *skb, |
81 | struct sk_buff *skb, __be32 src, __be32 dst, | 81 | __be32 src, __be32 dst, __u8 tos, __u8 ttl, |
82 | __u8 tos, __u8 ttl, __be16 df, __be16 src_port, | 82 | __be16 df, __be16 src_port, __be16 dst_port, |
83 | __be16 dst_port, bool xnet); | 83 | bool xnet, bool nocheck); |
84 | 84 | ||
85 | #if IS_ENABLED(CONFIG_IPV6) | 85 | #if IS_ENABLED(CONFIG_IPV6) |
86 | int udp_tunnel6_xmit_skb(struct socket *sock, struct dst_entry *dst, | 86 | int udp_tunnel6_xmit_skb(struct dst_entry *dst, struct sk_buff *skb, |
87 | struct sk_buff *skb, struct net_device *dev, | 87 | struct net_device *dev, struct in6_addr *saddr, |
88 | struct in6_addr *saddr, struct in6_addr *daddr, | 88 | struct in6_addr *daddr, |
89 | __u8 prio, __u8 ttl, __be16 src_port, | 89 | __u8 prio, __u8 ttl, __be16 src_port, |
90 | __be16 dst_port); | 90 | __be16 dst_port, bool nocheck); |
91 | #endif | 91 | #endif |
92 | 92 | ||
93 | void udp_tunnel_sock_release(struct socket *sock); | 93 | void udp_tunnel_sock_release(struct socket *sock); |
diff --git a/include/net/udplite.h b/include/net/udplite.h index ae7c8d1fbcad..80761938b9a7 100644 --- a/include/net/udplite.h +++ b/include/net/udplite.h | |||
@@ -20,8 +20,7 @@ static __inline__ int udplite_getfrag(void *from, char *to, int offset, | |||
20 | int len, int odd, struct sk_buff *skb) | 20 | int len, int odd, struct sk_buff *skb) |
21 | { | 21 | { |
22 | struct msghdr *msg = from; | 22 | struct msghdr *msg = from; |
23 | /* XXX: stripping const */ | 23 | return copy_from_iter(to, len, &msg->msg_iter) != len ? -EFAULT : 0; |
24 | return memcpy_fromiovecend(to, (struct iovec *)msg->msg_iter.iov, offset, len); | ||
25 | } | 24 | } |
26 | 25 | ||
27 | /* Designate sk as UDP-Lite socket */ | 26 | /* Designate sk as UDP-Lite socket */ |
diff --git a/include/net/vxlan.h b/include/net/vxlan.h index 903461aa5644..eabd3a038674 100644 --- a/include/net/vxlan.h +++ b/include/net/vxlan.h | |||
@@ -11,14 +11,96 @@ | |||
11 | #define VNI_HASH_BITS 10 | 11 | #define VNI_HASH_BITS 10 |
12 | #define VNI_HASH_SIZE (1<<VNI_HASH_BITS) | 12 | #define VNI_HASH_SIZE (1<<VNI_HASH_BITS) |
13 | 13 | ||
14 | /* VXLAN protocol header */ | 14 | /* |
15 | * VXLAN Group Based Policy Extension: | ||
16 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
17 | * |1|-|-|-|1|-|-|-|R|D|R|R|A|R|R|R| Group Policy ID | | ||
18 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
19 | * | VXLAN Network Identifier (VNI) | Reserved | | ||
20 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
21 | * | ||
22 | * D = Don't Learn bit. When set, this bit indicates that the egress | ||
23 | * VTEP MUST NOT learn the source address of the encapsulated frame. | ||
24 | * | ||
25 | * A = Indicates that the group policy has already been applied to | ||
26 | * this packet. Policies MUST NOT be applied by devices when the | ||
27 | * A bit is set. | ||
28 | * | ||
29 | * [0] https://tools.ietf.org/html/draft-smith-vxlan-group-policy | ||
30 | */ | ||
31 | struct vxlanhdr_gbp { | ||
32 | __u8 vx_flags; | ||
33 | #ifdef __LITTLE_ENDIAN_BITFIELD | ||
34 | __u8 reserved_flags1:3, | ||
35 | policy_applied:1, | ||
36 | reserved_flags2:2, | ||
37 | dont_learn:1, | ||
38 | reserved_flags3:1; | ||
39 | #elif defined(__BIG_ENDIAN_BITFIELD) | ||
40 | __u8 reserved_flags1:1, | ||
41 | dont_learn:1, | ||
42 | reserved_flags2:2, | ||
43 | policy_applied:1, | ||
44 | reserved_flags3:3; | ||
45 | #else | ||
46 | #error "Please fix <asm/byteorder.h>" | ||
47 | #endif | ||
48 | __be16 policy_id; | ||
49 | __be32 vx_vni; | ||
50 | }; | ||
51 | |||
52 | #define VXLAN_GBP_USED_BITS (VXLAN_HF_GBP | 0xFFFFFF) | ||
53 | |||
54 | /* skb->mark mapping | ||
55 | * | ||
56 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
57 | * |R|R|R|R|R|R|R|R|R|D|R|R|A|R|R|R| Group Policy ID | | ||
58 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
59 | */ | ||
60 | #define VXLAN_GBP_DONT_LEARN (BIT(6) << 16) | ||
61 | #define VXLAN_GBP_POLICY_APPLIED (BIT(3) << 16) | ||
62 | #define VXLAN_GBP_ID_MASK (0xFFFF) | ||
63 | |||
64 | /* VXLAN protocol header: | ||
65 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
66 | * |G|R|R|R|I|R|R|C| Reserved | | ||
67 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
68 | * | VXLAN Network Identifier (VNI) | Reserved | | ||
69 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
70 | * | ||
71 | * G = 1 Group Policy (VXLAN-GBP) | ||
72 | * I = 1 VXLAN Network Identifier (VNI) present | ||
73 | * C = 1 Remote checksum offload (RCO) | ||
74 | */ | ||
15 | struct vxlanhdr { | 75 | struct vxlanhdr { |
16 | __be32 vx_flags; | 76 | __be32 vx_flags; |
17 | __be32 vx_vni; | 77 | __be32 vx_vni; |
18 | }; | 78 | }; |
19 | 79 | ||
80 | /* VXLAN header flags. */ | ||
81 | #define VXLAN_HF_RCO BIT(24) | ||
82 | #define VXLAN_HF_VNI BIT(27) | ||
83 | #define VXLAN_HF_GBP BIT(31) | ||
84 | |||
85 | /* Remote checksum offload header option */ | ||
86 | #define VXLAN_RCO_MASK 0x7f /* Last byte of vni field */ | ||
87 | #define VXLAN_RCO_UDP 0x80 /* Indicate UDP RCO (TCP when not set *) */ | ||
88 | #define VXLAN_RCO_SHIFT 1 /* Left shift of start */ | ||
89 | #define VXLAN_RCO_SHIFT_MASK ((1 << VXLAN_RCO_SHIFT) - 1) | ||
90 | #define VXLAN_MAX_REMCSUM_START (VXLAN_RCO_MASK << VXLAN_RCO_SHIFT) | ||
91 | |||
92 | #define VXLAN_N_VID (1u << 24) | ||
93 | #define VXLAN_VID_MASK (VXLAN_N_VID - 1) | ||
94 | #define VXLAN_HLEN (sizeof(struct udphdr) + sizeof(struct vxlanhdr)) | ||
95 | |||
96 | struct vxlan_metadata { | ||
97 | __be32 vni; | ||
98 | u32 gbp; | ||
99 | }; | ||
100 | |||
20 | struct vxlan_sock; | 101 | struct vxlan_sock; |
21 | typedef void (vxlan_rcv_t)(struct vxlan_sock *vh, struct sk_buff *skb, __be32 key); | 102 | typedef void (vxlan_rcv_t)(struct vxlan_sock *vh, struct sk_buff *skb, |
103 | struct vxlan_metadata *md); | ||
22 | 104 | ||
23 | /* per UDP socket information */ | 105 | /* per UDP socket information */ |
24 | struct vxlan_sock { | 106 | struct vxlan_sock { |
@@ -31,6 +113,7 @@ struct vxlan_sock { | |||
31 | struct hlist_head vni_list[VNI_HASH_SIZE]; | 113 | struct hlist_head vni_list[VNI_HASH_SIZE]; |
32 | atomic_t refcnt; | 114 | atomic_t refcnt; |
33 | struct udp_offload udp_offloads; | 115 | struct udp_offload udp_offloads; |
116 | u32 flags; | ||
34 | }; | 117 | }; |
35 | 118 | ||
36 | #define VXLAN_F_LEARN 0x01 | 119 | #define VXLAN_F_LEARN 0x01 |
@@ -42,6 +125,18 @@ struct vxlan_sock { | |||
42 | #define VXLAN_F_UDP_CSUM 0x40 | 125 | #define VXLAN_F_UDP_CSUM 0x40 |
43 | #define VXLAN_F_UDP_ZERO_CSUM6_TX 0x80 | 126 | #define VXLAN_F_UDP_ZERO_CSUM6_TX 0x80 |
44 | #define VXLAN_F_UDP_ZERO_CSUM6_RX 0x100 | 127 | #define VXLAN_F_UDP_ZERO_CSUM6_RX 0x100 |
128 | #define VXLAN_F_REMCSUM_TX 0x200 | ||
129 | #define VXLAN_F_REMCSUM_RX 0x400 | ||
130 | #define VXLAN_F_GBP 0x800 | ||
131 | #define VXLAN_F_REMCSUM_NOPARTIAL 0x1000 | ||
132 | |||
133 | /* Flags that are used in the receive patch. These flags must match in | ||
134 | * order for a socket to be shareable | ||
135 | */ | ||
136 | #define VXLAN_F_RCV_FLAGS (VXLAN_F_GBP | \ | ||
137 | VXLAN_F_UDP_ZERO_CSUM6_RX | \ | ||
138 | VXLAN_F_REMCSUM_RX | \ | ||
139 | VXLAN_F_REMCSUM_NOPARTIAL) | ||
45 | 140 | ||
46 | struct vxlan_sock *vxlan_sock_add(struct net *net, __be16 port, | 141 | struct vxlan_sock *vxlan_sock_add(struct net *net, __be16 port, |
47 | vxlan_rcv_t *rcv, void *data, | 142 | vxlan_rcv_t *rcv, void *data, |
@@ -49,10 +144,10 @@ struct vxlan_sock *vxlan_sock_add(struct net *net, __be16 port, | |||
49 | 144 | ||
50 | void vxlan_sock_release(struct vxlan_sock *vs); | 145 | void vxlan_sock_release(struct vxlan_sock *vs); |
51 | 146 | ||
52 | int vxlan_xmit_skb(struct vxlan_sock *vs, | 147 | int vxlan_xmit_skb(struct rtable *rt, struct sk_buff *skb, |
53 | struct rtable *rt, struct sk_buff *skb, | ||
54 | __be32 src, __be32 dst, __u8 tos, __u8 ttl, __be16 df, | 148 | __be32 src, __be32 dst, __u8 tos, __u8 ttl, __be16 df, |
55 | __be16 src_port, __be16 dst_port, __be32 vni, bool xnet); | 149 | __be16 src_port, __be16 dst_port, struct vxlan_metadata *md, |
150 | bool xnet, u32 vxflags); | ||
56 | 151 | ||
57 | static inline netdev_features_t vxlan_features_check(struct sk_buff *skb, | 152 | static inline netdev_features_t vxlan_features_check(struct sk_buff *skb, |
58 | netdev_features_t features) | 153 | netdev_features_t features) |