Skip to content

Commit

Permalink
- fixed the problem that babymdd doesn't work when it is launched from
Browse files Browse the repository at this point in the history
  a startup script.
  • Loading branch information
keiichi committed Jun 21, 2005
1 parent c3cfc4b commit 582da08
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 23 deletions.
50 changes: 28 additions & 22 deletions kame/kame/shisad/babymdd.c
@@ -1,4 +1,4 @@
/* $Id: babymdd.c,v 1.10 2005/06/05 12:13:14 ryuji Exp $ */
/* $Id: babymdd.c,v 1.11 2005/06/21 12:53:12 keiichi Exp $ */

/*
* Copyright (C) 2004 WIDE Project. All rights reserved.
Expand Down Expand Up @@ -1086,43 +1086,47 @@ baby_getifinfo(ifinfo)
for (next = ifmsg; next < limit; next += ifm->ifm_msglen) {

ifm = (struct if_msghdr *) next;

if (ifm->ifm_type == RTM_NEWADDR) {

if (ifm->ifm_index != ifinfo->ifindex)
continue;

switch (ifm->ifm_type) {
case RTM_IFINFO:
ifinfo->iftype = ifm->ifm_data.ifi_type;
break;

case RTM_NEWADDR:
ifam = (struct ifa_msghdr *) next;

get_rtaddrs(ifam->ifam_addrs,
(struct sockaddr *) (ifam + 1), rti_info);
sin6 = (struct sockaddr_in6 *) rti_info[RTAX_IFA];
memset(&ifr6, 0, sizeof(ifr6));
ifr6.ifr_addr = *sin6;
(struct sockaddr *)(ifam + 1), rti_info);
sin6 = (struct sockaddr_in6 *)rti_info[RTAX_IFA];

/* unknown interface !? */
if (if_indextoname(ifm->ifm_index,
ifr6.ifr_name) == NULL)
continue;

if (ifm->ifm_index != ifinfo->ifindex)
continue;

/* MUST be global */
/* MUST be a global address. */
if (in6_addrscope(&sin6->sin6_addr) !=
__IPV6_ADDR_SCOPE_GLOBAL)
continue;

/* get interface flags. */
memset(&ifr6, 0, sizeof(ifr6));
ifr6.ifr_addr = *sin6;
if (if_indextoname(ifm->ifm_index, ifr6.ifr_name)
== NULL)
continue;
if (ioctl(babyinfo.linksock, SIOCGIFAFLAG_IN6, &ifr6) < 0) {
perror("ioctl(SIOCGIFAFLAG_IN6)");
continue;
}
if (ifr6.ifr_ifru.ifru_flags6 & IN6_IFF_READONLY)
continue;

memcpy(&ifinfo->coa, sin6, sizeof(struct sockaddr_in6));

free(ifmsg);
return;
/* XXX how do we handle multiple addresses? */
memcpy(&ifinfo->coa, sin6,
sizeof(struct sockaddr_in6));
break;
}
}
memset(&ifinfo->coa, 0, sizeof(ifinfo->coa));

if (ifmsg)
free(ifmsg);

Expand Down Expand Up @@ -1175,7 +1179,9 @@ baby_selection() {
for (ifinfo = LIST_FIRST(&babyinfo.ifinfo_head);
ifinfo; ifinfo = ifinfo_next) {
ifinfo_next = LIST_NEXT(ifinfo, ifinfo_entry);


if (ifinfo->iftype == IFT_MIP)
continue;
if (ifinfo->coa.ss_family != AF_INET6)
continue;

Expand Down
3 changes: 2 additions & 1 deletion kame/kame/shisad/babymdd.h
@@ -1,4 +1,4 @@
/* $Id: babymdd.h,v 1.3 2005/05/25 01:49:23 keiichi Exp $ */
/* $Id: babymdd.h,v 1.4 2005/06/21 12:53:12 keiichi Exp $ */

/*
* Copyright (C) 2004 WIDE Project. All rights reserved.
Expand Down Expand Up @@ -79,6 +79,7 @@ struct hoa_info {
struct if_info {
LIST_ENTRY(if_info) ifinfo_entry;
char ifname[IFNAMSIZ];
u_char iftype;
u_int16_t ifindex;

struct sockaddr_storage coa;/* Current CoA */
Expand Down

0 comments on commit 582da08

Please sign in to comment.