这部分对主要的线程进行总体上的分析。
2、runner线程分析
runner是从tq_list链表中,读取一项项的任务,分别执行。tq_list链表中的任务是按时间先后顺序进行排列,最先执行的程序放在前面,只有一个函数对这个链表进行插入操作,就是sorted_insert()。因此,只要看哪些地方调用了sorted_insert(),就可以知道一共有哪些任务会出现在队列中。
只有一个函数调用了sorted_insert(),就是add_task_abs(), 因此,只要看哪些地方调用了add_task_abs (),就可以知道一共有哪些任务会出现在队列中。
序号 |
处理函数 |
说明 |
1 |
_expire() |
绑定到期了的超时处理函数 |
2 |
bu_resend |
重新发送一个绑定更新报文 |
3 |
mn_rr_check_entry |
rr表示Information for return routability,这个函数是对绑定更新选项进行处理, |
4 |
nonce_regen |
随机数重新产生 |
5 |
md_router_timeout_probe |
应用在移动检测中,看看路由器是否依旧可以连接。 |
6 |
mpd_resend_unsol_mpa |
mpa是Mobile Prefix Adverisements,mpd是Mobile Prefix Discovery。unsol是unsolicitation。这是重发非请求的mpa。 |
7 |
mpd_send_unsol_mpa |
发送非请求的mpa |
8 |
ti_resend |
Resend HoTI or CoTI, if we haven't got HoT or CoT |
9 |
dhaad_expire_halist |
dhaad是Dynamic Home Agent Address Discovery。这个函数是删除过期的家乡代理列表。 |
10 |
dhaad_resend |
每隔一段时间,重新发送dhaad请求消息。 |
11 |
md_discover_router |
md表示mobile detection,移动检测。每隔一段时间,发送一个路由器发现的icmpv6报文。 |
12 |
mpd_resend_mps |
MPS是Mobile Prefix Solicitation消息,就是重发mps消息。 |
13 |
mpd_send_first_mps |
MPS是Mobile Prefix Solicitation消息,就是发送第一次mps消息。 |
任务队列的数据结构
跟任务队列相关的数据结构,主要就是一个tq_elem的数据结构。
3、mh_listen线程分析
static void *mh_listen(void *arg)
{
uint8_t msg[MAX_PKT_LEN];
struct in6_pktinfo pktinfo;
struct in6_addr haoa, rta;
struct sockaddr_in6 addr;
struct ip6_mh *mh;
struct in6_addr_bundle addrs;
ssize_t len;
struct mh_handler *h;
pthread_dbg("thread started");
while (1) {
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
//int pthread_setcancelstate(int state, int *oldstate) 设置本线程对Cancel信号的反应,state
//有两种值:PTHREAD_CANCEL_ENABLE(缺省)和PTHREAD_CANCEL_DISABLE,
//分别表示收到信号后设为CANCLED状态和忽略CANCEL信号继续运行
//old_state如果不为NULL则存入原来的Cancel状态以便恢复。
len = mh_recv(msg, sizeof(msg), &addr, &pktinfo, &haoa, &rta);
//从接收移动头部的socket中接收数据,保存在msg