bind的核心执行函数
bind系统调用的核心函数调用流程如下:
syscall_define3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen)|sock- >ops- >bind(sock, (struct sockaddr *) &address, addrlen);|inet_bind|inet_csk_get_port中间的流程暂且不看,本文主要分析最重要的函数:inet_csk_get_port,从该函数出发了解本地绑定端口如何管理。
以下是原函数,通过下文章节逐步分段分析
int inet_csk_get_port(struct sock *sk, unsigned short snum){ bool reuse = sk- >sk_reuse && sk- >sk_state != tcp_listen; struct inet_hashinfo *hinfo = sk- >sk_prot- >h.hashinfo; int ret = 1, port = snum; struct inet_bind_hashbucket *head; struct net *net = sock_net(sk); struct inet_bind_bucket *tb = null; kuid_t uid = sock_i_uid(sk); if (!port) { head = inet_csk_find_open_port(sk, &tb, &port); if (!head) return ret; if (!tb) goto tb_not_found; goto success; } head = &hinfo- >bhash[inet_bhashfn(net, port, hinfo- >bhash_size)]; spin_lock_bh(&head- >lock); inet_bind_bucket_for_each(tb, &head- >chain) if (net_eq(ib_net(tb), net) && tb- >port == port) goto tb_found;tb_not_found: tb = inet_bind_bucket_create(hinfo- >bind_bucket_cachep, net, head, port); if (!tb) goto fail_unlock;tb_found: if (!hlist_empty(&tb- >owners)) { if (sk- >sk_reuse == sk_force_reuse) goto success; if ((tb- >fastreuse > 0 && reuse) || sk_reuseport_match(tb, sk)) goto success; if (inet_csk_bind_conflict(sk, tb, true, true)) goto fail_unlock; }success: if (hlist_empty(&tb- >owners)) { tb- >fastreuse = reuse; if (sk- >sk_reuseport) { tb- >fastreuseport = fastreuseport_any; tb- >fastuid = uid; tb- >fast_rcv_saddr = sk- >sk_rcv_saddr; tb- >fast_ipv6_only = ipv6_only_sock(sk); tb- >fast_sk_family = sk- >sk_family;#if is_enabled(config_ipv6) tb- >fast_v6_rcv_saddr = sk- >sk_v6_rcv_saddr;#endif } else { tb- >fastreuseport = 0; } } else { if (!reuse) tb- >fastreuse = 0; if (sk- >sk_reuseport) { if (!sk_reuseport_match(tb, sk)) { tb- >fastreuseport = fastreuseport_strict; tb- >fastuid = uid; tb- >fast_rcv_saddr = sk- >sk_rcv_saddr; tb- >fast_ipv6_only = ipv6_only_sock(sk); tb- >fast_sk_family = sk- >sk_family;#if is_enabled(config_ipv6) tb- >fast_v6_rcv_saddr = sk- >sk_v6_rcv_saddr;#endif } } else { tb- >fastreuseport = 0; } } if (!inet_csk(sk)- >icsk_bind_hash) inet_bind_hash(sk, tb, port); warn_on(inet_csk(sk)- >icsk_bind_hash != tb); ret = 0;fail_unlock: spin_unlock_bh(&head- >lock); return ret;}
比特币会取代黄金的位置吗
出货量超100000台,国产大爆发!这条传感器赛道,以后看中国了!
谷歌Gmail新功能可引入多个邮件签名
5GHz WiFi真的已经来了
诺基亚回归旗舰大作:Nokia8,骁龙835,安卓机皇
Linux bind的核心执行函数
智慧城市的大脑和人脑有什么差别
《人脸识别应用公众调研报告》中解析人脸加二维码门禁
贾跃亭首度回应“乐视资金链危机”:乐视资金已解决六七成 三到四个月会恢复正常
微软宣布IE 9测试版将于9月份推出
解疑答惑,OKR工具真的只适用互联网企业吗?
介绍10个AI方案,帮助企业打造出适合AI规模化应用的土壤
串并联电路的标准画法
浅谈STM32之SD卡
戴尔新款XPS 13笔记本搭载10nm英特尔酷睿处理器,国行价格公布
Intersil推出用于便携式电子设备的开关稳压器
CO2传感器在存储、保鲜行业的应用
2021金盾榜专家评审正式开启!哪些“黑马”即将涌现?
人工智能捕捉了人类数千年的想象力
喷嘴流量计工作原理和特点