状态分配-can协议完全讲解

4.3状态分配函数被状态接口管理函数pfkey_msg2xfrm_state()或xfrm_add_sa(),同时,该函数也被其它状态函数调用,比如在state查询函数xfrm_state_find()中找不到state时调用该函数创建state. struct xfrm_state *xfrm_state_alloc(struct net *net) { struct xfrm_state *x; x = kzalloc(sizeof(struct xfrm_state), GFP_ATOMIC); if (x) { write_pnet(&x->xs_net, net); atomic_set(&x->refcnt, 1);/*使用计数初始化*/ atomic_set(&x->tunnel_users, 0);/*被几个ipsec隧道引用*/ /* key管理链表即state链表*/ INIT_LIST_HEAD(&x->km.all); /*初始化创建的三个hash链表*/ INIT_HLIST_NODE(&x->bydst); INIT_HLIST_NODE(&x->bysrc); INIT_HLIST_NODE(&x->byspi); /*初始化状态定时器处理*/ tasklet_hrtimer_init(&x->mtimer, xfrm_timer_handler, CLOCK_BOOTTIME, HRTIMER_MODE_ABS); setup_timer(&x->rtimer, xfrm_replay_timer_handler, (unsigned long)x); x->curlft.add_time = get_seconds(); /* SA存活期参数*/ x->lft.soft_byte_limit = XFRM_INF; x->lft.soft_packet_limit = XFRM_INF; x->lft.hard_byte_limit = XFRM_INF; x->lft.hard_packet_limit = XFRM_INF; /*回放处理参数*/ x->replay_maxage = 0; x->replay_maxdiff = 0; x->inner_mode = NULL; x->inner_mode_iaf = NULL; spin_lock_init(&x->lock); } return x; }
pdf 文件大小:892.77KB