sysctl_net_ipv4.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772
  1. /*
  2. * sysctl_net_ipv4.c: sysctl interface to net IPV4 subsystem.
  3. *
  4. * Begun April 1, 1996, Mike Shaver.
  5. * Added /proc/sys/net/ipv4 directory entry (empty =) ). [MS]
  6. */
  7. #include <linux/mm.h>
  8. #include <linux/module.h>
  9. #include <linux/sysctl.h>
  10. #include <linux/igmp.h>
  11. #include <linux/inetdevice.h>
  12. #include <linux/seqlock.h>
  13. #include <linux/init.h>
  14. #include <linux/slab.h>
  15. #include <net/snmp.h>
  16. #include <net/icmp.h>
  17. #include <net/ip.h>
  18. #include <net/route.h>
  19. #include <net/tcp.h>
  20. #include <net/udp.h>
  21. #include <net/cipso_ipv4.h>
  22. #include <net/inet_frag.h>
  23. static int zero;
  24. static int tcp_retr1_max = 255;
  25. static int ip_local_port_range_min[] = { 1, 1 };
  26. static int ip_local_port_range_max[] = { 65535, 65535 };
  27. static int tcp_adv_win_scale_min = -31;
  28. static int tcp_adv_win_scale_max = 31;
  29. /* Update system visible IP port range */
  30. static void set_local_port_range(int range[2])
  31. {
  32. write_seqlock(&sysctl_local_ports.lock);
  33. sysctl_local_ports.range[0] = range[0];
  34. sysctl_local_ports.range[1] = range[1];
  35. write_sequnlock(&sysctl_local_ports.lock);
  36. }
  37. /* Validate changes from /proc interface. */
  38. static int ipv4_local_port_range(ctl_table *table, int write,
  39. void __user *buffer,
  40. size_t *lenp, loff_t *ppos)
  41. {
  42. int ret;
  43. int range[2];
  44. ctl_table tmp = {
  45. .data = &range,
  46. .maxlen = sizeof(range),
  47. .mode = table->mode,
  48. .extra1 = &ip_local_port_range_min,
  49. .extra2 = &ip_local_port_range_max,
  50. };
  51. inet_get_local_port_range(range, range + 1);
  52. ret = proc_dointvec_minmax(&tmp, write, buffer, lenp, ppos);
  53. if (write && ret == 0) {
  54. if (range[1] < range[0])
  55. ret = -EINVAL;
  56. else
  57. set_local_port_range(range);
  58. }
  59. return ret;
  60. }
  61. static int proc_tcp_congestion_control(ctl_table *ctl, int write,
  62. void __user *buffer, size_t *lenp, loff_t *ppos)
  63. {
  64. char val[TCP_CA_NAME_MAX];
  65. ctl_table tbl = {
  66. .data = val,
  67. .maxlen = TCP_CA_NAME_MAX,
  68. };
  69. int ret;
  70. tcp_get_default_congestion_control(val);
  71. ret = proc_dostring(&tbl, write, buffer, lenp, ppos);
  72. if (write && ret == 0)
  73. ret = tcp_set_default_congestion_control(val);
  74. return ret;
  75. }
  76. static int proc_tcp_available_congestion_control(ctl_table *ctl,
  77. int write,
  78. void __user *buffer, size_t *lenp,
  79. loff_t *ppos)
  80. {
  81. ctl_table tbl = { .maxlen = TCP_CA_BUF_MAX, };
  82. int ret;
  83. tbl.data = kmalloc(tbl.maxlen, GFP_USER);
  84. if (!tbl.data)
  85. return -ENOMEM;
  86. tcp_get_available_congestion_control(tbl.data, TCP_CA_BUF_MAX);
  87. ret = proc_dostring(&tbl, write, buffer, lenp, ppos);
  88. kfree(tbl.data);
  89. return ret;
  90. }
  91. static int proc_allowed_congestion_control(ctl_table *ctl,
  92. int write,
  93. void __user *buffer, size_t *lenp,
  94. loff_t *ppos)
  95. {
  96. ctl_table tbl = { .maxlen = TCP_CA_BUF_MAX };
  97. int ret;
  98. tbl.data = kmalloc(tbl.maxlen, GFP_USER);
  99. if (!tbl.data)
  100. return -ENOMEM;
  101. tcp_get_allowed_congestion_control(tbl.data, tbl.maxlen);
  102. ret = proc_dostring(&tbl, write, buffer, lenp, ppos);
  103. if (write && ret == 0)
  104. ret = tcp_set_allowed_congestion_control(tbl.data);
  105. kfree(tbl.data);
  106. return ret;
  107. }
  108. static struct ctl_table ipv4_table[] = {
  109. {
  110. .procname = "tcp_timestamps",
  111. .data = &sysctl_tcp_timestamps,
  112. .maxlen = sizeof(int),
  113. .mode = 0644,
  114. .proc_handler = proc_dointvec
  115. },
  116. {
  117. .procname = "tcp_window_scaling",
  118. .data = &sysctl_tcp_window_scaling,
  119. .maxlen = sizeof(int),
  120. .mode = 0644,
  121. .proc_handler = proc_dointvec
  122. },
  123. {
  124. .procname = "tcp_sack",
  125. .data = &sysctl_tcp_sack,
  126. .maxlen = sizeof(int),
  127. .mode = 0644,
  128. .proc_handler = proc_dointvec
  129. },
  130. {
  131. .procname = "tcp_retrans_collapse",
  132. .data = &sysctl_tcp_retrans_collapse,
  133. .maxlen = sizeof(int),
  134. .mode = 0644,
  135. .proc_handler = proc_dointvec
  136. },
  137. {
  138. .procname = "ip_default_ttl",
  139. .data = &sysctl_ip_default_ttl,
  140. .maxlen = sizeof(int),
  141. .mode = 0644,
  142. .proc_handler = ipv4_doint_and_flush,
  143. .extra2 = &init_net,
  144. },
  145. {
  146. .procname = "ip_no_pmtu_disc",
  147. .data = &ipv4_config.no_pmtu_disc,
  148. .maxlen = sizeof(int),
  149. .mode = 0644,
  150. .proc_handler = proc_dointvec
  151. },
  152. {
  153. .procname = "ip_nonlocal_bind",
  154. .data = &sysctl_ip_nonlocal_bind,
  155. .maxlen = sizeof(int),
  156. .mode = 0644,
  157. .proc_handler = proc_dointvec
  158. },
  159. {
  160. .procname = "tcp_syn_retries",
  161. .data = &sysctl_tcp_syn_retries,
  162. .maxlen = sizeof(int),
  163. .mode = 0644,
  164. .proc_handler = proc_dointvec
  165. },
  166. {
  167. .procname = "tcp_synack_retries",
  168. .data = &sysctl_tcp_synack_retries,
  169. .maxlen = sizeof(int),
  170. .mode = 0644,
  171. .proc_handler = proc_dointvec
  172. },
  173. {
  174. .procname = "tcp_max_orphans",
  175. .data = &sysctl_tcp_max_orphans,
  176. .maxlen = sizeof(int),
  177. .mode = 0644,
  178. .proc_handler = proc_dointvec
  179. },
  180. {
  181. .procname = "tcp_max_tw_buckets",
  182. .data = &tcp_death_row.sysctl_max_tw_buckets,
  183. .maxlen = sizeof(int),
  184. .mode = 0644,
  185. .proc_handler = proc_dointvec
  186. },
  187. {
  188. .procname = "ip_dynaddr",
  189. .data = &sysctl_ip_dynaddr,
  190. .maxlen = sizeof(int),
  191. .mode = 0644,
  192. .proc_handler = proc_dointvec
  193. },
  194. {
  195. .procname = "tcp_keepalive_time",
  196. .data = &sysctl_tcp_keepalive_time,
  197. .maxlen = sizeof(int),
  198. .mode = 0644,
  199. .proc_handler = proc_dointvec_jiffies,
  200. },
  201. {
  202. .procname = "tcp_keepalive_probes",
  203. .data = &sysctl_tcp_keepalive_probes,
  204. .maxlen = sizeof(int),
  205. .mode = 0644,
  206. .proc_handler = proc_dointvec
  207. },
  208. {
  209. .procname = "tcp_keepalive_intvl",
  210. .data = &sysctl_tcp_keepalive_intvl,
  211. .maxlen = sizeof(int),
  212. .mode = 0644,
  213. .proc_handler = proc_dointvec_jiffies,
  214. },
  215. {
  216. .procname = "tcp_retries1",
  217. .data = &sysctl_tcp_retries1,
  218. .maxlen = sizeof(int),
  219. .mode = 0644,
  220. .proc_handler = proc_dointvec_minmax,
  221. .extra2 = &tcp_retr1_max
  222. },
  223. {
  224. .procname = "tcp_retries2",
  225. .data = &sysctl_tcp_retries2,
  226. .maxlen = sizeof(int),
  227. .mode = 0644,
  228. .proc_handler = proc_dointvec
  229. },
  230. {
  231. .procname = "tcp_fin_timeout",
  232. .data = &sysctl_tcp_fin_timeout,
  233. .maxlen = sizeof(int),
  234. .mode = 0644,
  235. .proc_handler = proc_dointvec_jiffies,
  236. },
  237. #ifdef CONFIG_SYN_COOKIES
  238. {
  239. .procname = "tcp_syncookies",
  240. .data = &sysctl_tcp_syncookies,
  241. .maxlen = sizeof(int),
  242. .mode = 0644,
  243. .proc_handler = proc_dointvec
  244. },
  245. #endif
  246. {
  247. .procname = "tcp_tw_recycle",
  248. .data = &tcp_death_row.sysctl_tw_recycle,
  249. .maxlen = sizeof(int),
  250. .mode = 0644,
  251. .proc_handler = proc_dointvec
  252. },
  253. {
  254. .procname = "tcp_abort_on_overflow",
  255. .data = &sysctl_tcp_abort_on_overflow,
  256. .maxlen = sizeof(int),
  257. .mode = 0644,
  258. .proc_handler = proc_dointvec
  259. },
  260. {
  261. .procname = "tcp_stdurg",
  262. .data = &sysctl_tcp_stdurg,
  263. .maxlen = sizeof(int),
  264. .mode = 0644,
  265. .proc_handler = proc_dointvec
  266. },
  267. {
  268. .procname = "tcp_rfc1337",
  269. .data = &sysctl_tcp_rfc1337,
  270. .maxlen = sizeof(int),
  271. .mode = 0644,
  272. .proc_handler = proc_dointvec
  273. },
  274. {
  275. .procname = "tcp_max_syn_backlog",
  276. .data = &sysctl_max_syn_backlog,
  277. .maxlen = sizeof(int),
  278. .mode = 0644,
  279. .proc_handler = proc_dointvec
  280. },
  281. {
  282. .procname = "ip_local_port_range",
  283. .data = &sysctl_local_ports.range,
  284. .maxlen = sizeof(sysctl_local_ports.range),
  285. .mode = 0644,
  286. .proc_handler = ipv4_local_port_range,
  287. },
  288. {
  289. .procname = "ip_local_reserved_ports",
  290. .data = NULL, /* initialized in sysctl_ipv4_init */
  291. .maxlen = 65536,
  292. .mode = 0644,
  293. .proc_handler = proc_do_large_bitmap,
  294. },
  295. #ifdef CONFIG_IP_MULTICAST
  296. {
  297. .procname = "igmp_max_memberships",
  298. .data = &sysctl_igmp_max_memberships,
  299. .maxlen = sizeof(int),
  300. .mode = 0644,
  301. .proc_handler = proc_dointvec
  302. },
  303. #endif
  304. {
  305. .procname = "igmp_max_msf",
  306. .data = &sysctl_igmp_max_msf,
  307. .maxlen = sizeof(int),
  308. .mode = 0644,
  309. .proc_handler = proc_dointvec
  310. },
  311. {
  312. .procname = "inet_peer_threshold",
  313. .data = &inet_peer_threshold,
  314. .maxlen = sizeof(int),
  315. .mode = 0644,
  316. .proc_handler = proc_dointvec
  317. },
  318. {
  319. .procname = "inet_peer_minttl",
  320. .data = &inet_peer_minttl,
  321. .maxlen = sizeof(int),
  322. .mode = 0644,
  323. .proc_handler = proc_dointvec_jiffies,
  324. },
  325. {
  326. .procname = "inet_peer_maxttl",
  327. .data = &inet_peer_maxttl,
  328. .maxlen = sizeof(int),
  329. .mode = 0644,
  330. .proc_handler = proc_dointvec_jiffies,
  331. },
  332. {
  333. .procname = "inet_peer_gc_mintime",
  334. .data = &inet_peer_gc_mintime,
  335. .maxlen = sizeof(int),
  336. .mode = 0644,
  337. .proc_handler = proc_dointvec_jiffies,
  338. },
  339. {
  340. .procname = "inet_peer_gc_maxtime",
  341. .data = &inet_peer_gc_maxtime,
  342. .maxlen = sizeof(int),
  343. .mode = 0644,
  344. .proc_handler = proc_dointvec_jiffies,
  345. },
  346. {
  347. .procname = "tcp_orphan_retries",
  348. .data = &sysctl_tcp_orphan_retries,
  349. .maxlen = sizeof(int),
  350. .mode = 0644,
  351. .proc_handler = proc_dointvec
  352. },
  353. {
  354. .procname = "tcp_fack",
  355. .data = &sysctl_tcp_fack,
  356. .maxlen = sizeof(int),
  357. .mode = 0644,
  358. .proc_handler = proc_dointvec
  359. },
  360. {
  361. .procname = "tcp_reordering",
  362. .data = &sysctl_tcp_reordering,
  363. .maxlen = sizeof(int),
  364. .mode = 0644,
  365. .proc_handler = proc_dointvec
  366. },
  367. {
  368. .procname = "tcp_ecn",
  369. .data = &sysctl_tcp_ecn,
  370. .maxlen = sizeof(int),
  371. .mode = 0644,
  372. .proc_handler = proc_dointvec
  373. },
  374. {
  375. .procname = "tcp_dsack",
  376. .data = &sysctl_tcp_dsack,
  377. .maxlen = sizeof(int),
  378. .mode = 0644,
  379. .proc_handler = proc_dointvec
  380. },
  381. {
  382. .procname = "tcp_mem",
  383. .data = &sysctl_tcp_mem,
  384. .maxlen = sizeof(sysctl_tcp_mem),
  385. .mode = 0644,
  386. .proc_handler = proc_doulongvec_minmax
  387. },
  388. {
  389. .procname = "tcp_wmem",
  390. .data = &sysctl_tcp_wmem,
  391. .maxlen = sizeof(sysctl_tcp_wmem),
  392. .mode = 0644,
  393. .proc_handler = proc_dointvec
  394. },
  395. {
  396. .procname = "tcp_rmem",
  397. .data = &sysctl_tcp_rmem,
  398. .maxlen = sizeof(sysctl_tcp_rmem),
  399. .mode = 0644,
  400. .proc_handler = proc_dointvec
  401. },
  402. {
  403. .procname = "tcp_app_win",
  404. .data = &sysctl_tcp_app_win,
  405. .maxlen = sizeof(int),
  406. .mode = 0644,
  407. .proc_handler = proc_dointvec
  408. },
  409. {
  410. .procname = "tcp_adv_win_scale",
  411. .data = &sysctl_tcp_adv_win_scale,
  412. .maxlen = sizeof(int),
  413. .mode = 0644,
  414. .proc_handler = proc_dointvec_minmax,
  415. .extra1 = &tcp_adv_win_scale_min,
  416. .extra2 = &tcp_adv_win_scale_max,
  417. },
  418. {
  419. .procname = "tcp_tw_reuse",
  420. .data = &sysctl_tcp_tw_reuse,
  421. .maxlen = sizeof(int),
  422. .mode = 0644,
  423. .proc_handler = proc_dointvec
  424. },
  425. {
  426. .procname = "tcp_frto",
  427. .data = &sysctl_tcp_frto,
  428. .maxlen = sizeof(int),
  429. .mode = 0644,
  430. .proc_handler = proc_dointvec
  431. },
  432. {
  433. .procname = "tcp_frto_response",
  434. .data = &sysctl_tcp_frto_response,
  435. .maxlen = sizeof(int),
  436. .mode = 0644,
  437. .proc_handler = proc_dointvec
  438. },
  439. {
  440. .procname = "tcp_low_latency",
  441. .data = &sysctl_tcp_low_latency,
  442. .maxlen = sizeof(int),
  443. .mode = 0644,
  444. .proc_handler = proc_dointvec
  445. },
  446. {
  447. .procname = "tcp_no_metrics_save",
  448. .data = &sysctl_tcp_nometrics_save,
  449. .maxlen = sizeof(int),
  450. .mode = 0644,
  451. .proc_handler = proc_dointvec,
  452. },
  453. {
  454. .procname = "tcp_moderate_rcvbuf",
  455. .data = &sysctl_tcp_moderate_rcvbuf,
  456. .maxlen = sizeof(int),
  457. .mode = 0644,
  458. .proc_handler = proc_dointvec,
  459. },
  460. {
  461. .procname = "tcp_tso_win_divisor",
  462. .data = &sysctl_tcp_tso_win_divisor,
  463. .maxlen = sizeof(int),
  464. .mode = 0644,
  465. .proc_handler = proc_dointvec,
  466. },
  467. {
  468. .procname = "tcp_congestion_control",
  469. .mode = 0644,
  470. .maxlen = TCP_CA_NAME_MAX,
  471. .proc_handler = proc_tcp_congestion_control,
  472. },
  473. {
  474. .procname = "tcp_abc",
  475. .data = &sysctl_tcp_abc,
  476. .maxlen = sizeof(int),
  477. .mode = 0644,
  478. .proc_handler = proc_dointvec,
  479. },
  480. {
  481. .procname = "tcp_mtu_probing",
  482. .data = &sysctl_tcp_mtu_probing,
  483. .maxlen = sizeof(int),
  484. .mode = 0644,
  485. .proc_handler = proc_dointvec,
  486. },
  487. {
  488. .procname = "tcp_base_mss",
  489. .data = &sysctl_tcp_base_mss,
  490. .maxlen = sizeof(int),
  491. .mode = 0644,
  492. .proc_handler = proc_dointvec,
  493. },
  494. {
  495. .procname = "tcp_workaround_signed_windows",
  496. .data = &sysctl_tcp_workaround_signed_windows,
  497. .maxlen = sizeof(int),
  498. .mode = 0644,
  499. .proc_handler = proc_dointvec
  500. },
  501. #ifdef CONFIG_NET_DMA
  502. {
  503. .procname = "tcp_dma_copybreak",
  504. .data = &sysctl_tcp_dma_copybreak,
  505. .maxlen = sizeof(int),
  506. .mode = 0644,
  507. .proc_handler = proc_dointvec
  508. },
  509. #endif
  510. {
  511. .procname = "tcp_slow_start_after_idle",
  512. .data = &sysctl_tcp_slow_start_after_idle,
  513. .maxlen = sizeof(int),
  514. .mode = 0644,
  515. .proc_handler = proc_dointvec
  516. },
  517. #ifdef CONFIG_NETLABEL
  518. {
  519. .procname = "cipso_cache_enable",
  520. .data = &cipso_v4_cache_enabled,
  521. .maxlen = sizeof(int),
  522. .mode = 0644,
  523. .proc_handler = proc_dointvec,
  524. },
  525. {
  526. .procname = "cipso_cache_bucket_size",
  527. .data = &cipso_v4_cache_bucketsize,
  528. .maxlen = sizeof(int),
  529. .mode = 0644,
  530. .proc_handler = proc_dointvec,
  531. },
  532. {
  533. .procname = "cipso_rbm_optfmt",
  534. .data = &cipso_v4_rbm_optfmt,
  535. .maxlen = sizeof(int),
  536. .mode = 0644,
  537. .proc_handler = proc_dointvec,
  538. },
  539. {
  540. .procname = "cipso_rbm_strictvalid",
  541. .data = &cipso_v4_rbm_strictvalid,
  542. .maxlen = sizeof(int),
  543. .mode = 0644,
  544. .proc_handler = proc_dointvec,
  545. },
  546. #endif /* CONFIG_NETLABEL */
  547. {
  548. .procname = "tcp_available_congestion_control",
  549. .maxlen = TCP_CA_BUF_MAX,
  550. .mode = 0444,
  551. .proc_handler = proc_tcp_available_congestion_control,
  552. },
  553. {
  554. .procname = "tcp_allowed_congestion_control",
  555. .maxlen = TCP_CA_BUF_MAX,
  556. .mode = 0644,
  557. .proc_handler = proc_allowed_congestion_control,
  558. },
  559. {
  560. .procname = "tcp_max_ssthresh",
  561. .data = &sysctl_tcp_max_ssthresh,
  562. .maxlen = sizeof(int),
  563. .mode = 0644,
  564. .proc_handler = proc_dointvec,
  565. },
  566. {
  567. .procname = "tcp_cookie_size",
  568. .data = &sysctl_tcp_cookie_size,
  569. .maxlen = sizeof(int),
  570. .mode = 0644,
  571. .proc_handler = proc_dointvec
  572. },
  573. {
  574. .procname = "tcp_thin_linear_timeouts",
  575. .data = &sysctl_tcp_thin_linear_timeouts,
  576. .maxlen = sizeof(int),
  577. .mode = 0644,
  578. .proc_handler = proc_dointvec
  579. },
  580. {
  581. .procname = "tcp_thin_dupack",
  582. .data = &sysctl_tcp_thin_dupack,
  583. .maxlen = sizeof(int),
  584. .mode = 0644,
  585. .proc_handler = proc_dointvec
  586. },
  587. {
  588. .procname = "udp_mem",
  589. .data = &sysctl_udp_mem,
  590. .maxlen = sizeof(sysctl_udp_mem),
  591. .mode = 0644,
  592. .proc_handler = proc_doulongvec_minmax,
  593. },
  594. {
  595. .procname = "udp_rmem_min",
  596. .data = &sysctl_udp_rmem_min,
  597. .maxlen = sizeof(sysctl_udp_rmem_min),
  598. .mode = 0644,
  599. .proc_handler = proc_dointvec_minmax,
  600. .extra1 = &zero
  601. },
  602. {
  603. .procname = "udp_wmem_min",
  604. .data = &sysctl_udp_wmem_min,
  605. .maxlen = sizeof(sysctl_udp_wmem_min),
  606. .mode = 0644,
  607. .proc_handler = proc_dointvec_minmax,
  608. .extra1 = &zero
  609. },
  610. { }
  611. };
  612. static struct ctl_table ipv4_net_table[] = {
  613. {
  614. .procname = "icmp_echo_ignore_all",
  615. .data = &init_net.ipv4.sysctl_icmp_echo_ignore_all,
  616. .maxlen = sizeof(int),
  617. .mode = 0644,
  618. .proc_handler = proc_dointvec
  619. },
  620. {
  621. .procname = "icmp_echo_ignore_broadcasts",
  622. .data = &init_net.ipv4.sysctl_icmp_echo_ignore_broadcasts,
  623. .maxlen = sizeof(int),
  624. .mode = 0644,
  625. .proc_handler = proc_dointvec
  626. },
  627. {
  628. .procname = "icmp_ignore_bogus_error_responses",
  629. .data = &init_net.ipv4.sysctl_icmp_ignore_bogus_error_responses,
  630. .maxlen = sizeof(int),
  631. .mode = 0644,
  632. .proc_handler = proc_dointvec
  633. },
  634. {
  635. .procname = "icmp_errors_use_inbound_ifaddr",
  636. .data = &init_net.ipv4.sysctl_icmp_errors_use_inbound_ifaddr,
  637. .maxlen = sizeof(int),
  638. .mode = 0644,
  639. .proc_handler = proc_dointvec
  640. },
  641. {
  642. .procname = "icmp_ratelimit",
  643. .data = &init_net.ipv4.sysctl_icmp_ratelimit,
  644. .maxlen = sizeof(int),
  645. .mode = 0644,
  646. .proc_handler = proc_dointvec_ms_jiffies,
  647. },
  648. {
  649. .procname = "icmp_ratemask",
  650. .data = &init_net.ipv4.sysctl_icmp_ratemask,
  651. .maxlen = sizeof(int),
  652. .mode = 0644,
  653. .proc_handler = proc_dointvec
  654. },
  655. {
  656. .procname = "rt_cache_rebuild_count",
  657. .data = &init_net.ipv4.sysctl_rt_cache_rebuild_count,
  658. .maxlen = sizeof(int),
  659. .mode = 0644,
  660. .proc_handler = proc_dointvec
  661. },
  662. { }
  663. };
  664. struct ctl_path net_ipv4_ctl_path[] = {
  665. { .procname = "net", },
  666. { .procname = "ipv4", },
  667. { },
  668. };
  669. EXPORT_SYMBOL_GPL(net_ipv4_ctl_path);
  670. static __net_init int ipv4_sysctl_init_net(struct net *net)
  671. {
  672. struct ctl_table *table;
  673. table = ipv4_net_table;
  674. if (!net_eq(net, &init_net)) {
  675. table = kmemdup(table, sizeof(ipv4_net_table), GFP_KERNEL);
  676. if (table == NULL)
  677. goto err_alloc;
  678. table[0].data =
  679. &net->ipv4.sysctl_icmp_echo_ignore_all;
  680. table[1].data =
  681. &net->ipv4.sysctl_icmp_echo_ignore_broadcasts;
  682. table[2].data =
  683. &net->ipv4.sysctl_icmp_ignore_bogus_error_responses;
  684. table[3].data =
  685. &net->ipv4.sysctl_icmp_errors_use_inbound_ifaddr;
  686. table[4].data =
  687. &net->ipv4.sysctl_icmp_ratelimit;
  688. table[5].data =
  689. &net->ipv4.sysctl_icmp_ratemask;
  690. table[6].data =
  691. &net->ipv4.sysctl_rt_cache_rebuild_count;
  692. }
  693. net->ipv4.sysctl_rt_cache_rebuild_count = 4;
  694. net->ipv4.ipv4_hdr = register_net_sysctl_table(net,
  695. net_ipv4_ctl_path, table);
  696. if (net->ipv4.ipv4_hdr == NULL)
  697. goto err_reg;
  698. return 0;
  699. err_reg:
  700. if (!net_eq(net, &init_net))
  701. kfree(table);
  702. err_alloc:
  703. return -ENOMEM;
  704. }
  705. static __net_exit void ipv4_sysctl_exit_net(struct net *net)
  706. {
  707. struct ctl_table *table;
  708. table = net->ipv4.ipv4_hdr->ctl_table_arg;
  709. unregister_net_sysctl_table(net->ipv4.ipv4_hdr);
  710. kfree(table);
  711. }
  712. static __net_initdata struct pernet_operations ipv4_sysctl_ops = {
  713. .init = ipv4_sysctl_init_net,
  714. .exit = ipv4_sysctl_exit_net,
  715. };
  716. static __init int sysctl_ipv4_init(void)
  717. {
  718. struct ctl_table_header *hdr;
  719. struct ctl_table *i;
  720. for (i = ipv4_table; i->procname; i++) {
  721. if (strcmp(i->procname, "ip_local_reserved_ports") == 0) {
  722. i->data = sysctl_local_reserved_ports;
  723. break;
  724. }
  725. }
  726. if (!i->procname)
  727. return -EINVAL;
  728. hdr = register_sysctl_paths(net_ipv4_ctl_path, ipv4_table);
  729. if (hdr == NULL)
  730. return -ENOMEM;
  731. if (register_pernet_subsys(&ipv4_sysctl_ops)) {
  732. unregister_sysctl_table(hdr);
  733. return -ENOMEM;
  734. }
  735. return 0;
  736. }
  737. __initcall(sysctl_ipv4_init);