- 论坛徽章:
- 9
|
回复 3# 4059056
真正控制的变量在这:
http://lxr.free-electrons.com/so ... pv4.c?v=2.6.36#L750- 748 for (i = ipv4_table; i->procname; i++) {
- 749 if (strcmp(i->procname, "ip_local_reserved_ports") == 0) {
- 750 i->data = sysctl_local_reserved_ports;
- 751 break;
- 752 }
- 753 }
复制代码 使用这个变量的地方:
http://lxr.free-electrons.com/so ... /ip.h?v=2.6.36#L199- 199 static inline int inet_is_reserved_local_port(int port)
- 200 {
- 201 return test_bit(port, sysctl_local_reserved_ports);
- 202 }
复制代码 正真生效的地方:
http://lxr.free-electrons.com/so ... ock.c?v=2.6.36#L113- 92 int inet_csk_get_port(struct sock *sk, unsigned short snum)
- 93 {
- ……
- 103 if (!snum) {
- 104 int remaining, rover, low, high;
- 105
- 106 again:
- 107 inet_get_local_port_range(&low, &high);
- 108 remaining = (high - low) + 1;
- 109 smallest_rover = rover = net_random() % remaining + low;
- 110
- 111 smallest_size = -1;
- 112 do {
- 113 if (inet_is_reserved_local_port(rover))
- 114 goto next_nolock;
-
- ……
- 137 next_nolock:
- 138 if (++rover > high)
- 139 rover = low;
- 140 } while (--remaining > 0);
- 141
- ……
- 213 }
- 214 EXPORT_SYMBOL_GPL(inet_csk_get_port);
复制代码 这也不难搜索呀。以后自己要多练习。这个实现在内核来于已经很解单了。
|
|