| .. | .. |
|---|
| 28 | 28 | #include <net/protocol.h> |
|---|
| 29 | 29 | #include <net/netevent.h> |
|---|
| 30 | 30 | |
|---|
| 31 | | -static int zero; |
|---|
| 32 | | -static int one = 1; |
|---|
| 33 | 31 | static int two = 2; |
|---|
| 34 | 32 | static int four = 4; |
|---|
| 35 | 33 | static int thousand = 1000; |
|---|
| 36 | | -static int gso_max_segs = GSO_MAX_SEGS; |
|---|
| 37 | 34 | static int tcp_retr1_max = 255; |
|---|
| 38 | 35 | static int ip_local_port_range_min[] = { 1, 1 }; |
|---|
| 39 | 36 | static int ip_local_port_range_max[] = { 65535, 65535 }; |
|---|
| .. | .. |
|---|
| 73 | 70 | |
|---|
| 74 | 71 | /* Validate changes from /proc interface. */ |
|---|
| 75 | 72 | static int ipv4_local_port_range(struct ctl_table *table, int write, |
|---|
| 76 | | - void __user *buffer, |
|---|
| 77 | | - size_t *lenp, loff_t *ppos) |
|---|
| 73 | + void *buffer, size_t *lenp, loff_t *ppos) |
|---|
| 78 | 74 | { |
|---|
| 79 | 75 | struct net *net = |
|---|
| 80 | 76 | container_of(table->data, struct net, ipv4.ip_local_ports.range); |
|---|
| .. | .. |
|---|
| 98 | 94 | * port limit. |
|---|
| 99 | 95 | */ |
|---|
| 100 | 96 | if ((range[1] < range[0]) || |
|---|
| 101 | | - (range[0] < net->ipv4.sysctl_ip_prot_sock)) |
|---|
| 97 | + (range[0] < READ_ONCE(net->ipv4.sysctl_ip_prot_sock))) |
|---|
| 102 | 98 | ret = -EINVAL; |
|---|
| 103 | 99 | else |
|---|
| 104 | 100 | set_local_port_range(net, range); |
|---|
| .. | .. |
|---|
| 109 | 105 | |
|---|
| 110 | 106 | /* Validate changes from /proc interface. */ |
|---|
| 111 | 107 | static int ipv4_privileged_ports(struct ctl_table *table, int write, |
|---|
| 112 | | - void __user *buffer, size_t *lenp, loff_t *ppos) |
|---|
| 108 | + void *buffer, size_t *lenp, loff_t *ppos) |
|---|
| 113 | 109 | { |
|---|
| 114 | 110 | struct net *net = container_of(table->data, struct net, |
|---|
| 115 | 111 | ipv4.sysctl_ip_prot_sock); |
|---|
| .. | .. |
|---|
| 124 | 120 | .extra2 = &ip_privileged_port_max, |
|---|
| 125 | 121 | }; |
|---|
| 126 | 122 | |
|---|
| 127 | | - pports = net->ipv4.sysctl_ip_prot_sock; |
|---|
| 123 | + pports = READ_ONCE(net->ipv4.sysctl_ip_prot_sock); |
|---|
| 128 | 124 | |
|---|
| 129 | 125 | ret = proc_dointvec_minmax(&tmp, write, buffer, lenp, ppos); |
|---|
| 130 | 126 | |
|---|
| .. | .. |
|---|
| 136 | 132 | if (range[0] < pports) |
|---|
| 137 | 133 | ret = -EINVAL; |
|---|
| 138 | 134 | else |
|---|
| 139 | | - net->ipv4.sysctl_ip_prot_sock = pports; |
|---|
| 135 | + WRITE_ONCE(net->ipv4.sysctl_ip_prot_sock, pports); |
|---|
| 140 | 136 | } |
|---|
| 141 | 137 | |
|---|
| 142 | 138 | return ret; |
|---|
| .. | .. |
|---|
| 170 | 166 | |
|---|
| 171 | 167 | /* Validate changes from /proc interface. */ |
|---|
| 172 | 168 | static int ipv4_ping_group_range(struct ctl_table *table, int write, |
|---|
| 173 | | - void __user *buffer, |
|---|
| 174 | | - size_t *lenp, loff_t *ppos) |
|---|
| 169 | + void *buffer, size_t *lenp, loff_t *ppos) |
|---|
| 175 | 170 | { |
|---|
| 176 | 171 | struct user_namespace *user_ns = current_user_ns(); |
|---|
| 177 | 172 | int ret; |
|---|
| .. | .. |
|---|
| 206 | 201 | } |
|---|
| 207 | 202 | |
|---|
| 208 | 203 | static int ipv4_fwd_update_priority(struct ctl_table *table, int write, |
|---|
| 209 | | - void __user *buffer, |
|---|
| 210 | | - size_t *lenp, loff_t *ppos) |
|---|
| 204 | + void *buffer, size_t *lenp, loff_t *ppos) |
|---|
| 211 | 205 | { |
|---|
| 212 | 206 | struct net *net; |
|---|
| 213 | 207 | int ret; |
|---|
| .. | .. |
|---|
| 223 | 217 | } |
|---|
| 224 | 218 | |
|---|
| 225 | 219 | static int proc_tcp_congestion_control(struct ctl_table *ctl, int write, |
|---|
| 226 | | - void __user *buffer, size_t *lenp, loff_t *ppos) |
|---|
| 220 | + void *buffer, size_t *lenp, loff_t *ppos) |
|---|
| 227 | 221 | { |
|---|
| 228 | 222 | struct net *net = container_of(ctl->data, struct net, |
|---|
| 229 | 223 | ipv4.tcp_congestion_control); |
|---|
| .. | .. |
|---|
| 243 | 237 | } |
|---|
| 244 | 238 | |
|---|
| 245 | 239 | static int proc_tcp_available_congestion_control(struct ctl_table *ctl, |
|---|
| 246 | | - int write, |
|---|
| 247 | | - void __user *buffer, size_t *lenp, |
|---|
| 248 | | - loff_t *ppos) |
|---|
| 240 | + int write, void *buffer, |
|---|
| 241 | + size_t *lenp, loff_t *ppos) |
|---|
| 249 | 242 | { |
|---|
| 250 | 243 | struct ctl_table tbl = { .maxlen = TCP_CA_BUF_MAX, }; |
|---|
| 251 | 244 | int ret; |
|---|
| .. | .. |
|---|
| 260 | 253 | } |
|---|
| 261 | 254 | |
|---|
| 262 | 255 | static int proc_allowed_congestion_control(struct ctl_table *ctl, |
|---|
| 263 | | - int write, |
|---|
| 264 | | - void __user *buffer, size_t *lenp, |
|---|
| 265 | | - loff_t *ppos) |
|---|
| 256 | + int write, void *buffer, |
|---|
| 257 | + size_t *lenp, loff_t *ppos) |
|---|
| 266 | 258 | { |
|---|
| 267 | 259 | struct ctl_table tbl = { .maxlen = TCP_CA_BUF_MAX }; |
|---|
| 268 | 260 | int ret; |
|---|
| .. | .. |
|---|
| 279 | 271 | return ret; |
|---|
| 280 | 272 | } |
|---|
| 281 | 273 | |
|---|
| 274 | +static int sscanf_key(char *buf, __le32 *key) |
|---|
| 275 | +{ |
|---|
| 276 | + u32 user_key[4]; |
|---|
| 277 | + int i, ret = 0; |
|---|
| 278 | + |
|---|
| 279 | + if (sscanf(buf, "%x-%x-%x-%x", user_key, user_key + 1, |
|---|
| 280 | + user_key + 2, user_key + 3) != 4) { |
|---|
| 281 | + ret = -EINVAL; |
|---|
| 282 | + } else { |
|---|
| 283 | + for (i = 0; i < ARRAY_SIZE(user_key); i++) |
|---|
| 284 | + key[i] = cpu_to_le32(user_key[i]); |
|---|
| 285 | + } |
|---|
| 286 | + pr_debug("proc TFO key set 0x%x-%x-%x-%x <- 0x%s: %u\n", |
|---|
| 287 | + user_key[0], user_key[1], user_key[2], user_key[3], buf, ret); |
|---|
| 288 | + |
|---|
| 289 | + return ret; |
|---|
| 290 | +} |
|---|
| 291 | + |
|---|
| 282 | 292 | static int proc_tcp_fastopen_key(struct ctl_table *table, int write, |
|---|
| 283 | | - void __user *buffer, size_t *lenp, |
|---|
| 284 | | - loff_t *ppos) |
|---|
| 293 | + void *buffer, size_t *lenp, loff_t *ppos) |
|---|
| 285 | 294 | { |
|---|
| 286 | 295 | struct net *net = container_of(table->data, struct net, |
|---|
| 287 | 296 | ipv4.sysctl_tcp_fastopen); |
|---|
| 288 | | - struct ctl_table tbl = { .maxlen = (TCP_FASTOPEN_KEY_LENGTH * 2 + 10) }; |
|---|
| 289 | | - struct tcp_fastopen_context *ctxt; |
|---|
| 290 | | - u32 user_key[4]; /* 16 bytes, matching TCP_FASTOPEN_KEY_LENGTH */ |
|---|
| 291 | | - __le32 key[4]; |
|---|
| 292 | | - int ret, i; |
|---|
| 297 | + /* maxlen to print the list of keys in hex (*2), with dashes |
|---|
| 298 | + * separating doublewords and a comma in between keys. |
|---|
| 299 | + */ |
|---|
| 300 | + struct ctl_table tbl = { .maxlen = ((TCP_FASTOPEN_KEY_LENGTH * |
|---|
| 301 | + 2 * TCP_FASTOPEN_KEY_MAX) + |
|---|
| 302 | + (TCP_FASTOPEN_KEY_MAX * 5)) }; |
|---|
| 303 | + u32 user_key[TCP_FASTOPEN_KEY_BUF_LENGTH / sizeof(u32)]; |
|---|
| 304 | + __le32 key[TCP_FASTOPEN_KEY_BUF_LENGTH / sizeof(__le32)]; |
|---|
| 305 | + char *backup_data; |
|---|
| 306 | + int ret, i = 0, off = 0, n_keys; |
|---|
| 293 | 307 | |
|---|
| 294 | 308 | tbl.data = kmalloc(tbl.maxlen, GFP_KERNEL); |
|---|
| 295 | 309 | if (!tbl.data) |
|---|
| 296 | 310 | return -ENOMEM; |
|---|
| 297 | 311 | |
|---|
| 298 | | - rcu_read_lock(); |
|---|
| 299 | | - ctxt = rcu_dereference(net->ipv4.tcp_fastopen_ctx); |
|---|
| 300 | | - if (ctxt) |
|---|
| 301 | | - memcpy(key, ctxt->key, TCP_FASTOPEN_KEY_LENGTH); |
|---|
| 302 | | - else |
|---|
| 303 | | - memset(key, 0, sizeof(key)); |
|---|
| 304 | | - rcu_read_unlock(); |
|---|
| 312 | + n_keys = tcp_fastopen_get_cipher(net, NULL, (u64 *)key); |
|---|
| 313 | + if (!n_keys) { |
|---|
| 314 | + memset(&key[0], 0, TCP_FASTOPEN_KEY_LENGTH); |
|---|
| 315 | + n_keys = 1; |
|---|
| 316 | + } |
|---|
| 305 | 317 | |
|---|
| 306 | | - for (i = 0; i < ARRAY_SIZE(key); i++) |
|---|
| 318 | + for (i = 0; i < n_keys * 4; i++) |
|---|
| 307 | 319 | user_key[i] = le32_to_cpu(key[i]); |
|---|
| 308 | 320 | |
|---|
| 309 | | - snprintf(tbl.data, tbl.maxlen, "%08x-%08x-%08x-%08x", |
|---|
| 310 | | - user_key[0], user_key[1], user_key[2], user_key[3]); |
|---|
| 321 | + for (i = 0; i < n_keys; i++) { |
|---|
| 322 | + off += snprintf(tbl.data + off, tbl.maxlen - off, |
|---|
| 323 | + "%08x-%08x-%08x-%08x", |
|---|
| 324 | + user_key[i * 4], |
|---|
| 325 | + user_key[i * 4 + 1], |
|---|
| 326 | + user_key[i * 4 + 2], |
|---|
| 327 | + user_key[i * 4 + 3]); |
|---|
| 328 | + |
|---|
| 329 | + if (WARN_ON_ONCE(off >= tbl.maxlen - 1)) |
|---|
| 330 | + break; |
|---|
| 331 | + |
|---|
| 332 | + if (i + 1 < n_keys) |
|---|
| 333 | + off += snprintf(tbl.data + off, tbl.maxlen - off, ","); |
|---|
| 334 | + } |
|---|
| 335 | + |
|---|
| 311 | 336 | ret = proc_dostring(&tbl, write, buffer, lenp, ppos); |
|---|
| 312 | 337 | |
|---|
| 313 | 338 | if (write && ret == 0) { |
|---|
| 314 | | - if (sscanf(tbl.data, "%x-%x-%x-%x", user_key, user_key + 1, |
|---|
| 315 | | - user_key + 2, user_key + 3) != 4) { |
|---|
| 339 | + backup_data = strchr(tbl.data, ','); |
|---|
| 340 | + if (backup_data) { |
|---|
| 341 | + *backup_data = '\0'; |
|---|
| 342 | + backup_data++; |
|---|
| 343 | + } |
|---|
| 344 | + if (sscanf_key(tbl.data, key)) { |
|---|
| 316 | 345 | ret = -EINVAL; |
|---|
| 317 | 346 | goto bad_key; |
|---|
| 318 | 347 | } |
|---|
| 319 | | - |
|---|
| 320 | | - for (i = 0; i < ARRAY_SIZE(user_key); i++) |
|---|
| 321 | | - key[i] = cpu_to_le32(user_key[i]); |
|---|
| 322 | | - |
|---|
| 348 | + if (backup_data) { |
|---|
| 349 | + if (sscanf_key(backup_data, key + 4)) { |
|---|
| 350 | + ret = -EINVAL; |
|---|
| 351 | + goto bad_key; |
|---|
| 352 | + } |
|---|
| 353 | + } |
|---|
| 323 | 354 | tcp_fastopen_reset_cipher(net, NULL, key, |
|---|
| 324 | | - TCP_FASTOPEN_KEY_LENGTH); |
|---|
| 355 | + backup_data ? key + 4 : NULL); |
|---|
| 325 | 356 | } |
|---|
| 326 | 357 | |
|---|
| 327 | 358 | bad_key: |
|---|
| 328 | | - pr_debug("proc FO key set 0x%x-%x-%x-%x <- 0x%s: %u\n", |
|---|
| 329 | | - user_key[0], user_key[1], user_key[2], user_key[3], |
|---|
| 330 | | - (char *)tbl.data, ret); |
|---|
| 331 | 359 | kfree(tbl.data); |
|---|
| 332 | 360 | return ret; |
|---|
| 333 | 361 | } |
|---|
| 334 | 362 | |
|---|
| 335 | | -static void proc_configure_early_demux(int enabled, int protocol) |
|---|
| 336 | | -{ |
|---|
| 337 | | - struct net_protocol *ipprot; |
|---|
| 338 | | -#if IS_ENABLED(CONFIG_IPV6) |
|---|
| 339 | | - struct inet6_protocol *ip6prot; |
|---|
| 340 | | -#endif |
|---|
| 341 | | - |
|---|
| 342 | | - rcu_read_lock(); |
|---|
| 343 | | - |
|---|
| 344 | | - ipprot = rcu_dereference(inet_protos[protocol]); |
|---|
| 345 | | - if (ipprot) |
|---|
| 346 | | - ipprot->early_demux = enabled ? ipprot->early_demux_handler : |
|---|
| 347 | | - NULL; |
|---|
| 348 | | - |
|---|
| 349 | | -#if IS_ENABLED(CONFIG_IPV6) |
|---|
| 350 | | - ip6prot = rcu_dereference(inet6_protos[protocol]); |
|---|
| 351 | | - if (ip6prot) |
|---|
| 352 | | - ip6prot->early_demux = enabled ? ip6prot->early_demux_handler : |
|---|
| 353 | | - NULL; |
|---|
| 354 | | -#endif |
|---|
| 355 | | - rcu_read_unlock(); |
|---|
| 356 | | -} |
|---|
| 357 | | - |
|---|
| 358 | | -static int proc_tcp_early_demux(struct ctl_table *table, int write, |
|---|
| 359 | | - void __user *buffer, size_t *lenp, loff_t *ppos) |
|---|
| 360 | | -{ |
|---|
| 361 | | - int ret = 0; |
|---|
| 362 | | - |
|---|
| 363 | | - ret = proc_dointvec(table, write, buffer, lenp, ppos); |
|---|
| 364 | | - |
|---|
| 365 | | - if (write && !ret) { |
|---|
| 366 | | - int enabled = init_net.ipv4.sysctl_tcp_early_demux; |
|---|
| 367 | | - |
|---|
| 368 | | - proc_configure_early_demux(enabled, IPPROTO_TCP); |
|---|
| 369 | | - } |
|---|
| 370 | | - |
|---|
| 371 | | - return ret; |
|---|
| 372 | | -} |
|---|
| 373 | | - |
|---|
| 374 | | -static int proc_udp_early_demux(struct ctl_table *table, int write, |
|---|
| 375 | | - void __user *buffer, size_t *lenp, loff_t *ppos) |
|---|
| 376 | | -{ |
|---|
| 377 | | - int ret = 0; |
|---|
| 378 | | - |
|---|
| 379 | | - ret = proc_dointvec(table, write, buffer, lenp, ppos); |
|---|
| 380 | | - |
|---|
| 381 | | - if (write && !ret) { |
|---|
| 382 | | - int enabled = init_net.ipv4.sysctl_udp_early_demux; |
|---|
| 383 | | - |
|---|
| 384 | | - proc_configure_early_demux(enabled, IPPROTO_UDP); |
|---|
| 385 | | - } |
|---|
| 386 | | - |
|---|
| 387 | | - return ret; |
|---|
| 388 | | -} |
|---|
| 389 | | - |
|---|
| 390 | 363 | static int proc_tfo_blackhole_detect_timeout(struct ctl_table *table, |
|---|
| 391 | | - int write, |
|---|
| 392 | | - void __user *buffer, |
|---|
| 364 | + int write, void *buffer, |
|---|
| 393 | 365 | size_t *lenp, loff_t *ppos) |
|---|
| 394 | 366 | { |
|---|
| 395 | 367 | struct net *net = container_of(table->data, struct net, |
|---|
| .. | .. |
|---|
| 404 | 376 | } |
|---|
| 405 | 377 | |
|---|
| 406 | 378 | static int proc_tcp_available_ulp(struct ctl_table *ctl, |
|---|
| 407 | | - int write, |
|---|
| 408 | | - void __user *buffer, size_t *lenp, |
|---|
| 379 | + int write, void *buffer, size_t *lenp, |
|---|
| 409 | 380 | loff_t *ppos) |
|---|
| 410 | 381 | { |
|---|
| 411 | 382 | struct ctl_table tbl = { .maxlen = TCP_ULP_BUF_MAX, }; |
|---|
| .. | .. |
|---|
| 423 | 394 | |
|---|
| 424 | 395 | #ifdef CONFIG_IP_ROUTE_MULTIPATH |
|---|
| 425 | 396 | static int proc_fib_multipath_hash_policy(struct ctl_table *table, int write, |
|---|
| 426 | | - void __user *buffer, size_t *lenp, |
|---|
| 397 | + void *buffer, size_t *lenp, |
|---|
| 427 | 398 | loff_t *ppos) |
|---|
| 428 | 399 | { |
|---|
| 429 | 400 | struct net *net = container_of(table->data, struct net, |
|---|
| .. | .. |
|---|
| 512 | 483 | }, |
|---|
| 513 | 484 | #endif /* CONFIG_NETLABEL */ |
|---|
| 514 | 485 | { |
|---|
| 515 | | - .procname = "tcp_available_congestion_control", |
|---|
| 516 | | - .maxlen = TCP_CA_BUF_MAX, |
|---|
| 517 | | - .mode = 0444, |
|---|
| 518 | | - .proc_handler = proc_tcp_available_congestion_control, |
|---|
| 519 | | - }, |
|---|
| 520 | | - { |
|---|
| 521 | | - .procname = "tcp_allowed_congestion_control", |
|---|
| 522 | | - .maxlen = TCP_CA_BUF_MAX, |
|---|
| 523 | | - .mode = 0644, |
|---|
| 524 | | - .proc_handler = proc_allowed_congestion_control, |
|---|
| 525 | | - }, |
|---|
| 526 | | - { |
|---|
| 527 | 486 | .procname = "tcp_available_ulp", |
|---|
| 528 | 487 | .maxlen = TCP_ULP_BUF_MAX, |
|---|
| 529 | 488 | .mode = 0444, |
|---|
| .. | .. |
|---|
| 535 | 494 | .maxlen = sizeof(int), |
|---|
| 536 | 495 | .mode = 0644, |
|---|
| 537 | 496 | .proc_handler = proc_dointvec_minmax, |
|---|
| 538 | | - .extra1 = &zero, |
|---|
| 497 | + .extra1 = SYSCTL_ZERO, |
|---|
| 539 | 498 | }, |
|---|
| 540 | 499 | { |
|---|
| 541 | 500 | .procname = "icmp_msgs_burst", |
|---|
| .. | .. |
|---|
| 543 | 502 | .maxlen = sizeof(int), |
|---|
| 544 | 503 | .mode = 0644, |
|---|
| 545 | 504 | .proc_handler = proc_dointvec_minmax, |
|---|
| 546 | | - .extra1 = &zero, |
|---|
| 505 | + .extra1 = SYSCTL_ZERO, |
|---|
| 547 | 506 | }, |
|---|
| 548 | 507 | { |
|---|
| 549 | 508 | .procname = "udp_mem", |
|---|
| .. | .. |
|---|
| 551 | 510 | .maxlen = sizeof(sysctl_udp_mem), |
|---|
| 552 | 511 | .mode = 0644, |
|---|
| 553 | 512 | .proc_handler = proc_doulongvec_minmax, |
|---|
| 513 | + }, |
|---|
| 514 | + { |
|---|
| 515 | + .procname = "fib_sync_mem", |
|---|
| 516 | + .data = &sysctl_fib_sync_mem, |
|---|
| 517 | + .maxlen = sizeof(sysctl_fib_sync_mem), |
|---|
| 518 | + .mode = 0644, |
|---|
| 519 | + .proc_handler = proc_douintvec_minmax, |
|---|
| 520 | + .extra1 = &sysctl_fib_sync_mem_min, |
|---|
| 521 | + .extra2 = &sysctl_fib_sync_mem_max, |
|---|
| 522 | + }, |
|---|
| 523 | + { |
|---|
| 524 | + .procname = "tcp_rx_skb_cache", |
|---|
| 525 | + .data = &tcp_rx_skb_cache_key.key, |
|---|
| 526 | + .mode = 0644, |
|---|
| 527 | + .proc_handler = proc_do_static_key, |
|---|
| 528 | + }, |
|---|
| 529 | + { |
|---|
| 530 | + .procname = "tcp_tx_skb_cache", |
|---|
| 531 | + .data = &tcp_tx_skb_cache_key.key, |
|---|
| 532 | + .mode = 0644, |
|---|
| 533 | + .proc_handler = proc_do_static_key, |
|---|
| 554 | 534 | }, |
|---|
| 555 | 535 | { } |
|---|
| 556 | 536 | }; |
|---|
| .. | .. |
|---|
| 605 | 585 | .mode = 0644, |
|---|
| 606 | 586 | .proc_handler = ipv4_ping_group_range, |
|---|
| 607 | 587 | }, |
|---|
| 588 | +#ifdef CONFIG_NET_L3_MASTER_DEV |
|---|
| 589 | + { |
|---|
| 590 | + .procname = "raw_l3mdev_accept", |
|---|
| 591 | + .data = &init_net.ipv4.sysctl_raw_l3mdev_accept, |
|---|
| 592 | + .maxlen = sizeof(int), |
|---|
| 593 | + .mode = 0644, |
|---|
| 594 | + .proc_handler = proc_dointvec_minmax, |
|---|
| 595 | + .extra1 = SYSCTL_ZERO, |
|---|
| 596 | + .extra2 = SYSCTL_ONE, |
|---|
| 597 | + }, |
|---|
| 598 | +#endif |
|---|
| 608 | 599 | { |
|---|
| 609 | 600 | .procname = "tcp_ecn", |
|---|
| 610 | 601 | .data = &init_net.ipv4.sysctl_tcp_ecn, |
|---|
| .. | .. |
|---|
| 638 | 629 | .data = &init_net.ipv4.sysctl_udp_early_demux, |
|---|
| 639 | 630 | .maxlen = sizeof(int), |
|---|
| 640 | 631 | .mode = 0644, |
|---|
| 641 | | - .proc_handler = proc_udp_early_demux |
|---|
| 632 | + .proc_handler = proc_douintvec_minmax, |
|---|
| 642 | 633 | }, |
|---|
| 643 | 634 | { |
|---|
| 644 | 635 | .procname = "tcp_early_demux", |
|---|
| 645 | 636 | .data = &init_net.ipv4.sysctl_tcp_early_demux, |
|---|
| 646 | 637 | .maxlen = sizeof(int), |
|---|
| 647 | 638 | .mode = 0644, |
|---|
| 648 | | - .proc_handler = proc_tcp_early_demux |
|---|
| 639 | + .proc_handler = proc_douintvec_minmax, |
|---|
| 640 | + }, |
|---|
| 641 | + { |
|---|
| 642 | + .procname = "nexthop_compat_mode", |
|---|
| 643 | + .data = &init_net.ipv4.sysctl_nexthop_compat_mode, |
|---|
| 644 | + .maxlen = sizeof(int), |
|---|
| 645 | + .mode = 0644, |
|---|
| 646 | + .proc_handler = proc_dointvec_minmax, |
|---|
| 647 | + .extra1 = SYSCTL_ZERO, |
|---|
| 648 | + .extra2 = SYSCTL_ONE, |
|---|
| 649 | 649 | }, |
|---|
| 650 | 650 | { |
|---|
| 651 | 651 | .procname = "ip_default_ttl", |
|---|
| .. | .. |
|---|
| 671 | 671 | .proc_handler = proc_do_large_bitmap, |
|---|
| 672 | 672 | }, |
|---|
| 673 | 673 | { |
|---|
| 674 | + .procname = "ip_local_unbindable_ports", |
|---|
| 675 | + .data = &init_net.ipv4.sysctl_local_unbindable_ports, |
|---|
| 676 | + .maxlen = 65536, |
|---|
| 677 | + .mode = 0644, |
|---|
| 678 | + .proc_handler = proc_do_large_bitmap, |
|---|
| 679 | + }, |
|---|
| 680 | + { |
|---|
| 674 | 681 | .procname = "ip_no_pmtu_disc", |
|---|
| 675 | 682 | .data = &init_net.ipv4.sysctl_ip_no_pmtu_disc, |
|---|
| 676 | 683 | .maxlen = sizeof(int), |
|---|
| .. | .. |
|---|
| 690 | 697 | .maxlen = sizeof(int), |
|---|
| 691 | 698 | .mode = 0644, |
|---|
| 692 | 699 | .proc_handler = ipv4_fwd_update_priority, |
|---|
| 693 | | - .extra1 = &zero, |
|---|
| 694 | | - .extra2 = &one, |
|---|
| 700 | + .extra1 = SYSCTL_ZERO, |
|---|
| 701 | + .extra2 = SYSCTL_ONE, |
|---|
| 695 | 702 | }, |
|---|
| 696 | 703 | { |
|---|
| 697 | 704 | .procname = "ip_nonlocal_bind", |
|---|
| .. | .. |
|---|
| 699 | 706 | .maxlen = sizeof(int), |
|---|
| 700 | 707 | .mode = 0644, |
|---|
| 701 | 708 | .proc_handler = proc_dointvec |
|---|
| 709 | + }, |
|---|
| 710 | + { |
|---|
| 711 | + .procname = "ip_autobind_reuse", |
|---|
| 712 | + .data = &init_net.ipv4.sysctl_ip_autobind_reuse, |
|---|
| 713 | + .maxlen = sizeof(int), |
|---|
| 714 | + .mode = 0644, |
|---|
| 715 | + .proc_handler = proc_dointvec_minmax, |
|---|
| 716 | + .extra1 = SYSCTL_ZERO, |
|---|
| 717 | + .extra2 = SYSCTL_ONE, |
|---|
| 702 | 718 | }, |
|---|
| 703 | 719 | { |
|---|
| 704 | 720 | .procname = "fwmark_reflect", |
|---|
| .. | .. |
|---|
| 721 | 737 | .maxlen = sizeof(int), |
|---|
| 722 | 738 | .mode = 0644, |
|---|
| 723 | 739 | .proc_handler = proc_dointvec_minmax, |
|---|
| 724 | | - .extra1 = &zero, |
|---|
| 725 | | - .extra2 = &one, |
|---|
| 740 | + .extra1 = SYSCTL_ZERO, |
|---|
| 741 | + .extra2 = SYSCTL_ONE, |
|---|
| 726 | 742 | }, |
|---|
| 727 | 743 | #endif |
|---|
| 728 | 744 | { |
|---|
| .. | .. |
|---|
| 742 | 758 | { |
|---|
| 743 | 759 | .procname = "tcp_min_snd_mss", |
|---|
| 744 | 760 | .data = &init_net.ipv4.sysctl_tcp_min_snd_mss, |
|---|
| 761 | + .maxlen = sizeof(int), |
|---|
| 762 | + .mode = 0644, |
|---|
| 763 | + .proc_handler = proc_dointvec_minmax, |
|---|
| 764 | + .extra1 = &tcp_min_snd_mss_min, |
|---|
| 765 | + .extra2 = &tcp_min_snd_mss_max, |
|---|
| 766 | + }, |
|---|
| 767 | + { |
|---|
| 768 | + .procname = "tcp_mtu_probe_floor", |
|---|
| 769 | + .data = &init_net.ipv4.sysctl_tcp_mtu_probe_floor, |
|---|
| 745 | 770 | .maxlen = sizeof(int), |
|---|
| 746 | 771 | .mode = 0644, |
|---|
| 747 | 772 | .proc_handler = proc_dointvec_minmax, |
|---|
| .. | .. |
|---|
| 791 | 816 | .maxlen = sizeof(int), |
|---|
| 792 | 817 | .mode = 0644, |
|---|
| 793 | 818 | .proc_handler = proc_dointvec_minmax, |
|---|
| 794 | | - .extra1 = &one |
|---|
| 819 | + .extra1 = SYSCTL_ONE |
|---|
| 795 | 820 | }, |
|---|
| 796 | 821 | #endif |
|---|
| 797 | 822 | { |
|---|
| .. | .. |
|---|
| 800 | 825 | .mode = 0644, |
|---|
| 801 | 826 | .maxlen = TCP_CA_NAME_MAX, |
|---|
| 802 | 827 | .proc_handler = proc_tcp_congestion_control, |
|---|
| 828 | + }, |
|---|
| 829 | + { |
|---|
| 830 | + .procname = "tcp_available_congestion_control", |
|---|
| 831 | + .maxlen = TCP_CA_BUF_MAX, |
|---|
| 832 | + .mode = 0444, |
|---|
| 833 | + .proc_handler = proc_tcp_available_congestion_control, |
|---|
| 834 | + }, |
|---|
| 835 | + { |
|---|
| 836 | + .procname = "tcp_allowed_congestion_control", |
|---|
| 837 | + .maxlen = TCP_CA_BUF_MAX, |
|---|
| 838 | + .mode = 0644, |
|---|
| 839 | + .proc_handler = proc_allowed_congestion_control, |
|---|
| 803 | 840 | }, |
|---|
| 804 | 841 | { |
|---|
| 805 | 842 | .procname = "tcp_keepalive_time", |
|---|
| .. | .. |
|---|
| 896 | 933 | .maxlen = sizeof(int), |
|---|
| 897 | 934 | .mode = 0644, |
|---|
| 898 | 935 | .proc_handler = proc_dointvec_minmax, |
|---|
| 899 | | - .extra1 = &zero, |
|---|
| 936 | + .extra1 = SYSCTL_ZERO, |
|---|
| 900 | 937 | .extra2 = &two, |
|---|
| 901 | 938 | }, |
|---|
| 902 | 939 | { |
|---|
| .. | .. |
|---|
| 924 | 961 | .procname = "tcp_fastopen_key", |
|---|
| 925 | 962 | .mode = 0600, |
|---|
| 926 | 963 | .data = &init_net.ipv4.sysctl_tcp_fastopen, |
|---|
| 927 | | - .maxlen = ((TCP_FASTOPEN_KEY_LENGTH * 2) + 10), |
|---|
| 964 | + /* maxlen to print the list of keys in hex (*2), with dashes |
|---|
| 965 | + * separating doublewords and a comma in between keys. |
|---|
| 966 | + */ |
|---|
| 967 | + .maxlen = ((TCP_FASTOPEN_KEY_LENGTH * |
|---|
| 968 | + 2 * TCP_FASTOPEN_KEY_MAX) + |
|---|
| 969 | + (TCP_FASTOPEN_KEY_MAX * 5)), |
|---|
| 928 | 970 | .proc_handler = proc_tcp_fastopen_key, |
|---|
| 929 | 971 | }, |
|---|
| 930 | 972 | { |
|---|
| .. | .. |
|---|
| 933 | 975 | .maxlen = sizeof(int), |
|---|
| 934 | 976 | .mode = 0644, |
|---|
| 935 | 977 | .proc_handler = proc_tfo_blackhole_detect_timeout, |
|---|
| 936 | | - .extra1 = &zero, |
|---|
| 978 | + .extra1 = SYSCTL_ZERO, |
|---|
| 937 | 979 | }, |
|---|
| 938 | 980 | #ifdef CONFIG_IP_ROUTE_MULTIPATH |
|---|
| 939 | 981 | { |
|---|
| .. | .. |
|---|
| 942 | 984 | .maxlen = sizeof(int), |
|---|
| 943 | 985 | .mode = 0644, |
|---|
| 944 | 986 | .proc_handler = proc_dointvec_minmax, |
|---|
| 945 | | - .extra1 = &zero, |
|---|
| 946 | | - .extra2 = &one, |
|---|
| 987 | + .extra1 = SYSCTL_ZERO, |
|---|
| 988 | + .extra2 = SYSCTL_ONE, |
|---|
| 947 | 989 | }, |
|---|
| 948 | 990 | { |
|---|
| 949 | 991 | .procname = "fib_multipath_hash_policy", |
|---|
| .. | .. |
|---|
| 951 | 993 | .maxlen = sizeof(int), |
|---|
| 952 | 994 | .mode = 0644, |
|---|
| 953 | 995 | .proc_handler = proc_fib_multipath_hash_policy, |
|---|
| 954 | | - .extra1 = &zero, |
|---|
| 955 | | - .extra2 = &one, |
|---|
| 996 | + .extra1 = SYSCTL_ZERO, |
|---|
| 997 | + .extra2 = &two, |
|---|
| 956 | 998 | }, |
|---|
| 957 | 999 | #endif |
|---|
| 958 | 1000 | { |
|---|
| .. | .. |
|---|
| 969 | 1011 | .maxlen = sizeof(int), |
|---|
| 970 | 1012 | .mode = 0644, |
|---|
| 971 | 1013 | .proc_handler = proc_dointvec_minmax, |
|---|
| 972 | | - .extra1 = &zero, |
|---|
| 973 | | - .extra2 = &one, |
|---|
| 1014 | + .extra1 = SYSCTL_ZERO, |
|---|
| 1015 | + .extra2 = SYSCTL_ONE, |
|---|
| 974 | 1016 | }, |
|---|
| 975 | 1017 | #endif |
|---|
| 976 | 1018 | { |
|---|
| .. | .. |
|---|
| 1000 | 1042 | .maxlen = sizeof(int), |
|---|
| 1001 | 1043 | .mode = 0644, |
|---|
| 1002 | 1044 | .proc_handler = proc_dointvec_minmax, |
|---|
| 1003 | | - .extra1 = &zero, |
|---|
| 1045 | + .extra1 = SYSCTL_ZERO, |
|---|
| 1004 | 1046 | .extra2 = &four, |
|---|
| 1005 | 1047 | }, |
|---|
| 1006 | 1048 | { |
|---|
| .. | .. |
|---|
| 1104 | 1146 | .proc_handler = proc_dointvec, |
|---|
| 1105 | 1147 | }, |
|---|
| 1106 | 1148 | { |
|---|
| 1149 | + .procname = "tcp_no_ssthresh_metrics_save", |
|---|
| 1150 | + .data = &init_net.ipv4.sysctl_tcp_no_ssthresh_metrics_save, |
|---|
| 1151 | + .maxlen = sizeof(int), |
|---|
| 1152 | + .mode = 0644, |
|---|
| 1153 | + .proc_handler = proc_dointvec_minmax, |
|---|
| 1154 | + .extra1 = SYSCTL_ZERO, |
|---|
| 1155 | + .extra2 = SYSCTL_ONE, |
|---|
| 1156 | + }, |
|---|
| 1157 | + { |
|---|
| 1107 | 1158 | .procname = "tcp_moderate_rcvbuf", |
|---|
| 1108 | 1159 | .data = &init_net.ipv4.sysctl_tcp_moderate_rcvbuf, |
|---|
| 1109 | 1160 | .maxlen = sizeof(int), |
|---|
| .. | .. |
|---|
| 1144 | 1195 | .maxlen = sizeof(int), |
|---|
| 1145 | 1196 | .mode = 0644, |
|---|
| 1146 | 1197 | .proc_handler = proc_dointvec_minmax, |
|---|
| 1147 | | - .extra1 = &one, |
|---|
| 1148 | | - .extra2 = &gso_max_segs, |
|---|
| 1198 | + .extra1 = SYSCTL_ONE, |
|---|
| 1149 | 1199 | }, |
|---|
| 1150 | 1200 | { |
|---|
| 1151 | 1201 | .procname = "tcp_min_rtt_wlen", |
|---|
| .. | .. |
|---|
| 1153 | 1203 | .maxlen = sizeof(int), |
|---|
| 1154 | 1204 | .mode = 0644, |
|---|
| 1155 | 1205 | .proc_handler = proc_dointvec_minmax, |
|---|
| 1156 | | - .extra1 = &zero, |
|---|
| 1206 | + .extra1 = SYSCTL_ZERO, |
|---|
| 1157 | 1207 | .extra2 = &one_day_secs |
|---|
| 1158 | 1208 | }, |
|---|
| 1159 | 1209 | { |
|---|
| .. | .. |
|---|
| 1162 | 1212 | .maxlen = sizeof(int), |
|---|
| 1163 | 1213 | .mode = 0644, |
|---|
| 1164 | 1214 | .proc_handler = proc_dointvec_minmax, |
|---|
| 1165 | | - .extra1 = &zero, |
|---|
| 1166 | | - .extra2 = &one, |
|---|
| 1215 | + .extra1 = SYSCTL_ZERO, |
|---|
| 1216 | + .extra2 = SYSCTL_ONE, |
|---|
| 1167 | 1217 | }, |
|---|
| 1168 | 1218 | { |
|---|
| 1169 | 1219 | .procname = "tcp_invalid_ratelimit", |
|---|
| .. | .. |
|---|
| 1178 | 1228 | .maxlen = sizeof(int), |
|---|
| 1179 | 1229 | .mode = 0644, |
|---|
| 1180 | 1230 | .proc_handler = proc_dointvec_minmax, |
|---|
| 1181 | | - .extra1 = &zero, |
|---|
| 1231 | + .extra1 = SYSCTL_ZERO, |
|---|
| 1182 | 1232 | .extra2 = &thousand, |
|---|
| 1183 | 1233 | }, |
|---|
| 1184 | 1234 | { |
|---|
| .. | .. |
|---|
| 1187 | 1237 | .maxlen = sizeof(int), |
|---|
| 1188 | 1238 | .mode = 0644, |
|---|
| 1189 | 1239 | .proc_handler = proc_dointvec_minmax, |
|---|
| 1190 | | - .extra1 = &zero, |
|---|
| 1240 | + .extra1 = SYSCTL_ZERO, |
|---|
| 1191 | 1241 | .extra2 = &thousand, |
|---|
| 1192 | 1242 | }, |
|---|
| 1193 | 1243 | { |
|---|
| .. | .. |
|---|
| 1196 | 1246 | .maxlen = sizeof(init_net.ipv4.sysctl_tcp_wmem), |
|---|
| 1197 | 1247 | .mode = 0644, |
|---|
| 1198 | 1248 | .proc_handler = proc_dointvec_minmax, |
|---|
| 1199 | | - .extra1 = &one, |
|---|
| 1249 | + .extra1 = SYSCTL_ONE, |
|---|
| 1200 | 1250 | }, |
|---|
| 1201 | 1251 | { |
|---|
| 1202 | 1252 | .procname = "tcp_rmem", |
|---|
| .. | .. |
|---|
| 1204 | 1254 | .maxlen = sizeof(init_net.ipv4.sysctl_tcp_rmem), |
|---|
| 1205 | 1255 | .mode = 0644, |
|---|
| 1206 | 1256 | .proc_handler = proc_dointvec_minmax, |
|---|
| 1207 | | - .extra1 = &one, |
|---|
| 1257 | + .extra1 = SYSCTL_ONE, |
|---|
| 1208 | 1258 | }, |
|---|
| 1209 | 1259 | { |
|---|
| 1210 | 1260 | .procname = "tcp_comp_sack_delay_ns", |
|---|
| 1211 | 1261 | .data = &init_net.ipv4.sysctl_tcp_comp_sack_delay_ns, |
|---|
| 1262 | + .maxlen = sizeof(unsigned long), |
|---|
| 1263 | + .mode = 0644, |
|---|
| 1264 | + .proc_handler = proc_doulongvec_minmax, |
|---|
| 1265 | + }, |
|---|
| 1266 | + { |
|---|
| 1267 | + .procname = "tcp_comp_sack_slack_ns", |
|---|
| 1268 | + .data = &init_net.ipv4.sysctl_tcp_comp_sack_slack_ns, |
|---|
| 1212 | 1269 | .maxlen = sizeof(unsigned long), |
|---|
| 1213 | 1270 | .mode = 0644, |
|---|
| 1214 | 1271 | .proc_handler = proc_doulongvec_minmax, |
|---|
| .. | .. |
|---|
| 1219 | 1276 | .maxlen = sizeof(int), |
|---|
| 1220 | 1277 | .mode = 0644, |
|---|
| 1221 | 1278 | .proc_handler = proc_dointvec_minmax, |
|---|
| 1222 | | - .extra1 = &zero, |
|---|
| 1279 | + .extra1 = SYSCTL_ZERO, |
|---|
| 1223 | 1280 | .extra2 = &comp_sack_nr_max, |
|---|
| 1281 | + }, |
|---|
| 1282 | + { |
|---|
| 1283 | + .procname = "tcp_reflect_tos", |
|---|
| 1284 | + .data = &init_net.ipv4.sysctl_tcp_reflect_tos, |
|---|
| 1285 | + .maxlen = sizeof(int), |
|---|
| 1286 | + .mode = 0644, |
|---|
| 1287 | + .proc_handler = proc_dointvec_minmax, |
|---|
| 1288 | + .extra1 = SYSCTL_ZERO, |
|---|
| 1289 | + .extra2 = SYSCTL_ONE, |
|---|
| 1224 | 1290 | }, |
|---|
| 1225 | 1291 | { |
|---|
| 1226 | 1292 | .procname = "udp_rmem_min", |
|---|
| .. | .. |
|---|
| 1228 | 1294 | .maxlen = sizeof(init_net.ipv4.sysctl_udp_rmem_min), |
|---|
| 1229 | 1295 | .mode = 0644, |
|---|
| 1230 | 1296 | .proc_handler = proc_dointvec_minmax, |
|---|
| 1231 | | - .extra1 = &one |
|---|
| 1297 | + .extra1 = SYSCTL_ONE |
|---|
| 1232 | 1298 | }, |
|---|
| 1233 | 1299 | { |
|---|
| 1234 | 1300 | .procname = "udp_wmem_min", |
|---|
| .. | .. |
|---|
| 1236 | 1302 | .maxlen = sizeof(init_net.ipv4.sysctl_udp_wmem_min), |
|---|
| 1237 | 1303 | .mode = 0644, |
|---|
| 1238 | 1304 | .proc_handler = proc_dointvec_minmax, |
|---|
| 1239 | | - .extra1 = &one |
|---|
| 1305 | + .extra1 = SYSCTL_ONE |
|---|
| 1240 | 1306 | }, |
|---|
| 1241 | 1307 | { } |
|---|
| 1242 | 1308 | }; |
|---|
| .. | .. |
|---|
| 1253 | 1319 | if (!table) |
|---|
| 1254 | 1320 | goto err_alloc; |
|---|
| 1255 | 1321 | |
|---|
| 1256 | | - /* Update the variables to point into the current struct net */ |
|---|
| 1257 | | - for (i = 0; i < ARRAY_SIZE(ipv4_net_table) - 1; i++) |
|---|
| 1258 | | - table[i].data += (void *)net - (void *)&init_net; |
|---|
| 1322 | + for (i = 0; i < ARRAY_SIZE(ipv4_net_table) - 1; i++) { |
|---|
| 1323 | + if (table[i].data) { |
|---|
| 1324 | + /* Update the variables to point into |
|---|
| 1325 | + * the current struct net |
|---|
| 1326 | + */ |
|---|
| 1327 | + table[i].data += (void *)net - (void *)&init_net; |
|---|
| 1328 | + } else { |
|---|
| 1329 | + /* Entries without data pointer are global; |
|---|
| 1330 | + * Make them read-only in non-init_net ns |
|---|
| 1331 | + */ |
|---|
| 1332 | + table[i].mode &= ~0222; |
|---|
| 1333 | + } |
|---|
| 1334 | + } |
|---|
| 1259 | 1335 | } |
|---|
| 1260 | 1336 | |
|---|
| 1261 | 1337 | net->ipv4.ipv4_hdr = register_net_sysctl(net, "net/ipv4", table); |
|---|
| .. | .. |
|---|
| 1264 | 1340 | |
|---|
| 1265 | 1341 | net->ipv4.sysctl_local_reserved_ports = kzalloc(65536 / 8, GFP_KERNEL); |
|---|
| 1266 | 1342 | if (!net->ipv4.sysctl_local_reserved_ports) |
|---|
| 1267 | | - goto err_ports; |
|---|
| 1343 | + goto err_reserved_ports; |
|---|
| 1344 | + |
|---|
| 1345 | + net->ipv4.sysctl_local_unbindable_ports = kzalloc(65536 / 8, GFP_KERNEL); |
|---|
| 1346 | + if (!net->ipv4.sysctl_local_unbindable_ports) |
|---|
| 1347 | + goto err_unbindable_ports; |
|---|
| 1268 | 1348 | |
|---|
| 1269 | 1349 | return 0; |
|---|
| 1270 | 1350 | |
|---|
| 1271 | | -err_ports: |
|---|
| 1351 | +err_unbindable_ports: |
|---|
| 1352 | + kfree(net->ipv4.sysctl_local_reserved_ports); |
|---|
| 1353 | +err_reserved_ports: |
|---|
| 1272 | 1354 | unregister_net_sysctl_table(net->ipv4.ipv4_hdr); |
|---|
| 1273 | 1355 | err_reg: |
|---|
| 1274 | 1356 | if (!net_eq(net, &init_net)) |
|---|
| .. | .. |
|---|
| 1281 | 1363 | { |
|---|
| 1282 | 1364 | struct ctl_table *table; |
|---|
| 1283 | 1365 | |
|---|
| 1366 | + kfree(net->ipv4.sysctl_local_unbindable_ports); |
|---|
| 1284 | 1367 | kfree(net->ipv4.sysctl_local_reserved_ports); |
|---|
| 1285 | 1368 | table = net->ipv4.ipv4_hdr->ctl_table_arg; |
|---|
| 1286 | 1369 | unregister_net_sysctl_table(net->ipv4.ipv4_hdr); |
|---|