Changeset View
Changeset View
Standalone View
Standalone View
head/usr.sbin/route6d/route6d.c
Show First 20 Lines • Show All 1,762 Lines • ▼ Show 20 Lines | case RTM_IFANNOUNCE: | ||||
case IFAN_DEPARTURE: | case IFAN_DEPARTURE: | ||||
ifremove(ifan->ifan_index); | ifremove(ifan->ifan_index); | ||||
iface++; | iface++; | ||||
break; | break; | ||||
} | } | ||||
break; | break; | ||||
default: | default: | ||||
rtm = (struct rt_msghdr *)(void *)p; | rtm = (struct rt_msghdr *)(void *)p; | ||||
addrs = rtm->rtm_addrs; | |||||
q = (char *)(rtm + 1); | |||||
if (rtm->rtm_version != RTM_VERSION) { | if (rtm->rtm_version != RTM_VERSION) { | ||||
trace(1, "unexpected rtmsg version %d " | trace(1, "unexpected rtmsg version %d " | ||||
"(should be %d)\n", | "(should be %d)\n", | ||||
rtm->rtm_version, RTM_VERSION); | rtm->rtm_version, RTM_VERSION); | ||||
continue; | continue; | ||||
} | } | ||||
/* | |||||
* Only messages that use the struct rt_msghdr | |||||
* format are allowed beyond this point. | |||||
*/ | |||||
if (rtm->rtm_type > RTM_RESOLVE) { | |||||
trace(1, "rtmsg type %d ignored\n", | |||||
rtm->rtm_type); | |||||
continue; | |||||
} | |||||
addrs = rtm->rtm_addrs; | |||||
q = (char *)(rtm + 1); | |||||
if (rtm->rtm_pid == pid) { | if (rtm->rtm_pid == pid) { | ||||
#if 0 | #if 0 | ||||
trace(1, "rtmsg looped back to me, ignored\n"); | trace(1, "rtmsg looped back to me, ignored\n"); | ||||
#endif | #endif | ||||
continue; | continue; | ||||
} | } | ||||
break; | break; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 1,181 Lines • ▼ Show 20 Lines | if (write(rtsock, buf, len) < 0) { | ||||
exit(1); | exit(1); | ||||
} | } | ||||
do { | do { | ||||
if ((len = read(rtsock, buf, sizeof(buf))) < 0) { | if ((len = read(rtsock, buf, sizeof(buf))) < 0) { | ||||
perror("read from rtsock"); | perror("read from rtsock"); | ||||
exit(1); | exit(1); | ||||
} | } | ||||
rtm = (struct rt_msghdr *)(void *)buf; | rtm = (struct rt_msghdr *)(void *)buf; | ||||
} while (rtm->rtm_seq != myseq || rtm->rtm_pid != pid); | } while (rtm->rtm_type != RTM_GET || rtm->rtm_seq != myseq || | ||||
rtm->rtm_pid != pid); | |||||
sin6 = (struct sockaddr_in6 *)(void *)&buf[sizeof(struct rt_msghdr)]; | sin6 = (struct sockaddr_in6 *)(void *)&buf[sizeof(struct rt_msghdr)]; | ||||
if (rtm->rtm_addrs & RTA_DST) { | if (rtm->rtm_addrs & RTA_DST) { | ||||
sin6 = (struct sockaddr_in6 *)(void *) | sin6 = (struct sockaddr_in6 *)(void *) | ||||
((char *)sin6 + ROUNDUP(sin6->sin6_len)); | ((char *)sin6 + ROUNDUP(sin6->sin6_len)); | ||||
} | } | ||||
if (rtm->rtm_addrs & RTA_GATEWAY) { | if (rtm->rtm_addrs & RTA_GATEWAY) { | ||||
*gw = sin6->sin6_addr; | *gw = sin6->sin6_addr; | ||||
return gw; | return gw; | ||||
▲ Show 20 Lines • Show All 585 Lines • Show Last 20 Lines |