diff options
Diffstat (limited to 'include/net')
52 files changed, 1263 insertions, 374 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/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/flow_keys.h b/include/net/flow_keys.h index 7ee2df083542..dc8fd81412bf 100644 --- a/include/net/flow_keys.h +++ b/include/net/flow_keys.h | |||
| @@ -22,9 +22,9 @@ struct flow_keys { | |||
| 22 | __be32 ports; | 22 | __be32 ports; |
| 23 | __be16 port16[2]; | 23 | __be16 port16[2]; |
| 24 | }; | 24 | }; |
| 25 | u16 thoff; | 25 | u16 thoff; |
| 26 | u16 n_proto; | 26 | __be16 n_proto; |
| 27 | u8 ip_proto; | 27 | u8 ip_proto; |
| 28 | }; | 28 | }; |
| 29 | 29 | ||
| 30 | bool __skb_flow_dissect(const struct sk_buff *skb, struct flow_keys *flow, | 30 | bool __skb_flow_dissect(const struct sk_buff *skb, struct flow_keys *flow, |
diff --git a/include/net/genetlink.h b/include/net/genetlink.h index af10c2cf8a1d..0574abd3db86 100644 --- a/include/net/genetlink.h +++ b/include/net/genetlink.h | |||
| @@ -27,10 +27,18 @@ struct genl_info; | |||
| 27 | * @maxattr: maximum number of attributes supported | 27 | * @maxattr: maximum number of attributes supported |
| 28 | * @netnsok: set to true if the family can handle network | 28 | * @netnsok: set to true if the family can handle network |
| 29 | * namespaces and should be presented in all of them | 29 | * namespaces and should be presented in all of them |
| 30 | * @parallel_ops: operations can be called in parallel and aren't | ||
| 31 | * synchronized by the core genetlink code | ||
| 30 | * @pre_doit: called before an operation's doit callback, it may | 32 | * @pre_doit: called before an operation's doit callback, it may |
| 31 | * do additional, common, filtering and return an error | 33 | * do additional, common, filtering and return an error |
| 32 | * @post_doit: called after an operation's doit callback, it may | 34 | * @post_doit: called after an operation's doit callback, it may |
| 33 | * undo operations done by pre_doit, for example release locks | 35 | * undo operations done by pre_doit, for example release locks |
| 36 | * @mcast_bind: a socket bound to the given multicast group (which | ||
| 37 | * is given as the offset into the groups array) | ||
| 38 | * @mcast_unbind: a socket was unbound from the given multicast group. | ||
| 39 | * Note that unbind() will not be called symmetrically if the | ||
| 40 | * generic netlink family is removed while there are still open | ||
| 41 | * sockets. | ||
| 34 | * @attrbuf: buffer to store parsed attributes | 42 | * @attrbuf: buffer to store parsed attributes |
| 35 | * @family_list: family list | 43 | * @family_list: family list |
| 36 | * @mcgrps: multicast groups used by this family (private) | 44 | * @mcgrps: multicast groups used by this family (private) |
| @@ -53,6 +61,8 @@ struct genl_family { | |||
| 53 | void (*post_doit)(const struct genl_ops *ops, | 61 | void (*post_doit)(const struct genl_ops *ops, |
| 54 | struct sk_buff *skb, | 62 | struct sk_buff *skb, |
| 55 | struct genl_info *info); | 63 | struct genl_info *info); |
| 64 | int (*mcast_bind)(struct net *net, int group); | ||
| 65 | void (*mcast_unbind)(struct net *net, int group); | ||
| 56 | struct nlattr ** attrbuf; /* private */ | 66 | struct nlattr ** attrbuf; /* private */ |
| 57 | const struct genl_ops * ops; /* private */ | 67 | const struct genl_ops * ops; /* private */ |
| 58 | const struct genl_multicast_group *mcgrps; /* private */ | 68 | const struct genl_multicast_group *mcgrps; /* private */ |
| @@ -201,6 +211,23 @@ static inline struct nlmsghdr *genlmsg_nlhdr(void *user_hdr, | |||
| 201 | } | 211 | } |
| 202 | 212 | ||
| 203 | /** | 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 | /** | ||
| 204 | * 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 |
| 205 | * @cb: netlink callback structure that stores the sequence number | 232 | * @cb: netlink callback structure that stores the sequence number |
| 206 | * @user_hdr: user header as returned from genlmsg_put() | 233 | * @user_hdr: user header as returned from genlmsg_put() |
| @@ -240,9 +267,9 @@ static inline void *genlmsg_put_reply(struct sk_buff *skb, | |||
| 240 | * @skb: socket buffer the message is stored in | 267 | * @skb: socket buffer the message is stored in |
| 241 | * @hdr: user specific header | 268 | * @hdr: user specific header |
| 242 | */ | 269 | */ |
| 243 | static inline int genlmsg_end(struct sk_buff *skb, void *hdr) | 270 | static inline void genlmsg_end(struct sk_buff *skb, void *hdr) |
| 244 | { | 271 | { |
| 245 | return nlmsg_end(skb, hdr - GENL_HDRLEN - NLMSG_HDRLEN); | 272 | nlmsg_end(skb, hdr - GENL_HDRLEN - NLMSG_HDRLEN); |
| 246 | } | 273 | } |
| 247 | 274 | ||
| 248 | /** | 275 | /** |
| @@ -395,11 +422,11 @@ static inline int genl_set_err(struct genl_family *family, struct net *net, | |||
| 395 | } | 422 | } |
| 396 | 423 | ||
| 397 | static inline int genl_has_listeners(struct genl_family *family, | 424 | static inline int genl_has_listeners(struct genl_family *family, |
| 398 | struct sock *sk, unsigned int group) | 425 | struct net *net, unsigned int group) |
| 399 | { | 426 | { |
| 400 | if (WARN_ON_ONCE(group >= family->n_mcgrps)) | 427 | if (WARN_ON_ONCE(group >= family->n_mcgrps)) |
| 401 | return -EINVAL; | 428 | return -EINVAL; |
| 402 | group = family->mcgrp_offset + group; | 429 | group = family->mcgrp_offset + group; |
| 403 | return netlink_has_listeners(sk, group); | 430 | return netlink_has_listeners(net->genl_sock, group); |
| 404 | } | 431 | } |
| 405 | #endif /* __NET_GENERIC_NETLINK_H */ | 432 | #endif /* __NET_GENERIC_NETLINK_H */ |
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 0bb620702929..025c61c0dffb 100644 --- a/include/net/ip.h +++ b/include/net/ip.h | |||
| @@ -39,11 +39,12 @@ struct inet_skb_parm { | |||
| 39 | struct ip_options opt; /* Compiled IP options */ | 39 | struct ip_options opt; /* Compiled IP options */ |
| 40 | unsigned char flags; | 40 | unsigned char flags; |
| 41 | 41 | ||
| 42 | #define IPSKB_FORWARDED 1 | 42 | #define IPSKB_FORWARDED BIT(0) |
| 43 | #define IPSKB_XFRM_TUNNEL_SIZE 2 | 43 | #define IPSKB_XFRM_TUNNEL_SIZE BIT(1) |
| 44 | #define IPSKB_XFRM_TRANSFORMED 4 | 44 | #define IPSKB_XFRM_TRANSFORMED BIT(2) |
| 45 | #define IPSKB_FRAG_COMPLETE 8 | 45 | #define IPSKB_FRAG_COMPLETE BIT(3) |
| 46 | #define IPSKB_REROUTED 16 | 46 | #define IPSKB_REROUTED BIT(4) |
| 47 | #define IPSKB_DOREDIRECT BIT(5) | ||
| 47 | 48 | ||
| 48 | u16 frag_max_size; | 49 | u16 frag_max_size; |
| 49 | }; | 50 | }; |
| @@ -180,7 +181,7 @@ static inline __u8 ip_reply_arg_flowi_flags(const struct ip_reply_arg *arg) | |||
| 180 | return (arg->flags & IP_REPLY_ARG_NOSRCCHECK) ? FLOWI_FLAG_ANYSRC : 0; | 181 | return (arg->flags & IP_REPLY_ARG_NOSRCCHECK) ? FLOWI_FLAG_ANYSRC : 0; |
| 181 | } | 182 | } |
| 182 | 183 | ||
| 183 | void ip_send_unicast_reply(struct net *net, struct sk_buff *skb, | 184 | void ip_send_unicast_reply(struct sock *sk, struct sk_buff *skb, |
| 184 | const struct ip_options *sopt, | 185 | const struct ip_options *sopt, |
| 185 | __be32 daddr, __be32 saddr, | 186 | __be32 daddr, __be32 saddr, |
| 186 | const struct ip_reply_arg *arg, | 187 | const struct ip_reply_arg *arg, |
| @@ -537,7 +538,7 @@ int ip_options_rcv_srr(struct sk_buff *skb); | |||
| 537 | */ | 538 | */ |
| 538 | 539 | ||
| 539 | 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); |
| 540 | 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); |
| 541 | int ip_cmsg_send(struct net *net, struct msghdr *msg, | 542 | int ip_cmsg_send(struct net *net, struct msghdr *msg, |
| 542 | struct ipcm_cookie *ipc, bool allow_ipv6); | 543 | struct ipcm_cookie *ipc, bool allow_ipv6); |
| 543 | 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, |
| @@ -557,6 +558,11 @@ void ip_icmp_error(struct sock *sk, struct sk_buff *skb, int err, __be16 port, | |||
| 557 | 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, |
| 558 | u32 info); | 559 | u32 info); |
| 559 | 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 | |||
| 560 | bool icmp_global_allow(void); | 566 | bool icmp_global_allow(void); |
| 561 | extern int sysctl_icmp_msgs_per_sec; | 567 | extern int sysctl_icmp_msgs_per_sec; |
| 562 | 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 4292929392b0..4c9fe224d73b 100644 --- a/include/net/ipv6.h +++ b/include/net/ipv6.h | |||
| @@ -671,6 +671,7 @@ 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 | void ipv6_select_ident(struct frag_hdr *fhdr, struct rt6_info *rt); | ||
| 674 | void ipv6_proxy_select_ident(struct sk_buff *skb); | 675 | void ipv6_proxy_select_ident(struct sk_buff *skb); |
| 675 | 676 | ||
| 676 | int ip6_dst_hoplimit(struct dst_entry *dst); | 677 | int ip6_dst_hoplimit(struct dst_entry *dst); |
| @@ -708,7 +709,7 @@ static inline __be32 ip6_make_flowlabel(struct net *net, struct sk_buff *skb, | |||
| 708 | __be32 flowlabel, bool autolabel) | 709 | __be32 flowlabel, bool autolabel) |
| 709 | { | 710 | { |
| 710 | if (!flowlabel && (autolabel || net->ipv6.sysctl.auto_flowlabels)) { | 711 | if (!flowlabel && (autolabel || net->ipv6.sysctl.auto_flowlabels)) { |
| 711 | __be32 hash; | 712 | u32 hash; |
| 712 | 713 | ||
| 713 | hash = skb_get_hash(skb); | 714 | hash = skb_get_hash(skb); |
| 714 | 715 | ||
| @@ -718,7 +719,7 @@ static inline __be32 ip6_make_flowlabel(struct net *net, struct sk_buff *skb, | |||
| 718 | */ | 719 | */ |
| 719 | hash ^= hash >> 12; | 720 | hash ^= hash >> 12; |
| 720 | 721 | ||
| 721 | flowlabel = hash & IPV6_FLOWLABEL_MASK; | 722 | flowlabel = (__force __be32)hash & IPV6_FLOWLABEL_MASK; |
| 722 | } | 723 | } |
| 723 | 724 | ||
| 724 | return flowlabel; | 725 | return flowlabel; |
| @@ -788,6 +789,25 @@ int ip6_push_pending_frames(struct sock *sk); | |||
| 788 | 789 | ||
| 789 | void ip6_flush_pending_frames(struct sock *sk); | 790 | void ip6_flush_pending_frames(struct sock *sk); |
| 790 | 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 | |||
| 791 | 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); |
| 792 | 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, |
| 793 | 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 58d719ddaa60..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 | /** |
| @@ -1278,8 +1294,8 @@ struct ieee80211_vif *wdev_to_ieee80211_vif(struct wireless_dev *wdev); | |||
| 1278 | * @IEEE80211_KEY_FLAG_PAIRWISE: Set by mac80211, this flag indicates | 1294 | * @IEEE80211_KEY_FLAG_PAIRWISE: Set by mac80211, this flag indicates |
| 1279 | * that the key is pairwise rather then a shared key. | 1295 | * that the key is pairwise rather then a shared key. |
| 1280 | * @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 |
| 1281 | * 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 |
| 1282 | * be done in software. | 1298 | * (MFP) to be done in software. |
| 1283 | * @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 |
| 1284 | * if space should be prepared for the IV, but the IV | 1300 | * if space should be prepared for the IV, but the IV |
| 1285 | * itself should not be generated. Do not set together with | 1301 | * itself should not be generated. Do not set together with |
| @@ -1294,8 +1310,11 @@ struct ieee80211_vif *wdev_to_ieee80211_vif(struct wireless_dev *wdev); | |||
| 1294 | * 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 |
| 1295 | * %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. |
| 1296 | * @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 |
| 1297 | * 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 |
| 1298 | * 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. | ||
| 1299 | */ | 1318 | */ |
| 1300 | enum ieee80211_key_flags { | 1319 | enum ieee80211_key_flags { |
| 1301 | IEEE80211_KEY_FLAG_GENERATE_IV_MGMT = BIT(0), | 1320 | IEEE80211_KEY_FLAG_GENERATE_IV_MGMT = BIT(0), |
| @@ -1305,6 +1324,7 @@ enum ieee80211_key_flags { | |||
| 1305 | IEEE80211_KEY_FLAG_SW_MGMT_TX = BIT(4), | 1324 | IEEE80211_KEY_FLAG_SW_MGMT_TX = BIT(4), |
| 1306 | IEEE80211_KEY_FLAG_PUT_IV_SPACE = BIT(5), | 1325 | IEEE80211_KEY_FLAG_PUT_IV_SPACE = BIT(5), |
| 1307 | IEEE80211_KEY_FLAG_RX_MGMT = BIT(6), | 1326 | IEEE80211_KEY_FLAG_RX_MGMT = BIT(6), |
| 1327 | IEEE80211_KEY_FLAG_RESERVE_TAILROOM = BIT(7), | ||
| 1308 | }; | 1328 | }; |
| 1309 | 1329 | ||
| 1310 | /** | 1330 | /** |
| @@ -1583,11 +1603,6 @@ struct ieee80211_tx_control { | |||
| 1583 | * @IEEE80211_HW_MFP_CAPABLE: | 1603 | * @IEEE80211_HW_MFP_CAPABLE: |
| 1584 | * Hardware supports management frame protection (MFP, IEEE 802.11w). | 1604 | * Hardware supports management frame protection (MFP, IEEE 802.11w). |
| 1585 | * | 1605 | * |
| 1586 | * @IEEE80211_HW_SUPPORTS_UAPSD: | ||
| 1587 | * Hardware supports Unscheduled Automatic Power Save Delivery | ||
| 1588 | * (U-APSD) in managed mode. The mode is configured with | ||
| 1589 | * conf_tx() operation. | ||
| 1590 | * | ||
| 1591 | * @IEEE80211_HW_REPORTS_TX_ACK_STATUS: | 1606 | * @IEEE80211_HW_REPORTS_TX_ACK_STATUS: |
| 1592 | * Hardware can provide ack status reports of Tx frames to | 1607 | * Hardware can provide ack status reports of Tx frames to |
| 1593 | * the stack. | 1608 | * the stack. |
| @@ -1626,6 +1641,12 @@ struct ieee80211_tx_control { | |||
| 1626 | * be created. It is expected user-space will create vifs as | 1641 | * be created. It is expected user-space will create vifs as |
| 1627 | * desired (and thus have them named as desired). | 1642 | * desired (and thus have them named as desired). |
| 1628 | * | 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 | * | ||
| 1629 | * @IEEE80211_HW_QUEUE_CONTROL: The driver wants to control per-interface | 1650 | * @IEEE80211_HW_QUEUE_CONTROL: The driver wants to control per-interface |
| 1630 | * 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) |
| 1631 | * for different virtual interfaces. See the doc section on HW queue | 1652 | * for different virtual interfaces. See the doc section on HW queue |
| @@ -1673,8 +1694,8 @@ enum ieee80211_hw_flags { | |||
| 1673 | IEEE80211_HW_MFP_CAPABLE = 1<<13, | 1694 | IEEE80211_HW_MFP_CAPABLE = 1<<13, |
| 1674 | IEEE80211_HW_WANT_MONITOR_VIF = 1<<14, | 1695 | IEEE80211_HW_WANT_MONITOR_VIF = 1<<14, |
| 1675 | IEEE80211_HW_NO_AUTO_VIF = 1<<15, | 1696 | IEEE80211_HW_NO_AUTO_VIF = 1<<15, |
| 1676 | /* free slot */ | 1697 | IEEE80211_HW_SW_CRYPTO_CONTROL = 1<<16, |
| 1677 | IEEE80211_HW_SUPPORTS_UAPSD = 1<<17, | 1698 | /* free slots */ |
| 1678 | IEEE80211_HW_REPORTS_TX_ACK_STATUS = 1<<18, | 1699 | IEEE80211_HW_REPORTS_TX_ACK_STATUS = 1<<18, |
| 1679 | IEEE80211_HW_CONNECTION_MONITOR = 1<<19, | 1700 | IEEE80211_HW_CONNECTION_MONITOR = 1<<19, |
| 1680 | IEEE80211_HW_QUEUE_CONTROL = 1<<20, | 1701 | IEEE80211_HW_QUEUE_CONTROL = 1<<20, |
| @@ -1948,6 +1969,11 @@ void ieee80211_free_txskb(struct ieee80211_hw *hw, struct sk_buff *skb); | |||
| 1948 | * 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 |
| 1949 | * 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. |
| 1950 | * | 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 | * | ||
| 1951 | * When the cmd is %DISABLE_KEY then it must succeed. | 1977 | * When the cmd is %DISABLE_KEY then it must succeed. |
| 1952 | * | 1978 | * |
| 1953 | * 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 |
| @@ -2026,7 +2052,7 @@ void ieee80211_free_txskb(struct ieee80211_hw *hw, struct sk_buff *skb); | |||
| 2026 | * enabled whenever user has enabled powersave. | 2052 | * enabled whenever user has enabled powersave. |
| 2027 | * | 2053 | * |
| 2028 | * Driver informs U-APSD client support by enabling | 2054 | * Driver informs U-APSD client support by enabling |
| 2029 | * %IEEE80211_HW_SUPPORTS_UAPSD flag. The mode is configured through the | 2055 | * %IEEE80211_VIF_SUPPORTS_UAPSD flag. The mode is configured through the |
| 2030 | * 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 |
| 2031 | * 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 |
| 2032 | * 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 |
| @@ -2699,6 +2725,14 @@ enum ieee80211_reconfig_type { | |||
| 2699 | * is only used if the configured rate control algorithm actually uses | 2725 | * is only used if the configured rate control algorithm actually uses |
| 2700 | * 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. |
| 2701 | * | 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 | * | ||
| 2702 | * @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), |
| 2703 | * bursting) for a hardware TX queue. | 2737 | * bursting) for a hardware TX queue. |
| 2704 | * Returns a negative error code on failure. | 2738 | * Returns a negative error code on failure. |
| @@ -2859,9 +2893,6 @@ enum ieee80211_reconfig_type { | |||
| 2859 | * @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 |
| 2860 | * and perhaps other supported types of ethtool data-sets. | 2894 | * and perhaps other supported types of ethtool data-sets. |
| 2861 | * | 2895 | * |
| 2862 | * @get_rssi: Get current signal strength in dBm, the function is optional | ||
| 2863 | * and can sleep. | ||
| 2864 | * | ||
| 2865 | * @mgd_prepare_tx: Prepare for transmitting a management frame for association | 2896 | * @mgd_prepare_tx: Prepare for transmitting a management frame for association |
| 2866 | * before associated. In multi-channel scenarios, a virtual interface is | 2897 | * before associated. In multi-channel scenarios, a virtual interface is |
| 2867 | * 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 |
| @@ -3062,6 +3093,10 @@ struct ieee80211_ops { | |||
| 3062 | void (*sta_rate_tbl_update)(struct ieee80211_hw *hw, | 3093 | void (*sta_rate_tbl_update)(struct ieee80211_hw *hw, |
| 3063 | struct ieee80211_vif *vif, | 3094 | struct ieee80211_vif *vif, |
| 3064 | 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); | ||
| 3065 | int (*conf_tx)(struct ieee80211_hw *hw, | 3100 | int (*conf_tx)(struct ieee80211_hw *hw, |
| 3066 | struct ieee80211_vif *vif, u16 ac, | 3101 | struct ieee80211_vif *vif, u16 ac, |
| 3067 | const struct ieee80211_tx_queue_params *params); | 3102 | const struct ieee80211_tx_queue_params *params); |
| @@ -3129,8 +3164,6 @@ struct ieee80211_ops { | |||
| 3129 | void (*get_et_strings)(struct ieee80211_hw *hw, | 3164 | void (*get_et_strings)(struct ieee80211_hw *hw, |
| 3130 | struct ieee80211_vif *vif, | 3165 | struct ieee80211_vif *vif, |
| 3131 | u32 sset, u8 *data); | 3166 | u32 sset, u8 *data); |
| 3132 | int (*get_rssi)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, | ||
| 3133 | struct ieee80211_sta *sta, s8 *rssi_dbm); | ||
| 3134 | 3167 | ||
| 3135 | void (*mgd_prepare_tx)(struct ieee80211_hw *hw, | 3168 | void (*mgd_prepare_tx)(struct ieee80211_hw *hw, |
| 3136 | struct ieee80211_vif *vif); | 3169 | struct ieee80211_vif *vif); |
| @@ -4065,6 +4098,10 @@ void ieee80211_aes_cmac_calculate_k1_k2(struct ieee80211_key_conf *keyconf, | |||
| 4065 | * reverse order than in packet) | 4098 | * reverse order than in packet) |
| 4066 | * @aes_cmac: PN data, most significant byte first (big endian, | 4099 | * @aes_cmac: PN data, most significant byte first (big endian, |
| 4067 | * 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) | ||
| 4068 | */ | 4105 | */ |
| 4069 | struct ieee80211_key_seq { | 4106 | struct ieee80211_key_seq { |
| 4070 | union { | 4107 | union { |
| @@ -4078,6 +4115,12 @@ struct ieee80211_key_seq { | |||
| 4078 | struct { | 4115 | struct { |
| 4079 | u8 pn[6]; | 4116 | u8 pn[6]; |
| 4080 | } aes_cmac; | 4117 | } aes_cmac; |
| 4118 | struct { | ||
| 4119 | u8 pn[6]; | ||
| 4120 | } aes_gmac; | ||
| 4121 | struct { | ||
| 4122 | u8 pn[6]; | ||
| 4123 | } gcmp; | ||
| 4081 | }; | 4124 | }; |
| 4082 | }; | 4125 | }; |
| 4083 | 4126 | ||
| @@ -4102,7 +4145,7 @@ void ieee80211_get_key_tx_seq(struct ieee80211_key_conf *keyconf, | |||
| 4102 | * ieee80211_get_key_rx_seq - get key RX sequence counter | 4145 | * ieee80211_get_key_rx_seq - get key RX sequence counter |
| 4103 | * | 4146 | * |
| 4104 | * @keyconf: the parameter passed with the set key | 4147 | * @keyconf: the parameter passed with the set key |
| 4105 | * @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); |
| 4106 | * 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 |
| 4107 | * CMAC, only TID 0 is valid. | 4150 | * CMAC, only TID 0 is valid. |
| 4108 | * @seq: buffer to receive the sequence data | 4151 | * @seq: buffer to receive the sequence data |
| @@ -4138,7 +4181,7 @@ void ieee80211_set_key_tx_seq(struct ieee80211_key_conf *keyconf, | |||
| 4138 | * ieee80211_set_key_rx_seq - set key RX sequence counter | 4181 | * ieee80211_set_key_rx_seq - set key RX sequence counter |
| 4139 | * | 4182 | * |
| 4140 | * @keyconf: the parameter passed with the set key | 4183 | * @keyconf: the parameter passed with the set key |
| 4141 | * @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); |
| 4142 | * 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 |
| 4143 | * CMAC, only TID 0 is valid. | 4186 | * CMAC, only TID 0 is valid. |
| 4144 | * @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/neighbour.h b/include/net/neighbour.h index eb070b3674a1..76f708486aae 100644 --- a/include/net/neighbour.h +++ b/include/net/neighbour.h | |||
| @@ -190,7 +190,6 @@ struct neigh_hash_table { | |||
| 190 | 190 | ||
| 191 | 191 | ||
| 192 | struct neigh_table { | 192 | struct neigh_table { |
| 193 | struct neigh_table *next; | ||
| 194 | int family; | 193 | int family; |
| 195 | int entry_size; | 194 | int entry_size; |
| 196 | int key_len; | 195 | int key_len; |
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/netfilter/nf_tables.h b/include/net/netfilter/nf_tables.h index 3ae969e3acf0..9eaaa7884586 100644 --- a/include/net/netfilter/nf_tables.h +++ b/include/net/netfilter/nf_tables.h | |||
| @@ -530,6 +530,8 @@ enum nft_chain_type { | |||
| 530 | 530 | ||
| 531 | int nft_chain_validate_dependency(const struct nft_chain *chain, | 531 | int nft_chain_validate_dependency(const struct nft_chain *chain, |
| 532 | enum nft_chain_type type); | 532 | enum nft_chain_type type); |
| 533 | int nft_chain_validate_hooks(const struct nft_chain *chain, | ||
| 534 | unsigned int hook_flags); | ||
| 533 | 535 | ||
| 534 | struct nft_stats { | 536 | struct nft_stats { |
| 535 | u64 bytes; | 537 | u64 bytes; |
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 24945cefc4fd..dbe225478adb 100644 --- a/include/net/netns/ipv4.h +++ b/include/net/netns/ipv4.h | |||
| @@ -48,10 +48,12 @@ 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; |
| 56 | struct sock * __percpu *tcp_sk; | ||
| 55 | struct netns_frags frags; | 57 | struct netns_frags frags; |
| 56 | #ifdef CONFIG_NETFILTER | 58 | #ifdef CONFIG_NETFILTER |
| 57 | struct xt_table *iptable_filter; | 59 | struct xt_table *iptable_filter; |
| @@ -80,6 +82,8 @@ struct netns_ipv4 { | |||
| 80 | 82 | ||
| 81 | int sysctl_fwmark_reflect; | 83 | int sysctl_fwmark_reflect; |
| 82 | int sysctl_tcp_fwmark_accept; | 84 | int sysctl_tcp_fwmark_accept; |
| 85 | int sysctl_tcp_mtu_probing; | ||
| 86 | int sysctl_tcp_base_mss; | ||
| 83 | 87 | ||
| 84 | struct ping_group_range ping_group_range; | 88 | struct ping_group_range ping_group_range; |
| 85 | 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/sch_generic.h b/include/net/sch_generic.h index 3d282cbb66bf..c605d305c577 100644 --- a/include/net/sch_generic.h +++ b/include/net/sch_generic.h | |||
| @@ -79,6 +79,9 @@ struct Qdisc { | |||
| 79 | struct netdev_queue *dev_queue; | 79 | struct netdev_queue *dev_queue; |
| 80 | 80 | ||
| 81 | struct gnet_stats_rate_est64 rate_est; | 81 | struct gnet_stats_rate_est64 rate_est; |
| 82 | struct gnet_stats_basic_cpu __percpu *cpu_bstats; | ||
| 83 | struct gnet_stats_queue __percpu *cpu_qstats; | ||
| 84 | |||
| 82 | struct Qdisc *next_sched; | 85 | struct Qdisc *next_sched; |
| 83 | struct sk_buff *gso_skb; | 86 | struct sk_buff *gso_skb; |
| 84 | /* | 87 | /* |
| @@ -86,15 +89,9 @@ struct Qdisc { | |||
| 86 | */ | 89 | */ |
| 87 | unsigned long state; | 90 | unsigned long state; |
| 88 | struct sk_buff_head q; | 91 | struct sk_buff_head q; |
| 89 | union { | 92 | struct gnet_stats_basic_packed bstats; |
| 90 | struct gnet_stats_basic_packed bstats; | ||
| 91 | struct gnet_stats_basic_cpu __percpu *cpu_bstats; | ||
| 92 | } __packed; | ||
| 93 | unsigned int __state; | 93 | unsigned int __state; |
| 94 | union { | 94 | struct gnet_stats_queue qstats; |
| 95 | struct gnet_stats_queue qstats; | ||
| 96 | struct gnet_stats_queue __percpu *cpu_qstats; | ||
| 97 | } __packed; | ||
| 98 | struct rcu_head rcu_head; | 95 | struct rcu_head rcu_head; |
| 99 | int padded; | 96 | int padded; |
| 100 | atomic_t refcnt; | 97 | atomic_t refcnt; |
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 f50f29faf76f..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); |
| @@ -834,13 +842,24 @@ void tcp_get_available_congestion_control(char *buf, size_t len); | |||
| 834 | void tcp_get_allowed_congestion_control(char *buf, size_t len); | 842 | void tcp_get_allowed_congestion_control(char *buf, size_t len); |
| 835 | int tcp_set_allowed_congestion_control(char *allowed); | 843 | int tcp_set_allowed_congestion_control(char *allowed); |
| 836 | int tcp_set_congestion_control(struct sock *sk, const char *name); | 844 | int tcp_set_congestion_control(struct sock *sk, const char *name); |
| 837 | void tcp_slow_start(struct tcp_sock *tp, u32 acked); | 845 | u32 tcp_slow_start(struct tcp_sock *tp, u32 acked); |
| 838 | void tcp_cong_avoid_ai(struct tcp_sock *tp, u32 w); | 846 | void tcp_cong_avoid_ai(struct tcp_sock *tp, u32 w, u32 acked); |
| 839 | 847 | ||
| 840 | u32 tcp_reno_ssthresh(struct sock *sk); | 848 | 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 57cccd0052e5..2927d6244481 100644 --- a/include/net/vxlan.h +++ b/include/net/vxlan.h | |||
| @@ -1,6 +1,9 @@ | |||
| 1 | #ifndef __NET_VXLAN_H | 1 | #ifndef __NET_VXLAN_H |
| 2 | #define __NET_VXLAN_H 1 | 2 | #define __NET_VXLAN_H 1 |
| 3 | 3 | ||
| 4 | #include <linux/ip.h> | ||
| 5 | #include <linux/ipv6.h> | ||
| 6 | #include <linux/if_vlan.h> | ||
| 4 | #include <linux/skbuff.h> | 7 | #include <linux/skbuff.h> |
| 5 | #include <linux/netdevice.h> | 8 | #include <linux/netdevice.h> |
| 6 | #include <linux/udp.h> | 9 | #include <linux/udp.h> |
| @@ -8,14 +11,96 @@ | |||
| 8 | #define VNI_HASH_BITS 10 | 11 | #define VNI_HASH_BITS 10 |
| 9 | #define VNI_HASH_SIZE (1<<VNI_HASH_BITS) | 12 | #define VNI_HASH_SIZE (1<<VNI_HASH_BITS) |
| 10 | 13 | ||
| 11 | /* 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 | */ | ||
| 12 | struct vxlanhdr { | 75 | struct vxlanhdr { |
| 13 | __be32 vx_flags; | 76 | __be32 vx_flags; |
| 14 | __be32 vx_vni; | 77 | __be32 vx_vni; |
| 15 | }; | 78 | }; |
| 16 | 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 | |||
| 17 | struct vxlan_sock; | 101 | struct vxlan_sock; |
| 18 | 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); | ||
| 19 | 104 | ||
| 20 | /* per UDP socket information */ | 105 | /* per UDP socket information */ |
| 21 | struct vxlan_sock { | 106 | struct vxlan_sock { |
| @@ -28,6 +113,7 @@ struct vxlan_sock { | |||
| 28 | struct hlist_head vni_list[VNI_HASH_SIZE]; | 113 | struct hlist_head vni_list[VNI_HASH_SIZE]; |
| 29 | atomic_t refcnt; | 114 | atomic_t refcnt; |
| 30 | struct udp_offload udp_offloads; | 115 | struct udp_offload udp_offloads; |
| 116 | u32 flags; | ||
| 31 | }; | 117 | }; |
| 32 | 118 | ||
| 33 | #define VXLAN_F_LEARN 0x01 | 119 | #define VXLAN_F_LEARN 0x01 |
| @@ -39,6 +125,16 @@ struct vxlan_sock { | |||
| 39 | #define VXLAN_F_UDP_CSUM 0x40 | 125 | #define VXLAN_F_UDP_CSUM 0x40 |
| 40 | #define VXLAN_F_UDP_ZERO_CSUM6_TX 0x80 | 126 | #define VXLAN_F_UDP_ZERO_CSUM6_TX 0x80 |
| 41 | #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 | |||
| 132 | /* Flags that are used in the receive patch. These flags must match in | ||
| 133 | * order for a socket to be shareable | ||
| 134 | */ | ||
| 135 | #define VXLAN_F_RCV_FLAGS (VXLAN_F_GBP | \ | ||
| 136 | VXLAN_F_UDP_ZERO_CSUM6_RX | \ | ||
| 137 | VXLAN_F_REMCSUM_RX) | ||
| 42 | 138 | ||
| 43 | struct vxlan_sock *vxlan_sock_add(struct net *net, __be16 port, | 139 | struct vxlan_sock *vxlan_sock_add(struct net *net, __be16 port, |
| 44 | vxlan_rcv_t *rcv, void *data, | 140 | vxlan_rcv_t *rcv, void *data, |
| @@ -46,21 +142,38 @@ struct vxlan_sock *vxlan_sock_add(struct net *net, __be16 port, | |||
| 46 | 142 | ||
| 47 | void vxlan_sock_release(struct vxlan_sock *vs); | 143 | void vxlan_sock_release(struct vxlan_sock *vs); |
| 48 | 144 | ||
| 49 | int vxlan_xmit_skb(struct vxlan_sock *vs, | 145 | int vxlan_xmit_skb(struct rtable *rt, struct sk_buff *skb, |
| 50 | struct rtable *rt, struct sk_buff *skb, | ||
| 51 | __be32 src, __be32 dst, __u8 tos, __u8 ttl, __be16 df, | 146 | __be32 src, __be32 dst, __u8 tos, __u8 ttl, __be16 df, |
| 52 | __be16 src_port, __be16 dst_port, __be32 vni, bool xnet); | 147 | __be16 src_port, __be16 dst_port, struct vxlan_metadata *md, |
| 148 | bool xnet, u32 vxflags); | ||
| 53 | 149 | ||
| 54 | static inline bool vxlan_gso_check(struct sk_buff *skb) | 150 | static inline netdev_features_t vxlan_features_check(struct sk_buff *skb, |
| 151 | netdev_features_t features) | ||
| 55 | { | 152 | { |
| 56 | if ((skb_shinfo(skb)->gso_type & SKB_GSO_UDP_TUNNEL) && | 153 | u8 l4_hdr = 0; |
| 154 | |||
| 155 | if (!skb->encapsulation) | ||
| 156 | return features; | ||
| 157 | |||
| 158 | switch (vlan_get_protocol(skb)) { | ||
| 159 | case htons(ETH_P_IP): | ||
| 160 | l4_hdr = ip_hdr(skb)->protocol; | ||
| 161 | break; | ||
| 162 | case htons(ETH_P_IPV6): | ||
| 163 | l4_hdr = ipv6_hdr(skb)->nexthdr; | ||
| 164 | break; | ||
| 165 | default: | ||
| 166 | return features;; | ||
| 167 | } | ||
| 168 | |||
| 169 | if ((l4_hdr == IPPROTO_UDP) && | ||
| 57 | (skb->inner_protocol_type != ENCAP_TYPE_ETHER || | 170 | (skb->inner_protocol_type != ENCAP_TYPE_ETHER || |
| 58 | skb->inner_protocol != htons(ETH_P_TEB) || | 171 | skb->inner_protocol != htons(ETH_P_TEB) || |
| 59 | (skb_inner_mac_header(skb) - skb_transport_header(skb) != | 172 | (skb_inner_mac_header(skb) - skb_transport_header(skb) != |
| 60 | sizeof(struct udphdr) + sizeof(struct vxlanhdr)))) | 173 | sizeof(struct udphdr) + sizeof(struct vxlanhdr)))) |
| 61 | return false; | 174 | return features & ~(NETIF_F_ALL_CSUM | NETIF_F_GSO_MASK); |
| 62 | 175 | ||
| 63 | return true; | 176 | return features; |
| 64 | } | 177 | } |
| 65 | 178 | ||
| 66 | /* IP header + UDP + VXLAN + Ethernet header */ | 179 | /* IP header + UDP + VXLAN + Ethernet header */ |
