当前位置:  技术问答>linux和unix

帮我分析一下这段代码的作用,最好能给出关键部分的注释,来者有分!

    来源: 互联网  发布时间:2015-09-02

    本文导语:  static int inet6_create(struct socket *sock, int protocol) { struct inet_opt *inet; struct ipv6_pinfo *np; struct sock *sk; struct tcp6_sock* tcp6sk; struct list_head *p; struct inet_protosw *answer; struct proto *answer_prot; unsigned char answer_flags; ...

static int inet6_create(struct socket *sock, int protocol)
{
struct inet_opt *inet;
struct ipv6_pinfo *np;
struct sock *sk;
struct tcp6_sock* tcp6sk;
struct list_head *p;
struct inet_protosw *answer;
struct proto *answer_prot;
unsigned char answer_flags;
char answer_no_check;
int rc;

/* Look for the requested type/protocol pair. */
answer = NULL;
rcu_read_lock();
list_for_each_rcu(p, &inetsw6[sock->type]) 
{
answer = list_entry(p, struct inet_protosw, list);

/* Check the non-wild match. */
if (protocol == answer->protocol) 
{
if (protocol != IPPROTO_IP)
break;

else 
{
/* Check for the two wild cases. */
if (IPPROTO_IP == protocol) 
{  
protocol = answer->protocol;
break;
}
if (IPPROTO_IP == answer->protocol)
break;
}
answer = NULL;
}

rc = -ESOCKTNOSUPPORT;
if (!answer)
goto out_rcu_unlock;
rc = -EPERM;
if (answer->capability > 0 && !capable(answer->capability))
goto out_rcu_unlock;
rc = -EPROTONOSUPPORT;
if (!protocol)
goto out_rcu_unlock;

sock->ops = answer->ops;

answer_prot = answer->prot;
answer_no_check = answer->no_check;
answer_flags = answer->flags;
rcu_read_unlock();

BUG_TRAP(answer_prot->slab != NULL);

rc = -ENOBUFS;
sk = sk_alloc(PF_INET6, GFP_KERNEL,
      answer_prot->slab_obj_size,
      answer_prot->slab);
if (sk == NULL)
goto out;

sock_init_data(sock, sk);
sk_set_owner(sk, THIS_MODULE);

rc = 0;
sk->sk_prot = answer_prot;
sk->sk_no_check = answer_no_check;
if (INET_PROTOSW_REUSE & answer_flags)
sk->sk_reuse = 1;

inet = inet_sk(sk);

if (SOCK_RAW == sock->type) {
inet->num = protocol;
if (IPPROTO_RAW == protocol)
inet->hdrincl = 1;
}

sk->sk_destruct = inet6_sock_destruct;
sk->sk_family = PF_INET6;
sk->sk_protocol = protocol;

sk->sk_backlog_rcv = answer->prot->backlog_rcv;

tcp6sk = (struct tcp6_sock *)sk;
tcp6sk->pinet6 = np = inet6_sk_generic(sk);
np->hop_limit = -1;
np->mcast_hops = -1;
np->mc_loop = 1;
np->pmtudisc = IPV6_PMTUDISC_WANT;
np->ipv6only = sysctl_ipv6_bindv6only;

/* Init the ipv4 part of the socket since we can have sockets
 * using v6 API for ipv4.
 */
inet->uc_ttl = -1;

inet->mc_loop = 1;
inet->mc_ttl = 1;
inet->mc_index = 0;
inet->mc_list = NULL;

if (ipv4_config.no_pmtu_disc)
inet->pmtudisc = IP_PMTUDISC_DONT;
else
inet->pmtudisc = IP_PMTUDISC_WANT;


#ifdef INET_REFCNT_DEBUG
atomic_inc(&inet6_sock_nr);
atomic_inc(&inet_sock_nr);
#endif
if (inet->num) {
/* It assumes that any protocol which allows
 * the user to assign a number at socket
 * creation time automatically shares.
 */
inet->sport = ntohs(inet->num);
sk->sk_prot->hash(sk);
}
if (sk->sk_prot->init) {
rc = sk->sk_prot->init(sk);
if (rc) {
sk_common_release(sk);
goto out;
}
}
out:
return rc;
out_rcu_unlock:
rcu_read_unlock();
goto out;
}

|
linux内核源码 具体不懂 我顶一下

|
上 http://linuxipsecvpn.cosoft.org.cn/Linux_network_source_reading/ 这里看看

|
gz

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 【诚意求救】小弟一台Web服务器上ProFTP服务启动失败,现给出错误信息,求高手分析原因
  • HASH查找的程序实现及性能分析
  • 如何获取shell词法分析,语法分析及解释器的内容和信息
  • http协议介绍,文件上传分析及程序举例
  • 两台机器同时出现同样的故障,有人能帮分析分析吗?
  • linux下free命令显示的内存使用情况分析
  • 请教高手帮我分析分析!
  • Linux下时钟同步问题:Clock skew detected原因分析及解决方法
  • 如何分析linux宕机原因(或者说如何通过查日志分析宕机原因)
  • Docker支持更深入的容器日志分析
  • Python的词法分析与语法分析
  • mongodb的优点和缺点详细分析
  • 大家帮我分析分析:Samba的配置问题
  • Docker容器分析----好处和缺点介绍
  • ubuntu 下安装libpcap 的时候make时候出错 请帮忙分析分析
  • docker源码分析之容器日志处理与log-driver实现
  • 200分求教有关linux核心的dos攻击算法分析以及源代码的情景分析,研究用,急!!!
  • c/c++服务器程序内存泄露问题分析及解决
  • Java 代码分析工具 JHawk
  • spring的事务类型及spring和hibernate可能导致的问题分析
  • 显微镜数据分析 Gwyddion
  • Mysql大表查询优化技巧总结及案例分析
  • 可视化数据分析 ParaView


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3