Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'mptcp-convert-netlink-code-to-use-yaml-spec'

Mat Martineau says:

====================
mptcp: convert Netlink code to use YAML spec

This series from Davide converts most of the MPTCP Netlink interface
(plus uAPI bits) to use sources generated by YNL using a YAML spec file.

This new YAML file is useful to validate the API and to generate a good
documentation page.

Patch 1 modifies YNL spec to support "uns-admin-perm" for genetlink
legacy.

Patch 2 adds support for validating exact length of netlink attrs.

Patch 3 converts Netlink structures from small_ops to ops to prepare the
switch to YAML.

Patch 4 adds the Netlink YAML spec for MPTCP.

Patch 5 adds and uses a new header file generated from the new YAML
spec.

Patch 6 renames some handlers to match the ones generated from the YAML
spec.

Patch 7 adds and uses Netlink policies automatically generated from the
YAML spec.
====================

Link: https://lore.kernel.org/r/20231023-send-net-next-20231023-1-v2-0-16b1f701f900@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+843 -285
+3
Documentation/netlink/genetlink.yaml
··· 172 172 max-len: 173 173 description: Max length for a string or a binary attribute. 174 174 $ref: '#/$defs/len-or-define' 175 + exact-len: 176 + description: Exact length for a string or a binary attribute. 177 + $ref: '#/$defs/len-or-define' 175 178 sub-type: *attr-type 176 179 display-hint: &display-hint 177 180 description: |
+391
Documentation/netlink/specs/mptcp.yaml
··· 1 + # SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) 2 + 3 + name: mptcp_pm 4 + protocol: genetlink-legacy 5 + doc: Multipath TCP. 6 + 7 + c-family-name: mptcp-pm-name 8 + c-version-name: mptcp-pm-ver 9 + max-by-define: true 10 + kernel-policy: per-op 11 + 12 + definitions: 13 + - 14 + type: enum 15 + name: event-type 16 + enum-name: mptcp-event-type 17 + name-prefix: mptcp-event- 18 + entries: 19 + - 20 + name: unspec 21 + doc: unused event 22 + - 23 + name: created 24 + doc: 25 + token, family, saddr4 | saddr6, daddr4 | daddr6, sport, dport 26 + A new MPTCP connection has been created. It is the good time to 27 + allocate memory and send ADD_ADDR if needed. Depending on the 28 + traffic-patterns it can take a long time until the 29 + MPTCP_EVENT_ESTABLISHED is sent. 30 + - 31 + name: established 32 + doc: 33 + token, family, saddr4 | saddr6, daddr4 | daddr6, sport, dport 34 + A MPTCP connection is established (can start new subflows). 35 + - 36 + name: closed 37 + doc: 38 + token 39 + A MPTCP connection has stopped. 40 + - 41 + name: announced 42 + value: 6 43 + doc: 44 + token, rem_id, family, daddr4 | daddr6 [, dport] 45 + A new address has been announced by the peer. 46 + - 47 + name: removed 48 + doc: 49 + token, rem_id 50 + An address has been lost by the peer. 51 + - 52 + name: sub-established 53 + value: 10 54 + doc: 55 + token, family, loc_id, rem_id, saddr4 | saddr6, daddr4 | daddr6, sport, 56 + dport, backup, if_idx [, error] 57 + A new subflow has been established. 'error' should not be set. 58 + - 59 + name: sub-closed 60 + doc: 61 + token, family, loc_id, rem_id, saddr4 | saddr6, daddr4 | daddr6, sport, 62 + dport, backup, if_idx [, error] 63 + A subflow has been closed. An error (copy of sk_err) could be set if an 64 + error has been detected for this subflow. 65 + - 66 + name: sub-priority 67 + value: 13 68 + doc: 69 + token, family, loc_id, rem_id, saddr4 | saddr6, daddr4 | daddr6, sport, 70 + dport, backup, if_idx [, error] 71 + The priority of a subflow has changed. 'error' should not be set. 72 + - 73 + name: listener-created 74 + value: 15 75 + doc: 76 + family, sport, saddr4 | saddr6 77 + A new PM listener is created. 78 + - 79 + name: listener-closed 80 + doc: 81 + family, sport, saddr4 | saddr6 82 + A PM listener is closed. 83 + 84 + attribute-sets: 85 + - 86 + name: address 87 + name-prefix: mptcp-pm-addr-attr- 88 + attributes: 89 + - 90 + name: unspec 91 + type: unused 92 + value: 0 93 + - 94 + name: family 95 + type: u16 96 + - 97 + name: id 98 + type: u8 99 + - 100 + name: addr4 101 + type: u32 102 + byte-order: big-endian 103 + - 104 + name: addr6 105 + type: binary 106 + checks: 107 + exact-len: 16 108 + - 109 + name: port 110 + type: u16 111 + byte-order: big-endian 112 + - 113 + name: flags 114 + type: u32 115 + - 116 + name: if-idx 117 + type: s32 118 + - 119 + name: subflow-attribute 120 + name-prefix: mptcp-subflow-attr- 121 + attributes: 122 + - 123 + name: unspec 124 + type: unused 125 + value: 0 126 + - 127 + name: token-rem 128 + type: u32 129 + - 130 + name: token-loc 131 + type: u32 132 + - 133 + name: relwrite-seq 134 + type: u32 135 + - 136 + name: map-seq 137 + type: u64 138 + - 139 + name: map-sfseq 140 + type: u32 141 + - 142 + name: ssn-offset 143 + type: u32 144 + - 145 + name: map-datalen 146 + type: u16 147 + - 148 + name: flags 149 + type: u32 150 + - 151 + name: id-rem 152 + type: u8 153 + - 154 + name: id-loc 155 + type: u8 156 + - 157 + name: pad 158 + type: pad 159 + - 160 + name: endpoint 161 + name-prefix: mptcp-pm-endpoint- 162 + attributes: 163 + - 164 + name: addr 165 + type: nest 166 + nested-attributes: address 167 + - 168 + name: attr 169 + name-prefix: mptcp-pm-attr- 170 + attributes: 171 + - 172 + name: unspec 173 + type: unused 174 + value: 0 175 + - 176 + name: addr 177 + type: nest 178 + nested-attributes: address 179 + - 180 + name: rcv-add-addrs 181 + type: u32 182 + - 183 + name: subflows 184 + type: u32 185 + - 186 + name: token 187 + type: u32 188 + - 189 + name: loc-id 190 + type: u8 191 + - 192 + name: addr-remote 193 + type: nest 194 + nested-attributes: address 195 + - 196 + name: event-attr 197 + enum-name: mptcp-event-attr 198 + name-prefix: mptcp-attr- 199 + attributes: 200 + - 201 + name: unspec 202 + type: unused 203 + value: 0 204 + - 205 + name: token 206 + type: u32 207 + - 208 + name: family 209 + type: u16 210 + - 211 + name: loc-id 212 + type: u8 213 + - 214 + name: rem-id 215 + type: u8 216 + - 217 + name: saddr4 218 + type: u32 219 + byte-order: big-endian 220 + - 221 + name: saddr6 222 + type: binary 223 + checks: 224 + min-len: 16 225 + - 226 + name: daddr4 227 + type: u32 228 + byte-order: big-endian 229 + - 230 + name: daddr6 231 + type: binary 232 + checks: 233 + min-len: 16 234 + - 235 + name: sport 236 + type: u16 237 + byte-order: big-endian 238 + - 239 + name: dport 240 + type: u16 241 + byte-order: big-endian 242 + - 243 + name: backup 244 + type: u8 245 + - 246 + name: error 247 + type: u8 248 + - 249 + name: flags 250 + type: u16 251 + - 252 + name: timeout 253 + type: u32 254 + - 255 + name: if_idx 256 + type: u32 257 + - 258 + name: reset-reason 259 + type: u32 260 + - 261 + name: reset-flags 262 + type: u32 263 + - 264 + name: server-side 265 + type: u8 266 + 267 + operations: 268 + list: 269 + - 270 + name: unspec 271 + doc: unused 272 + value: 0 273 + - 274 + name: add-addr 275 + doc: Add endpoint 276 + attribute-set: endpoint 277 + dont-validate: [ strict ] 278 + flags: [ uns-admin-perm ] 279 + do: &add-addr-attrs 280 + request: 281 + attributes: 282 + - addr 283 + - 284 + name: del-addr 285 + doc: Delete endpoint 286 + attribute-set: endpoint 287 + dont-validate: [ strict ] 288 + flags: [ uns-admin-perm ] 289 + do: *add-addr-attrs 290 + - 291 + name: get-addr 292 + doc: Get endpoint information 293 + attribute-set: endpoint 294 + dont-validate: [ strict ] 295 + flags: [ uns-admin-perm ] 296 + do: &get-addr-attrs 297 + request: 298 + attributes: 299 + - addr 300 + reply: 301 + attributes: 302 + - addr 303 + dump: 304 + reply: 305 + attributes: 306 + - addr 307 + - 308 + name: flush-addrs 309 + doc: flush addresses 310 + attribute-set: endpoint 311 + dont-validate: [ strict ] 312 + flags: [ uns-admin-perm ] 313 + do: *add-addr-attrs 314 + - 315 + name: set-limits 316 + doc: Set protocol limits 317 + attribute-set: attr 318 + dont-validate: [ strict ] 319 + flags: [ uns-admin-perm ] 320 + do: &mptcp-limits 321 + request: 322 + attributes: 323 + - rcv-add-addrs 324 + - subflows 325 + - 326 + name: get-limits 327 + doc: Get protocol limits 328 + attribute-set: attr 329 + dont-validate: [ strict ] 330 + do: &mptcp-get-limits 331 + request: 332 + attributes: 333 + - rcv-add-addrs 334 + - subflows 335 + reply: 336 + attributes: 337 + - rcv-add-addrs 338 + - subflows 339 + - 340 + name: set-flags 341 + doc: Change endpoint flags 342 + attribute-set: attr 343 + dont-validate: [ strict ] 344 + flags: [ uns-admin-perm ] 345 + do: &mptcp-set-flags 346 + request: 347 + attributes: 348 + - addr 349 + - token 350 + - addr-remote 351 + - 352 + name: announce 353 + doc: announce new sf 354 + attribute-set: attr 355 + dont-validate: [ strict ] 356 + flags: [ uns-admin-perm ] 357 + do: &announce-add 358 + request: 359 + attributes: 360 + - addr 361 + - token 362 + - 363 + name: remove 364 + doc: announce removal 365 + attribute-set: attr 366 + dont-validate: [ strict ] 367 + flags: [ uns-admin-perm ] 368 + do: 369 + request: 370 + attributes: 371 + - token 372 + - loc-id 373 + - 374 + name: subflow-create 375 + doc: todo 376 + attribute-set: attr 377 + dont-validate: [ strict ] 378 + flags: [ uns-admin-perm ] 379 + do: &sf-create 380 + request: 381 + attributes: 382 + - addr 383 + - token 384 + - addr-remote 385 + - 386 + name: subflow-destroy 387 + doc: todo 388 + attribute-set: attr 389 + dont-validate: [ strict ] 390 + flags: [ uns-admin-perm ] 391 + do: *sf-create
+2 -1
MAINTAINERS
··· 14960 14960 B: https://github.com/multipath-tcp/mptcp_net-next/issues 14961 14961 T: git https://github.com/multipath-tcp/mptcp_net-next.git export-net 14962 14962 T: git https://github.com/multipath-tcp/mptcp_net-next.git export 14963 + F: Documentation/netlink/specs/mptcp.yaml 14963 14964 F: Documentation/networking/mptcp-sysctl.rst 14964 14965 F: include/net/mptcp.h 14965 14966 F: include/trace/events/mptcp.h 14966 - F: include/uapi/linux/mptcp.h 14967 + F: include/uapi/linux/mptcp*.h 14967 14968 F: net/mptcp/ 14968 14969 F: tools/testing/selftests/bpf/*/*mptcp*.c 14969 14970 F: tools/testing/selftests/net/mptcp/
+10 -164
include/uapi/linux/mptcp.h
··· 23 23 #define MPTCP_SUBFLOW_FLAG_CONNECTED _BITUL(7) 24 24 #define MPTCP_SUBFLOW_FLAG_MAPVALID _BITUL(8) 25 25 26 - enum { 27 - MPTCP_SUBFLOW_ATTR_UNSPEC, 28 - MPTCP_SUBFLOW_ATTR_TOKEN_REM, 29 - MPTCP_SUBFLOW_ATTR_TOKEN_LOC, 30 - MPTCP_SUBFLOW_ATTR_RELWRITE_SEQ, 31 - MPTCP_SUBFLOW_ATTR_MAP_SEQ, 32 - MPTCP_SUBFLOW_ATTR_MAP_SFSEQ, 33 - MPTCP_SUBFLOW_ATTR_SSN_OFFSET, 34 - MPTCP_SUBFLOW_ATTR_MAP_DATALEN, 35 - MPTCP_SUBFLOW_ATTR_FLAGS, 36 - MPTCP_SUBFLOW_ATTR_ID_REM, 37 - MPTCP_SUBFLOW_ATTR_ID_LOC, 38 - MPTCP_SUBFLOW_ATTR_PAD, 39 - __MPTCP_SUBFLOW_ATTR_MAX 40 - }; 41 - 42 - #define MPTCP_SUBFLOW_ATTR_MAX (__MPTCP_SUBFLOW_ATTR_MAX - 1) 43 - 44 - /* netlink interface */ 45 - #define MPTCP_PM_NAME "mptcp_pm" 46 26 #define MPTCP_PM_CMD_GRP_NAME "mptcp_pm_cmds" 47 27 #define MPTCP_PM_EV_GRP_NAME "mptcp_pm_events" 48 - #define MPTCP_PM_VER 0x1 49 28 50 - /* 51 - * ATTR types defined for MPTCP 52 - */ 53 - enum { 54 - MPTCP_PM_ATTR_UNSPEC, 29 + #include <linux/mptcp_pm.h> 55 30 56 - MPTCP_PM_ATTR_ADDR, /* nested address */ 57 - MPTCP_PM_ATTR_RCV_ADD_ADDRS, /* u32 */ 58 - MPTCP_PM_ATTR_SUBFLOWS, /* u32 */ 59 - MPTCP_PM_ATTR_TOKEN, /* u32 */ 60 - MPTCP_PM_ATTR_LOC_ID, /* u8 */ 61 - MPTCP_PM_ATTR_ADDR_REMOTE, /* nested address */ 62 - 63 - __MPTCP_PM_ATTR_MAX 64 - }; 65 - 66 - #define MPTCP_PM_ATTR_MAX (__MPTCP_PM_ATTR_MAX - 1) 67 - 68 - enum { 69 - MPTCP_PM_ADDR_ATTR_UNSPEC, 70 - 71 - MPTCP_PM_ADDR_ATTR_FAMILY, /* u16 */ 72 - MPTCP_PM_ADDR_ATTR_ID, /* u8 */ 73 - MPTCP_PM_ADDR_ATTR_ADDR4, /* struct in_addr */ 74 - MPTCP_PM_ADDR_ATTR_ADDR6, /* struct in6_addr */ 75 - MPTCP_PM_ADDR_ATTR_PORT, /* u16 */ 76 - MPTCP_PM_ADDR_ATTR_FLAGS, /* u32 */ 77 - MPTCP_PM_ADDR_ATTR_IF_IDX, /* s32 */ 78 - 79 - __MPTCP_PM_ADDR_ATTR_MAX 80 - }; 81 - 82 - #define MPTCP_PM_ADDR_ATTR_MAX (__MPTCP_PM_ADDR_ATTR_MAX - 1) 83 - 84 - #define MPTCP_PM_ADDR_FLAG_SIGNAL (1 << 0) 85 - #define MPTCP_PM_ADDR_FLAG_SUBFLOW (1 << 1) 86 - #define MPTCP_PM_ADDR_FLAG_BACKUP (1 << 2) 87 - #define MPTCP_PM_ADDR_FLAG_FULLMESH (1 << 3) 88 - #define MPTCP_PM_ADDR_FLAG_IMPLICIT (1 << 4) 89 - 90 - enum { 91 - MPTCP_PM_CMD_UNSPEC, 92 - 93 - MPTCP_PM_CMD_ADD_ADDR, 94 - MPTCP_PM_CMD_DEL_ADDR, 95 - MPTCP_PM_CMD_GET_ADDR, 96 - MPTCP_PM_CMD_FLUSH_ADDRS, 97 - MPTCP_PM_CMD_SET_LIMITS, 98 - MPTCP_PM_CMD_GET_LIMITS, 99 - MPTCP_PM_CMD_SET_FLAGS, 100 - MPTCP_PM_CMD_ANNOUNCE, 101 - MPTCP_PM_CMD_REMOVE, 102 - MPTCP_PM_CMD_SUBFLOW_CREATE, 103 - MPTCP_PM_CMD_SUBFLOW_DESTROY, 104 - 105 - __MPTCP_PM_CMD_AFTER_LAST 106 - }; 31 + /* for backward compatibility */ 32 + #define __MPTCP_PM_CMD_AFTER_LAST __MPTCP_PM_CMD_MAX 33 + #define __MPTCP_ATTR_AFTER_LAST __MPTCP_ATTR_MAX 107 34 108 35 #define MPTCP_INFO_FLAG_FALLBACK _BITUL(0) 109 36 #define MPTCP_INFO_FLAG_REMOTE_KEY_RECEIVED _BITUL(1) 37 + 38 + #define MPTCP_PM_ADDR_FLAG_SIGNAL (1 << 0) 39 + #define MPTCP_PM_ADDR_FLAG_SUBFLOW (1 << 1) 40 + #define MPTCP_PM_ADDR_FLAG_BACKUP (1 << 2) 41 + #define MPTCP_PM_ADDR_FLAG_FULLMESH (1 << 3) 42 + #define MPTCP_PM_ADDR_FLAG_IMPLICIT (1 << 4) 110 43 111 44 struct mptcp_info { 112 45 __u8 mptcpi_subflows; ··· 62 129 __u64 mptcpi_bytes_received; 63 130 __u64 mptcpi_bytes_acked; 64 131 }; 65 - 66 - /* 67 - * MPTCP_EVENT_CREATED: token, family, saddr4 | saddr6, daddr4 | daddr6, 68 - * sport, dport 69 - * A new MPTCP connection has been created. It is the good time to allocate 70 - * memory and send ADD_ADDR if needed. Depending on the traffic-patterns 71 - * it can take a long time until the MPTCP_EVENT_ESTABLISHED is sent. 72 - * 73 - * MPTCP_EVENT_ESTABLISHED: token, family, saddr4 | saddr6, daddr4 | daddr6, 74 - * sport, dport 75 - * A MPTCP connection is established (can start new subflows). 76 - * 77 - * MPTCP_EVENT_CLOSED: token 78 - * A MPTCP connection has stopped. 79 - * 80 - * MPTCP_EVENT_ANNOUNCED: token, rem_id, family, daddr4 | daddr6 [, dport] 81 - * A new address has been announced by the peer. 82 - * 83 - * MPTCP_EVENT_REMOVED: token, rem_id 84 - * An address has been lost by the peer. 85 - * 86 - * MPTCP_EVENT_SUB_ESTABLISHED: token, family, loc_id, rem_id, 87 - * saddr4 | saddr6, daddr4 | daddr6, sport, 88 - * dport, backup, if_idx [, error] 89 - * A new subflow has been established. 'error' should not be set. 90 - * 91 - * MPTCP_EVENT_SUB_CLOSED: token, family, loc_id, rem_id, saddr4 | saddr6, 92 - * daddr4 | daddr6, sport, dport, backup, if_idx 93 - * [, error] 94 - * A subflow has been closed. An error (copy of sk_err) could be set if an 95 - * error has been detected for this subflow. 96 - * 97 - * MPTCP_EVENT_SUB_PRIORITY: token, family, loc_id, rem_id, saddr4 | saddr6, 98 - * daddr4 | daddr6, sport, dport, backup, if_idx 99 - * [, error] 100 - * The priority of a subflow has changed. 'error' should not be set. 101 - * 102 - * MPTCP_EVENT_LISTENER_CREATED: family, sport, saddr4 | saddr6 103 - * A new PM listener is created. 104 - * 105 - * MPTCP_EVENT_LISTENER_CLOSED: family, sport, saddr4 | saddr6 106 - * A PM listener is closed. 107 - */ 108 - enum mptcp_event_type { 109 - MPTCP_EVENT_UNSPEC = 0, 110 - MPTCP_EVENT_CREATED = 1, 111 - MPTCP_EVENT_ESTABLISHED = 2, 112 - MPTCP_EVENT_CLOSED = 3, 113 - 114 - MPTCP_EVENT_ANNOUNCED = 6, 115 - MPTCP_EVENT_REMOVED = 7, 116 - 117 - MPTCP_EVENT_SUB_ESTABLISHED = 10, 118 - MPTCP_EVENT_SUB_CLOSED = 11, 119 - 120 - MPTCP_EVENT_SUB_PRIORITY = 13, 121 - 122 - MPTCP_EVENT_LISTENER_CREATED = 15, 123 - MPTCP_EVENT_LISTENER_CLOSED = 16, 124 - }; 125 - 126 - enum mptcp_event_attr { 127 - MPTCP_ATTR_UNSPEC = 0, 128 - 129 - MPTCP_ATTR_TOKEN, /* u32 */ 130 - MPTCP_ATTR_FAMILY, /* u16 */ 131 - MPTCP_ATTR_LOC_ID, /* u8 */ 132 - MPTCP_ATTR_REM_ID, /* u8 */ 133 - MPTCP_ATTR_SADDR4, /* be32 */ 134 - MPTCP_ATTR_SADDR6, /* struct in6_addr */ 135 - MPTCP_ATTR_DADDR4, /* be32 */ 136 - MPTCP_ATTR_DADDR6, /* struct in6_addr */ 137 - MPTCP_ATTR_SPORT, /* be16 */ 138 - MPTCP_ATTR_DPORT, /* be16 */ 139 - MPTCP_ATTR_BACKUP, /* u8 */ 140 - MPTCP_ATTR_ERROR, /* u8 */ 141 - MPTCP_ATTR_FLAGS, /* u16 */ 142 - MPTCP_ATTR_TIMEOUT, /* u32 */ 143 - MPTCP_ATTR_IF_IDX, /* s32 */ 144 - MPTCP_ATTR_RESET_REASON,/* u32 */ 145 - MPTCP_ATTR_RESET_FLAGS, /* u32 */ 146 - MPTCP_ATTR_SERVER_SIDE, /* u8 */ 147 - 148 - __MPTCP_ATTR_AFTER_LAST 149 - }; 150 - 151 - #define MPTCP_ATTR_MAX (__MPTCP_ATTR_AFTER_LAST - 1) 152 132 153 133 /* MPTCP Reset reason codes, rfc8684 */ 154 134 #define MPTCP_RST_EUNSPEC 0
+150
include/uapi/linux/mptcp_pm.h
··· 1 + /* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */ 2 + /* Do not edit directly, auto-generated from: */ 3 + /* Documentation/netlink/specs/mptcp.yaml */ 4 + /* YNL-GEN uapi header */ 5 + 6 + #ifndef _UAPI_LINUX_MPTCP_PM_H 7 + #define _UAPI_LINUX_MPTCP_PM_H 8 + 9 + #define MPTCP_PM_NAME "mptcp_pm" 10 + #define MPTCP_PM_VER 1 11 + 12 + /** 13 + * enum mptcp_event_type 14 + * @MPTCP_EVENT_UNSPEC: unused event 15 + * @MPTCP_EVENT_CREATED: token, family, saddr4 | saddr6, daddr4 | daddr6, 16 + * sport, dport A new MPTCP connection has been created. It is the good time 17 + * to allocate memory and send ADD_ADDR if needed. Depending on the 18 + * traffic-patterns it can take a long time until the MPTCP_EVENT_ESTABLISHED 19 + * is sent. 20 + * @MPTCP_EVENT_ESTABLISHED: token, family, saddr4 | saddr6, daddr4 | daddr6, 21 + * sport, dport A MPTCP connection is established (can start new subflows). 22 + * @MPTCP_EVENT_CLOSED: token A MPTCP connection has stopped. 23 + * @MPTCP_EVENT_ANNOUNCED: token, rem_id, family, daddr4 | daddr6 [, dport] A 24 + * new address has been announced by the peer. 25 + * @MPTCP_EVENT_REMOVED: token, rem_id An address has been lost by the peer. 26 + * @MPTCP_EVENT_SUB_ESTABLISHED: token, family, loc_id, rem_id, saddr4 | 27 + * saddr6, daddr4 | daddr6, sport, dport, backup, if_idx [, error] A new 28 + * subflow has been established. 'error' should not be set. 29 + * @MPTCP_EVENT_SUB_CLOSED: token, family, loc_id, rem_id, saddr4 | saddr6, 30 + * daddr4 | daddr6, sport, dport, backup, if_idx [, error] A subflow has been 31 + * closed. An error (copy of sk_err) could be set if an error has been 32 + * detected for this subflow. 33 + * @MPTCP_EVENT_SUB_PRIORITY: token, family, loc_id, rem_id, saddr4 | saddr6, 34 + * daddr4 | daddr6, sport, dport, backup, if_idx [, error] The priority of a 35 + * subflow has changed. 'error' should not be set. 36 + * @MPTCP_EVENT_LISTENER_CREATED: family, sport, saddr4 | saddr6 A new PM 37 + * listener is created. 38 + * @MPTCP_EVENT_LISTENER_CLOSED: family, sport, saddr4 | saddr6 A PM listener 39 + * is closed. 40 + */ 41 + enum mptcp_event_type { 42 + MPTCP_EVENT_UNSPEC, 43 + MPTCP_EVENT_CREATED, 44 + MPTCP_EVENT_ESTABLISHED, 45 + MPTCP_EVENT_CLOSED, 46 + MPTCP_EVENT_ANNOUNCED = 6, 47 + MPTCP_EVENT_REMOVED, 48 + MPTCP_EVENT_SUB_ESTABLISHED = 10, 49 + MPTCP_EVENT_SUB_CLOSED, 50 + MPTCP_EVENT_SUB_PRIORITY = 13, 51 + MPTCP_EVENT_LISTENER_CREATED = 15, 52 + MPTCP_EVENT_LISTENER_CLOSED, 53 + }; 54 + 55 + enum { 56 + MPTCP_PM_ADDR_ATTR_UNSPEC, 57 + MPTCP_PM_ADDR_ATTR_FAMILY, 58 + MPTCP_PM_ADDR_ATTR_ID, 59 + MPTCP_PM_ADDR_ATTR_ADDR4, 60 + MPTCP_PM_ADDR_ATTR_ADDR6, 61 + MPTCP_PM_ADDR_ATTR_PORT, 62 + MPTCP_PM_ADDR_ATTR_FLAGS, 63 + MPTCP_PM_ADDR_ATTR_IF_IDX, 64 + 65 + __MPTCP_PM_ADDR_ATTR_MAX 66 + }; 67 + #define MPTCP_PM_ADDR_ATTR_MAX (__MPTCP_PM_ADDR_ATTR_MAX - 1) 68 + 69 + enum { 70 + MPTCP_SUBFLOW_ATTR_UNSPEC, 71 + MPTCP_SUBFLOW_ATTR_TOKEN_REM, 72 + MPTCP_SUBFLOW_ATTR_TOKEN_LOC, 73 + MPTCP_SUBFLOW_ATTR_RELWRITE_SEQ, 74 + MPTCP_SUBFLOW_ATTR_MAP_SEQ, 75 + MPTCP_SUBFLOW_ATTR_MAP_SFSEQ, 76 + MPTCP_SUBFLOW_ATTR_SSN_OFFSET, 77 + MPTCP_SUBFLOW_ATTR_MAP_DATALEN, 78 + MPTCP_SUBFLOW_ATTR_FLAGS, 79 + MPTCP_SUBFLOW_ATTR_ID_REM, 80 + MPTCP_SUBFLOW_ATTR_ID_LOC, 81 + MPTCP_SUBFLOW_ATTR_PAD, 82 + 83 + __MPTCP_SUBFLOW_ATTR_MAX 84 + }; 85 + #define MPTCP_SUBFLOW_ATTR_MAX (__MPTCP_SUBFLOW_ATTR_MAX - 1) 86 + 87 + enum { 88 + MPTCP_PM_ENDPOINT_ADDR = 1, 89 + 90 + __MPTCP_PM_ENDPOINT_MAX 91 + }; 92 + #define MPTCP_PM_ENDPOINT_MAX (__MPTCP_PM_ENDPOINT_MAX - 1) 93 + 94 + enum { 95 + MPTCP_PM_ATTR_UNSPEC, 96 + MPTCP_PM_ATTR_ADDR, 97 + MPTCP_PM_ATTR_RCV_ADD_ADDRS, 98 + MPTCP_PM_ATTR_SUBFLOWS, 99 + MPTCP_PM_ATTR_TOKEN, 100 + MPTCP_PM_ATTR_LOC_ID, 101 + MPTCP_PM_ATTR_ADDR_REMOTE, 102 + 103 + __MPTCP_PM_ATTR_MAX 104 + }; 105 + #define MPTCP_PM_ATTR_MAX (__MPTCP_PM_ATTR_MAX - 1) 106 + 107 + enum mptcp_event_attr { 108 + MPTCP_ATTR_UNSPEC, 109 + MPTCP_ATTR_TOKEN, 110 + MPTCP_ATTR_FAMILY, 111 + MPTCP_ATTR_LOC_ID, 112 + MPTCP_ATTR_REM_ID, 113 + MPTCP_ATTR_SADDR4, 114 + MPTCP_ATTR_SADDR6, 115 + MPTCP_ATTR_DADDR4, 116 + MPTCP_ATTR_DADDR6, 117 + MPTCP_ATTR_SPORT, 118 + MPTCP_ATTR_DPORT, 119 + MPTCP_ATTR_BACKUP, 120 + MPTCP_ATTR_ERROR, 121 + MPTCP_ATTR_FLAGS, 122 + MPTCP_ATTR_TIMEOUT, 123 + MPTCP_ATTR_IF_IDX, 124 + MPTCP_ATTR_RESET_REASON, 125 + MPTCP_ATTR_RESET_FLAGS, 126 + MPTCP_ATTR_SERVER_SIDE, 127 + 128 + __MPTCP_ATTR_MAX 129 + }; 130 + #define MPTCP_ATTR_MAX (__MPTCP_ATTR_MAX - 1) 131 + 132 + enum { 133 + MPTCP_PM_CMD_UNSPEC, 134 + MPTCP_PM_CMD_ADD_ADDR, 135 + MPTCP_PM_CMD_DEL_ADDR, 136 + MPTCP_PM_CMD_GET_ADDR, 137 + MPTCP_PM_CMD_FLUSH_ADDRS, 138 + MPTCP_PM_CMD_SET_LIMITS, 139 + MPTCP_PM_CMD_GET_LIMITS, 140 + MPTCP_PM_CMD_SET_FLAGS, 141 + MPTCP_PM_CMD_ANNOUNCE, 142 + MPTCP_PM_CMD_REMOVE, 143 + MPTCP_PM_CMD_SUBFLOW_CREATE, 144 + MPTCP_PM_CMD_SUBFLOW_DESTROY, 145 + 146 + __MPTCP_PM_CMD_MAX 147 + }; 148 + #define MPTCP_PM_CMD_MAX (__MPTCP_PM_CMD_MAX - 1) 149 + 150 + #endif /* _UAPI_LINUX_MPTCP_PM_H */
+2 -1
net/mptcp/Makefile
··· 2 2 obj-$(CONFIG_MPTCP) += mptcp.o 3 3 4 4 mptcp-y := protocol.o subflow.o options.o token.o crypto.o ctrl.o pm.o diag.o \ 5 - mib.o pm_netlink.o sockopt.o pm_userspace.o fastopen.o sched.o 5 + mib.o pm_netlink.o sockopt.o pm_userspace.o fastopen.o sched.o \ 6 + mptcp_pm_gen.o 6 7 7 8 obj-$(CONFIG_SYN_COOKIES) += syncookies.o 8 9 obj-$(CONFIG_INET_MPTCP_DIAG) += mptcp_diag.o
+179
net/mptcp/mptcp_pm_gen.c
··· 1 + // SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) 2 + /* Do not edit directly, auto-generated from: */ 3 + /* Documentation/netlink/specs/mptcp.yaml */ 4 + /* YNL-GEN kernel source */ 5 + 6 + #include <net/netlink.h> 7 + #include <net/genetlink.h> 8 + 9 + #include "mptcp_pm_gen.h" 10 + 11 + #include <uapi/linux/mptcp_pm.h> 12 + 13 + /* Common nested types */ 14 + const struct nla_policy mptcp_pm_address_nl_policy[MPTCP_PM_ADDR_ATTR_IF_IDX + 1] = { 15 + [MPTCP_PM_ADDR_ATTR_FAMILY] = { .type = NLA_U16, }, 16 + [MPTCP_PM_ADDR_ATTR_ID] = { .type = NLA_U8, }, 17 + [MPTCP_PM_ADDR_ATTR_ADDR4] = { .type = NLA_U32, }, 18 + [MPTCP_PM_ADDR_ATTR_ADDR6] = NLA_POLICY_EXACT_LEN(16), 19 + [MPTCP_PM_ADDR_ATTR_PORT] = { .type = NLA_U16, }, 20 + [MPTCP_PM_ADDR_ATTR_FLAGS] = { .type = NLA_U32, }, 21 + [MPTCP_PM_ADDR_ATTR_IF_IDX] = { .type = NLA_S32, }, 22 + }; 23 + 24 + /* MPTCP_PM_CMD_ADD_ADDR - do */ 25 + const struct nla_policy mptcp_pm_add_addr_nl_policy[MPTCP_PM_ENDPOINT_ADDR + 1] = { 26 + [MPTCP_PM_ENDPOINT_ADDR] = NLA_POLICY_NESTED(mptcp_pm_address_nl_policy), 27 + }; 28 + 29 + /* MPTCP_PM_CMD_DEL_ADDR - do */ 30 + const struct nla_policy mptcp_pm_del_addr_nl_policy[MPTCP_PM_ENDPOINT_ADDR + 1] = { 31 + [MPTCP_PM_ENDPOINT_ADDR] = NLA_POLICY_NESTED(mptcp_pm_address_nl_policy), 32 + }; 33 + 34 + /* MPTCP_PM_CMD_GET_ADDR - do */ 35 + const struct nla_policy mptcp_pm_get_addr_nl_policy[MPTCP_PM_ENDPOINT_ADDR + 1] = { 36 + [MPTCP_PM_ENDPOINT_ADDR] = NLA_POLICY_NESTED(mptcp_pm_address_nl_policy), 37 + }; 38 + 39 + /* MPTCP_PM_CMD_FLUSH_ADDRS - do */ 40 + const struct nla_policy mptcp_pm_flush_addrs_nl_policy[MPTCP_PM_ENDPOINT_ADDR + 1] = { 41 + [MPTCP_PM_ENDPOINT_ADDR] = NLA_POLICY_NESTED(mptcp_pm_address_nl_policy), 42 + }; 43 + 44 + /* MPTCP_PM_CMD_SET_LIMITS - do */ 45 + const struct nla_policy mptcp_pm_set_limits_nl_policy[MPTCP_PM_ATTR_SUBFLOWS + 1] = { 46 + [MPTCP_PM_ATTR_RCV_ADD_ADDRS] = { .type = NLA_U32, }, 47 + [MPTCP_PM_ATTR_SUBFLOWS] = { .type = NLA_U32, }, 48 + }; 49 + 50 + /* MPTCP_PM_CMD_GET_LIMITS - do */ 51 + const struct nla_policy mptcp_pm_get_limits_nl_policy[MPTCP_PM_ATTR_SUBFLOWS + 1] = { 52 + [MPTCP_PM_ATTR_RCV_ADD_ADDRS] = { .type = NLA_U32, }, 53 + [MPTCP_PM_ATTR_SUBFLOWS] = { .type = NLA_U32, }, 54 + }; 55 + 56 + /* MPTCP_PM_CMD_SET_FLAGS - do */ 57 + const struct nla_policy mptcp_pm_set_flags_nl_policy[MPTCP_PM_ATTR_ADDR_REMOTE + 1] = { 58 + [MPTCP_PM_ATTR_ADDR] = NLA_POLICY_NESTED(mptcp_pm_address_nl_policy), 59 + [MPTCP_PM_ATTR_TOKEN] = { .type = NLA_U32, }, 60 + [MPTCP_PM_ATTR_ADDR_REMOTE] = NLA_POLICY_NESTED(mptcp_pm_address_nl_policy), 61 + }; 62 + 63 + /* MPTCP_PM_CMD_ANNOUNCE - do */ 64 + const struct nla_policy mptcp_pm_announce_nl_policy[MPTCP_PM_ATTR_TOKEN + 1] = { 65 + [MPTCP_PM_ATTR_ADDR] = NLA_POLICY_NESTED(mptcp_pm_address_nl_policy), 66 + [MPTCP_PM_ATTR_TOKEN] = { .type = NLA_U32, }, 67 + }; 68 + 69 + /* MPTCP_PM_CMD_REMOVE - do */ 70 + const struct nla_policy mptcp_pm_remove_nl_policy[MPTCP_PM_ATTR_LOC_ID + 1] = { 71 + [MPTCP_PM_ATTR_TOKEN] = { .type = NLA_U32, }, 72 + [MPTCP_PM_ATTR_LOC_ID] = { .type = NLA_U8, }, 73 + }; 74 + 75 + /* MPTCP_PM_CMD_SUBFLOW_CREATE - do */ 76 + const struct nla_policy mptcp_pm_subflow_create_nl_policy[MPTCP_PM_ATTR_ADDR_REMOTE + 1] = { 77 + [MPTCP_PM_ATTR_ADDR] = NLA_POLICY_NESTED(mptcp_pm_address_nl_policy), 78 + [MPTCP_PM_ATTR_TOKEN] = { .type = NLA_U32, }, 79 + [MPTCP_PM_ATTR_ADDR_REMOTE] = NLA_POLICY_NESTED(mptcp_pm_address_nl_policy), 80 + }; 81 + 82 + /* MPTCP_PM_CMD_SUBFLOW_DESTROY - do */ 83 + const struct nla_policy mptcp_pm_subflow_destroy_nl_policy[MPTCP_PM_ATTR_ADDR_REMOTE + 1] = { 84 + [MPTCP_PM_ATTR_ADDR] = NLA_POLICY_NESTED(mptcp_pm_address_nl_policy), 85 + [MPTCP_PM_ATTR_TOKEN] = { .type = NLA_U32, }, 86 + [MPTCP_PM_ATTR_ADDR_REMOTE] = NLA_POLICY_NESTED(mptcp_pm_address_nl_policy), 87 + }; 88 + 89 + /* Ops table for mptcp_pm */ 90 + const struct genl_ops mptcp_pm_nl_ops[11] = { 91 + { 92 + .cmd = MPTCP_PM_CMD_ADD_ADDR, 93 + .validate = GENL_DONT_VALIDATE_STRICT, 94 + .doit = mptcp_pm_nl_add_addr_doit, 95 + .policy = mptcp_pm_add_addr_nl_policy, 96 + .maxattr = MPTCP_PM_ENDPOINT_ADDR, 97 + .flags = GENL_UNS_ADMIN_PERM, 98 + }, 99 + { 100 + .cmd = MPTCP_PM_CMD_DEL_ADDR, 101 + .validate = GENL_DONT_VALIDATE_STRICT, 102 + .doit = mptcp_pm_nl_del_addr_doit, 103 + .policy = mptcp_pm_del_addr_nl_policy, 104 + .maxattr = MPTCP_PM_ENDPOINT_ADDR, 105 + .flags = GENL_UNS_ADMIN_PERM, 106 + }, 107 + { 108 + .cmd = MPTCP_PM_CMD_GET_ADDR, 109 + .validate = GENL_DONT_VALIDATE_STRICT, 110 + .doit = mptcp_pm_nl_get_addr_doit, 111 + .dumpit = mptcp_pm_nl_get_addr_dumpit, 112 + .policy = mptcp_pm_get_addr_nl_policy, 113 + .maxattr = MPTCP_PM_ENDPOINT_ADDR, 114 + .flags = GENL_UNS_ADMIN_PERM, 115 + }, 116 + { 117 + .cmd = MPTCP_PM_CMD_FLUSH_ADDRS, 118 + .validate = GENL_DONT_VALIDATE_STRICT, 119 + .doit = mptcp_pm_nl_flush_addrs_doit, 120 + .policy = mptcp_pm_flush_addrs_nl_policy, 121 + .maxattr = MPTCP_PM_ENDPOINT_ADDR, 122 + .flags = GENL_UNS_ADMIN_PERM, 123 + }, 124 + { 125 + .cmd = MPTCP_PM_CMD_SET_LIMITS, 126 + .validate = GENL_DONT_VALIDATE_STRICT, 127 + .doit = mptcp_pm_nl_set_limits_doit, 128 + .policy = mptcp_pm_set_limits_nl_policy, 129 + .maxattr = MPTCP_PM_ATTR_SUBFLOWS, 130 + .flags = GENL_UNS_ADMIN_PERM, 131 + }, 132 + { 133 + .cmd = MPTCP_PM_CMD_GET_LIMITS, 134 + .validate = GENL_DONT_VALIDATE_STRICT, 135 + .doit = mptcp_pm_nl_get_limits_doit, 136 + .policy = mptcp_pm_get_limits_nl_policy, 137 + .maxattr = MPTCP_PM_ATTR_SUBFLOWS, 138 + }, 139 + { 140 + .cmd = MPTCP_PM_CMD_SET_FLAGS, 141 + .validate = GENL_DONT_VALIDATE_STRICT, 142 + .doit = mptcp_pm_nl_set_flags_doit, 143 + .policy = mptcp_pm_set_flags_nl_policy, 144 + .maxattr = MPTCP_PM_ATTR_ADDR_REMOTE, 145 + .flags = GENL_UNS_ADMIN_PERM, 146 + }, 147 + { 148 + .cmd = MPTCP_PM_CMD_ANNOUNCE, 149 + .validate = GENL_DONT_VALIDATE_STRICT, 150 + .doit = mptcp_pm_nl_announce_doit, 151 + .policy = mptcp_pm_announce_nl_policy, 152 + .maxattr = MPTCP_PM_ATTR_TOKEN, 153 + .flags = GENL_UNS_ADMIN_PERM, 154 + }, 155 + { 156 + .cmd = MPTCP_PM_CMD_REMOVE, 157 + .validate = GENL_DONT_VALIDATE_STRICT, 158 + .doit = mptcp_pm_nl_remove_doit, 159 + .policy = mptcp_pm_remove_nl_policy, 160 + .maxattr = MPTCP_PM_ATTR_LOC_ID, 161 + .flags = GENL_UNS_ADMIN_PERM, 162 + }, 163 + { 164 + .cmd = MPTCP_PM_CMD_SUBFLOW_CREATE, 165 + .validate = GENL_DONT_VALIDATE_STRICT, 166 + .doit = mptcp_pm_nl_subflow_create_doit, 167 + .policy = mptcp_pm_subflow_create_nl_policy, 168 + .maxattr = MPTCP_PM_ATTR_ADDR_REMOTE, 169 + .flags = GENL_UNS_ADMIN_PERM, 170 + }, 171 + { 172 + .cmd = MPTCP_PM_CMD_SUBFLOW_DESTROY, 173 + .validate = GENL_DONT_VALIDATE_STRICT, 174 + .doit = mptcp_pm_nl_subflow_destroy_doit, 175 + .policy = mptcp_pm_subflow_destroy_nl_policy, 176 + .maxattr = MPTCP_PM_ATTR_ADDR_REMOTE, 177 + .flags = GENL_UNS_ADMIN_PERM, 178 + }, 179 + };
+58
net/mptcp/mptcp_pm_gen.h
··· 1 + /* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */ 2 + /* Do not edit directly, auto-generated from: */ 3 + /* Documentation/netlink/specs/mptcp.yaml */ 4 + /* YNL-GEN kernel header */ 5 + 6 + #ifndef _LINUX_MPTCP_PM_GEN_H 7 + #define _LINUX_MPTCP_PM_GEN_H 8 + 9 + #include <net/netlink.h> 10 + #include <net/genetlink.h> 11 + 12 + #include <uapi/linux/mptcp_pm.h> 13 + 14 + /* Common nested types */ 15 + extern const struct nla_policy mptcp_pm_address_nl_policy[MPTCP_PM_ADDR_ATTR_IF_IDX + 1]; 16 + 17 + extern const struct nla_policy mptcp_pm_add_addr_nl_policy[MPTCP_PM_ENDPOINT_ADDR + 1]; 18 + 19 + extern const struct nla_policy mptcp_pm_del_addr_nl_policy[MPTCP_PM_ENDPOINT_ADDR + 1]; 20 + 21 + extern const struct nla_policy mptcp_pm_get_addr_nl_policy[MPTCP_PM_ENDPOINT_ADDR + 1]; 22 + 23 + extern const struct nla_policy mptcp_pm_flush_addrs_nl_policy[MPTCP_PM_ENDPOINT_ADDR + 1]; 24 + 25 + extern const struct nla_policy mptcp_pm_set_limits_nl_policy[MPTCP_PM_ATTR_SUBFLOWS + 1]; 26 + 27 + extern const struct nla_policy mptcp_pm_get_limits_nl_policy[MPTCP_PM_ATTR_SUBFLOWS + 1]; 28 + 29 + extern const struct nla_policy mptcp_pm_set_flags_nl_policy[MPTCP_PM_ATTR_ADDR_REMOTE + 1]; 30 + 31 + extern const struct nla_policy mptcp_pm_announce_nl_policy[MPTCP_PM_ATTR_TOKEN + 1]; 32 + 33 + extern const struct nla_policy mptcp_pm_remove_nl_policy[MPTCP_PM_ATTR_LOC_ID + 1]; 34 + 35 + extern const struct nla_policy mptcp_pm_subflow_create_nl_policy[MPTCP_PM_ATTR_ADDR_REMOTE + 1]; 36 + 37 + extern const struct nla_policy mptcp_pm_subflow_destroy_nl_policy[MPTCP_PM_ATTR_ADDR_REMOTE + 1]; 38 + 39 + /* Ops table for mptcp_pm */ 40 + extern const struct genl_ops mptcp_pm_nl_ops[11]; 41 + 42 + int mptcp_pm_nl_add_addr_doit(struct sk_buff *skb, struct genl_info *info); 43 + int mptcp_pm_nl_del_addr_doit(struct sk_buff *skb, struct genl_info *info); 44 + int mptcp_pm_nl_get_addr_doit(struct sk_buff *skb, struct genl_info *info); 45 + int mptcp_pm_nl_get_addr_dumpit(struct sk_buff *skb, 46 + struct netlink_callback *cb); 47 + int mptcp_pm_nl_flush_addrs_doit(struct sk_buff *skb, struct genl_info *info); 48 + int mptcp_pm_nl_set_limits_doit(struct sk_buff *skb, struct genl_info *info); 49 + int mptcp_pm_nl_get_limits_doit(struct sk_buff *skb, struct genl_info *info); 50 + int mptcp_pm_nl_set_flags_doit(struct sk_buff *skb, struct genl_info *info); 51 + int mptcp_pm_nl_announce_doit(struct sk_buff *skb, struct genl_info *info); 52 + int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info); 53 + int mptcp_pm_nl_subflow_create_doit(struct sk_buff *skb, 54 + struct genl_info *info); 55 + int mptcp_pm_nl_subflow_destroy_doit(struct sk_buff *skb, 56 + struct genl_info *info); 57 + 58 + #endif /* _LINUX_MPTCP_PM_GEN_H */
+15 -99
net/mptcp/pm_netlink.c
··· 1104 1104 }, 1105 1105 }; 1106 1106 1107 - static const struct nla_policy 1108 - mptcp_pm_addr_policy[MPTCP_PM_ADDR_ATTR_MAX + 1] = { 1109 - [MPTCP_PM_ADDR_ATTR_FAMILY] = { .type = NLA_U16, }, 1110 - [MPTCP_PM_ADDR_ATTR_ID] = { .type = NLA_U8, }, 1111 - [MPTCP_PM_ADDR_ATTR_ADDR4] = { .type = NLA_U32, }, 1112 - [MPTCP_PM_ADDR_ATTR_ADDR6] = 1113 - NLA_POLICY_EXACT_LEN(sizeof(struct in6_addr)), 1114 - [MPTCP_PM_ADDR_ATTR_PORT] = { .type = NLA_U16 }, 1115 - [MPTCP_PM_ADDR_ATTR_FLAGS] = { .type = NLA_U32 }, 1116 - [MPTCP_PM_ADDR_ATTR_IF_IDX] = { .type = NLA_S32 }, 1117 - }; 1118 - 1119 - static const struct nla_policy mptcp_pm_policy[MPTCP_PM_ATTR_MAX + 1] = { 1120 - [MPTCP_PM_ATTR_ADDR] = 1121 - NLA_POLICY_NESTED(mptcp_pm_addr_policy), 1122 - [MPTCP_PM_ATTR_RCV_ADD_ADDRS] = { .type = NLA_U32, }, 1123 - [MPTCP_PM_ATTR_SUBFLOWS] = { .type = NLA_U32, }, 1124 - [MPTCP_PM_ATTR_TOKEN] = { .type = NLA_U32, }, 1125 - [MPTCP_PM_ATTR_LOC_ID] = { .type = NLA_U8, }, 1126 - [MPTCP_PM_ATTR_ADDR_REMOTE] = 1127 - NLA_POLICY_NESTED(mptcp_pm_addr_policy), 1128 - }; 1129 - 1130 1107 void mptcp_pm_nl_subflow_chk_stale(const struct mptcp_sock *msk, struct sock *ssk) 1131 1108 { 1132 1109 struct mptcp_subflow_context *iter, *subflow = mptcp_subflow_ctx(ssk); ··· 1165 1188 1166 1189 /* no validation needed - was already done via nested policy */ 1167 1190 err = nla_parse_nested_deprecated(tb, MPTCP_PM_ADDR_ATTR_MAX, attr, 1168 - mptcp_pm_addr_policy, info->extack); 1191 + mptcp_pm_address_nl_policy, info->extack); 1169 1192 if (err) 1170 1193 return err; 1171 1194 ··· 1280 1303 return 0; 1281 1304 } 1282 1305 1283 - static int mptcp_nl_cmd_add_addr(struct sk_buff *skb, struct genl_info *info) 1306 + int mptcp_pm_nl_add_addr_doit(struct sk_buff *skb, struct genl_info *info) 1284 1307 { 1285 - struct nlattr *attr = info->attrs[MPTCP_PM_ATTR_ADDR]; 1308 + struct nlattr *attr = info->attrs[MPTCP_PM_ENDPOINT_ADDR]; 1286 1309 struct pm_nl_pernet *pernet = genl_info_pm_nl(info); 1287 1310 struct mptcp_pm_addr_entry addr, *entry; 1288 1311 int ret; ··· 1461 1484 return 0; 1462 1485 } 1463 1486 1464 - static int mptcp_nl_cmd_del_addr(struct sk_buff *skb, struct genl_info *info) 1487 + int mptcp_pm_nl_del_addr_doit(struct sk_buff *skb, struct genl_info *info) 1465 1488 { 1466 - struct nlattr *attr = info->attrs[MPTCP_PM_ATTR_ADDR]; 1489 + struct nlattr *attr = info->attrs[MPTCP_PM_ENDPOINT_ADDR]; 1467 1490 struct pm_nl_pernet *pernet = genl_info_pm_nl(info); 1468 1491 struct mptcp_pm_addr_entry addr, *entry; 1469 1492 unsigned int addr_max; ··· 1596 1619 pernet->addrs = 0; 1597 1620 } 1598 1621 1599 - static int mptcp_nl_cmd_flush_addrs(struct sk_buff *skb, struct genl_info *info) 1622 + int mptcp_pm_nl_flush_addrs_doit(struct sk_buff *skb, struct genl_info *info) 1600 1623 { 1601 1624 struct pm_nl_pernet *pernet = genl_info_pm_nl(info); 1602 1625 LIST_HEAD(free_list); ··· 1652 1675 return -EMSGSIZE; 1653 1676 } 1654 1677 1655 - static int mptcp_nl_cmd_get_addr(struct sk_buff *skb, struct genl_info *info) 1678 + int mptcp_pm_nl_get_addr_doit(struct sk_buff *skb, struct genl_info *info) 1656 1679 { 1657 - struct nlattr *attr = info->attrs[MPTCP_PM_ATTR_ADDR]; 1680 + struct nlattr *attr = info->attrs[MPTCP_PM_ENDPOINT_ADDR]; 1658 1681 struct pm_nl_pernet *pernet = genl_info_pm_nl(info); 1659 1682 struct mptcp_pm_addr_entry addr, *entry; 1660 1683 struct sk_buff *msg; ··· 1702 1725 return ret; 1703 1726 } 1704 1727 1705 - static int mptcp_nl_cmd_dump_addrs(struct sk_buff *msg, 1706 - struct netlink_callback *cb) 1728 + int mptcp_pm_nl_get_addr_dumpit(struct sk_buff *msg, 1729 + struct netlink_callback *cb) 1707 1730 { 1708 1731 struct net *net = sock_net(msg->sk); 1709 1732 struct mptcp_pm_addr_entry *entry; ··· 1760 1783 return 0; 1761 1784 } 1762 1785 1763 - static int 1764 - mptcp_nl_cmd_set_limits(struct sk_buff *skb, struct genl_info *info) 1786 + int mptcp_pm_nl_set_limits_doit(struct sk_buff *skb, struct genl_info *info) 1765 1787 { 1766 1788 struct pm_nl_pernet *pernet = genl_info_pm_nl(info); 1767 1789 unsigned int rcv_addrs, subflows; ··· 1785 1809 return ret; 1786 1810 } 1787 1811 1788 - static int 1789 - mptcp_nl_cmd_get_limits(struct sk_buff *skb, struct genl_info *info) 1812 + int mptcp_pm_nl_get_limits_doit(struct sk_buff *skb, struct genl_info *info) 1790 1813 { 1791 1814 struct pm_nl_pernet *pernet = genl_info_pm_nl(info); 1792 1815 struct sk_buff *msg; ··· 1894 1919 return 0; 1895 1920 } 1896 1921 1897 - static int mptcp_nl_cmd_set_flags(struct sk_buff *skb, struct genl_info *info) 1922 + int mptcp_pm_nl_set_flags_doit(struct sk_buff *skb, struct genl_info *info) 1898 1923 { 1899 1924 struct mptcp_pm_addr_entry remote = { .addr = { .family = AF_UNSPEC }, }; 1900 1925 struct mptcp_pm_addr_entry addr = { .addr = { .family = AF_UNSPEC }, }; ··· 2258 2283 nlmsg_free(skb); 2259 2284 } 2260 2285 2261 - static const struct genl_small_ops mptcp_pm_ops[] = { 2262 - { 2263 - .cmd = MPTCP_PM_CMD_ADD_ADDR, 2264 - .doit = mptcp_nl_cmd_add_addr, 2265 - .flags = GENL_UNS_ADMIN_PERM, 2266 - }, 2267 - { 2268 - .cmd = MPTCP_PM_CMD_DEL_ADDR, 2269 - .doit = mptcp_nl_cmd_del_addr, 2270 - .flags = GENL_UNS_ADMIN_PERM, 2271 - }, 2272 - { 2273 - .cmd = MPTCP_PM_CMD_FLUSH_ADDRS, 2274 - .doit = mptcp_nl_cmd_flush_addrs, 2275 - .flags = GENL_UNS_ADMIN_PERM, 2276 - }, 2277 - { 2278 - .cmd = MPTCP_PM_CMD_GET_ADDR, 2279 - .doit = mptcp_nl_cmd_get_addr, 2280 - .dumpit = mptcp_nl_cmd_dump_addrs, 2281 - }, 2282 - { 2283 - .cmd = MPTCP_PM_CMD_SET_LIMITS, 2284 - .doit = mptcp_nl_cmd_set_limits, 2285 - .flags = GENL_UNS_ADMIN_PERM, 2286 - }, 2287 - { 2288 - .cmd = MPTCP_PM_CMD_GET_LIMITS, 2289 - .doit = mptcp_nl_cmd_get_limits, 2290 - }, 2291 - { 2292 - .cmd = MPTCP_PM_CMD_SET_FLAGS, 2293 - .doit = mptcp_nl_cmd_set_flags, 2294 - .flags = GENL_UNS_ADMIN_PERM, 2295 - }, 2296 - { 2297 - .cmd = MPTCP_PM_CMD_ANNOUNCE, 2298 - .doit = mptcp_nl_cmd_announce, 2299 - .flags = GENL_UNS_ADMIN_PERM, 2300 - }, 2301 - { 2302 - .cmd = MPTCP_PM_CMD_REMOVE, 2303 - .doit = mptcp_nl_cmd_remove, 2304 - .flags = GENL_UNS_ADMIN_PERM, 2305 - }, 2306 - { 2307 - .cmd = MPTCP_PM_CMD_SUBFLOW_CREATE, 2308 - .doit = mptcp_nl_cmd_sf_create, 2309 - .flags = GENL_UNS_ADMIN_PERM, 2310 - }, 2311 - { 2312 - .cmd = MPTCP_PM_CMD_SUBFLOW_DESTROY, 2313 - .doit = mptcp_nl_cmd_sf_destroy, 2314 - .flags = GENL_UNS_ADMIN_PERM, 2315 - }, 2316 - }; 2317 - 2318 2286 static struct genl_family mptcp_genl_family __ro_after_init = { 2319 2287 .name = MPTCP_PM_NAME, 2320 2288 .version = MPTCP_PM_VER, 2321 - .maxattr = MPTCP_PM_ATTR_MAX, 2322 - .policy = mptcp_pm_policy, 2323 2289 .netnsok = true, 2324 2290 .module = THIS_MODULE, 2325 - .small_ops = mptcp_pm_ops, 2326 - .n_small_ops = ARRAY_SIZE(mptcp_pm_ops), 2291 + .ops = mptcp_pm_nl_ops, 2292 + .n_ops = ARRAY_SIZE(mptcp_pm_nl_ops), 2327 2293 .resv_start_op = MPTCP_PM_CMD_SUBFLOW_DESTROY + 1, 2328 2294 .mcgrps = mptcp_pm_mcgrps, 2329 2295 .n_mcgrps = ARRAY_SIZE(mptcp_pm_mcgrps),
+4 -4
net/mptcp/pm_userspace.c
··· 145 145 return mptcp_userspace_pm_append_new_local_addr(msk, &new_entry); 146 146 } 147 147 148 - int mptcp_nl_cmd_announce(struct sk_buff *skb, struct genl_info *info) 148 + int mptcp_pm_nl_announce_doit(struct sk_buff *skb, struct genl_info *info) 149 149 { 150 150 struct nlattr *token = info->attrs[MPTCP_PM_ATTR_TOKEN]; 151 151 struct nlattr *addr = info->attrs[MPTCP_PM_ATTR_ADDR]; ··· 208 208 return err; 209 209 } 210 210 211 - int mptcp_nl_cmd_remove(struct sk_buff *skb, struct genl_info *info) 211 + int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info) 212 212 { 213 213 struct nlattr *token = info->attrs[MPTCP_PM_ATTR_TOKEN]; 214 214 struct nlattr *id = info->attrs[MPTCP_PM_ATTR_LOC_ID]; ··· 270 270 return err; 271 271 } 272 272 273 - int mptcp_nl_cmd_sf_create(struct sk_buff *skb, struct genl_info *info) 273 + int mptcp_pm_nl_subflow_create_doit(struct sk_buff *skb, struct genl_info *info) 274 274 { 275 275 struct nlattr *raddr = info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE]; 276 276 struct nlattr *token = info->attrs[MPTCP_PM_ATTR_TOKEN]; ··· 394 394 return NULL; 395 395 } 396 396 397 - int mptcp_nl_cmd_sf_destroy(struct sk_buff *skb, struct genl_info *info) 397 + int mptcp_pm_nl_subflow_destroy_doit(struct sk_buff *skb, struct genl_info *info) 398 398 { 399 399 struct nlattr *raddr = info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE]; 400 400 struct nlattr *token = info->attrs[MPTCP_PM_ATTR_TOKEN];
+2 -4
net/mptcp/protocol.h
··· 13 13 #include <uapi/linux/mptcp.h> 14 14 #include <net/genetlink.h> 15 15 16 + #include "mptcp_pm_gen.h" 17 + 16 18 #define MPTCP_SUPPORTED_VERSION 1 17 19 18 20 /* MPTCP option bits */ ··· 879 877 struct list_head *rm_list); 880 878 881 879 void mptcp_free_local_addr_list(struct mptcp_sock *msk); 882 - int mptcp_nl_cmd_announce(struct sk_buff *skb, struct genl_info *info); 883 - int mptcp_nl_cmd_remove(struct sk_buff *skb, struct genl_info *info); 884 - int mptcp_nl_cmd_sf_create(struct sk_buff *skb, struct genl_info *info); 885 - int mptcp_nl_cmd_sf_destroy(struct sk_buff *skb, struct genl_info *info); 886 880 887 881 void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk, 888 882 const struct sock *ssk, gfp_t gfp);
+17 -11
tools/net/ynl/ynl-gen-c.py
··· 410 410 return f'.type = YNL_PT_NUL_STR, ' 411 411 412 412 def _attr_policy(self, policy): 413 - mem = '{ .type = ' + policy 414 - if 'max-len' in self.checks: 415 - mem += ', .len = ' + str(self.get_limit('max-len')) 416 - mem += ', }' 413 + if 'exact-len' in self.checks: 414 + mem = 'NLA_POLICY_EXACT_LEN(' + str(self.checks['exact-len']) + ')' 415 + else: 416 + mem = '{ .type = ' + policy 417 + if 'max-len' in self.checks: 418 + mem += ', .len = ' + str(self.get_limit('max-len')) 419 + mem += ', }' 417 420 return mem 418 421 419 422 def attr_policy(self, cw): ··· 462 459 return f'.type = YNL_PT_BINARY,' 463 460 464 461 def _attr_policy(self, policy): 465 - mem = '{ ' 466 - if len(self.checks) == 1 and 'min-len' in self.checks: 467 - mem += '.len = ' + str(self.get_limit('min-len')) 468 - elif len(self.checks) == 0: 469 - mem += '.type = NLA_BINARY' 462 + if 'exact-len' in self.checks: 463 + mem = 'NLA_POLICY_EXACT_LEN(' + str(self.checks['exact-len']) + ')' 470 464 else: 471 - raise Exception('One or more of binary type checks not implemented, yet') 472 - mem += ', }' 465 + mem = '{ ' 466 + if len(self.checks) == 1 and 'min-len' in self.checks: 467 + mem += '.len = ' + str(self.get_limit('min-len')) 468 + elif len(self.checks) == 0: 469 + mem += '.type = NLA_BINARY' 470 + else: 471 + raise Exception('One or more of binary type checks not implemented, yet') 472 + mem += ', }' 473 473 return mem 474 474 475 475 def attr_put(self, ri, var):