if_managelink(struct dhcpcd_ctx *ctx)
{
/* route and ifwatchd like a msg buf size of 2048 */
- char msg[2048], *p, *e, *cp, ifname[IF_NAMESIZE];
+ char msg[2048], *p, *e, *cp;
ssize_t bytes;
struct rt_msghdr *rtm;
struct if_announcemsghdr *ifan;
struct sockaddr *sa, *rti_info[RTAX_MAX];
int len;
struct sockaddr_dl sdl;
+ struct interface *ifp;
#ifdef INET
struct rt rt;
#endif
#endif
case RTM_IFINFO:
ifm = (struct if_msghdr *)(void *)p;
- memset(ifname, 0, sizeof(ifname));
- if (!(if_indextoname(ifm->ifm_index, ifname)))
+ if ((ifp = if_findindex(ctx, ifm->ifm_index)) == NULL)
break;
switch (ifm->ifm_data.ifi_link_state) {
case LINK_STATE_DOWN:
break;
}
dhcpcd_handlecarrier(ctx, len,
- (unsigned int)ifm->ifm_flags, ifname);
+ (unsigned int)ifm->ifm_flags, ifp->name);
break;
case RTM_DELETE:
if (~rtm->rtm_addrs &
case RTM_DELADDR: /* FALLTHROUGH */
case RTM_NEWADDR:
ifam = (struct ifa_msghdr *)(void *)p;
- if (!if_indextoname(ifam->ifam_index, ifname))
+ if ((ifp = if_findindex(ctx, ifam->ifam_index)) == NULL)
break;
cp = (char *)(void *)(ifam + 1);
get_addrs(ifam->ifam_addrs, cp, rti_info);
#endif
memcpy(&sdl, rti_info[RTAX_IFA],
rti_info[RTAX_IFA]->sa_len);
- dhcpcd_handlehwaddr(ctx, ifname,
+ dhcpcd_handlehwaddr(ctx, ifp->name,
(const unsigned char*)CLLADDR(&sdl),
sdl.sdl_alen);
break;
COPYOUT(rt.net, rti_info[RTAX_NETMASK]);
COPYOUT(rt.gate, rti_info[RTAX_BRD]);
ipv4_handleifa(ctx, rtm->rtm_type,
- NULL, ifname,
+ NULL, ifp->name,
&rt.dest, &rt.net, &rt.gate);
break;
#endif
rti_info[RTAX_IFA];
ia6 = sin6->sin6_addr;
if (rtm->rtm_type == RTM_NEWADDR) {
- ifa_flags = if_addrflags6(ifname, &ia6);
+ ifa_flags = if_addrflags6(ifp->name,
+ &ia6);
if (ifa_flags == -1)
break;
} else
ifa_flags = 0;
ipv6_handleifa(ctx, rtm->rtm_type, NULL,
- ifname, &ia6, ifa_flags);
+ ifp->name, &ia6, ifa_flags);
break;
#endif
}
}
int
-if_checkipv6(struct dhcpcd_ctx *ctx, const char *ifname, int own)
+if_checkipv6(struct dhcpcd_ctx *ctx, const struct interface *ifp, int own)
{
int ra;
- if (ifname) {
+ if (ifp) {
#ifdef ND6_IFF_OVERRIDE_RTADV
int override;
#endif
#ifdef ND6_IFF_IFDISABLED
- if (del_if_nd6_flag(ifname, ND6_IFF_IFDISABLED) == -1) {
+ if (del_if_nd6_flag(ifp->name, ND6_IFF_IFDISABLED) == -1) {
syslog(LOG_ERR,
"%s: del_if_nd6_flag: ND6_IFF_IFDISABLED: %m",
ifname);
#endif
#ifdef ND6_IFF_PERFORMNUD
- if (set_if_nd6_flag(ifname, ND6_IFF_PERFORMNUD) == -1) {
+ if (set_if_nd6_flag(ifp->name, ND6_IFF_PERFORMNUD) == -1) {
syslog(LOG_ERR,
"%s: set_if_nd6_flag: ND6_IFF_PERFORMNUD: %m",
ifname);
if (own) {
int all;
- all = get_if_nd6_flag(ifname, ND6_IFF_AUTO_LINKLOCAL);
+ all = get_if_nd6_flag(ifp->name,ND6_IFF_AUTO_LINKLOCAL);
if (all == -1)
syslog(LOG_ERR,
"%s: get_if_nd6_flag: "
"ND6_IFF_AUTO_LINKLOCAL: %m",
- ifname);
+ ifp->name);
else if (all != 0) {
syslog(LOG_DEBUG,
"%s: disabling Kernel IPv6 "
"auto link-local support",
- ifname);
- if (del_if_nd6_flag(ifname,
+ ifp->name);
+ if (del_if_nd6_flag(ifp->name,
ND6_IFF_AUTO_LINKLOCAL) == -1)
{
syslog(LOG_ERR,
"%s: del_if_nd6_flag: "
"ND6_IFF_AUTO_LINKLOCAL: %m",
- ifname);
+ ifp->name);
return -1;
}
}
#endif
#ifdef ND6_IFF_OVERRIDE_RTADV
- override = get_if_nd6_flag(ifname, ND6_IFF_OVERRIDE_RTADV);
+ override = get_if_nd6_flag(ifp->name, ND6_IFF_OVERRIDE_RTADV);
if (override == -1)
syslog(LOG_ERR,
"%s: get_if_nd6_flag: ND6_IFF_OVERRIDE_RTADV: %m",
- ifname);
+ ifp->name);
else if (override == 0 && !own)
return 0;
#endif
#ifdef ND6_IFF_ACCEPT_RTADV
- ra = get_if_nd6_flag(ifname, ND6_IFF_ACCEPT_RTADV);
+ ra = get_if_nd6_flag(ifp->name, ND6_IFF_ACCEPT_RTADV);
if (ra == -1)
syslog(LOG_ERR,
"%s: get_if_nd6_flag: ND6_IFF_ACCEPT_RTADV: %m",
- ifname);
+ ifp->name);
else if (ra != 0 && own) {
syslog(LOG_DEBUG,
"%s: disabling Kernel IPv6 RA support",
- ifname);
- if (del_if_nd6_flag(ifname, ND6_IFF_ACCEPT_RTADV)
+ ifp->name);
+ if (del_if_nd6_flag(ifp->name, ND6_IFF_ACCEPT_RTADV)
== -1)
{
syslog(LOG_ERR,
"%s: del_if_nd6_flag: "
"ND6_IFF_ACCEPT_RTADV: %m",
- ifname);
+ ifp->name);
return ra;
}
#ifdef ND6_IFF_OVERRIDE_RTADV
if (override == 0 &&
- set_if_nd6_flag(ifname, ND6_IFF_OVERRIDE_RTADV)
+ set_if_nd6_flag(ifp->name, ND6_IFF_OVERRIDE_RTADV)
== -1)
{
syslog(LOG_ERR,
"%s: set_if_nd6_flag: "
"ND6_IFF_OVERRIDE_RTADV: %m",
- ifname);
+ ifp->name);
return ra;
}
#endif
struct nlmsghdr *nlm)
{
size_t len;
- unsigned int idx, metric;
+ unsigned int metric;
struct rtattr *rta;
struct rtmsg *rtm;
struct rt rt;
sizeof(rt.gate.s_addr));
break;
case RTA_OIF:
- idx = *(unsigned int *)RTA_DATA(rta);
- if (if_indextoname(idx, ifn))
- rt.iface = if_find(ctx, ifn);
+ rt.iface = if_findindex(ctx,
+ *(unsigned int *)RTA_DATA(rta));
break;
case RTA_PRIORITY:
metric = *(unsigned int *)RTA_DATA(rta);
return -1;
}
ifa = NLMSG_DATA(nlm);
- if (if_indextoname(ifa->ifa_index, ifn) == NULL)
- return -1;
- iface = if_find(ctx, ifn);
- if (iface == NULL)
+ if (if_findindex(ctx, ifa->ifa_index) == NULL) {
+ /* We don't know about the interface the address is for
+ * so it's not really an error */
return 1;
+ }
rta = (struct rtattr *) IFA_RTA(ifa);
len = NLMSG_PAYLOAD(nlm, sizeof(*ifa));
switch (ifa->ifa_family) {
}
static int
-if_disable_autolinklocal(struct dhcpcd_ctx *ctx, const char *ifname)
+if_disable_autolinklocal(struct dhcpcd_ctx *ctx, int ifindex)
{
struct nlml nlm;
struct rtattr *afs, *afs6;
nlm.hdr.nlmsg_type = RTM_NEWLINK;
nlm.hdr.nlmsg_flags = NLM_F_REQUEST;
nlm.i.ifi_family = AF_INET6;
- nlm.i.ifi_index = (int)if_nametoindex(ifname);
+ nlm.i.ifi_index = ifindex;
afs = add_attr_nest(&nlm.hdr, sizeof(nlm), IFLA_AF_SPEC);
afs6 = add_attr_nest(&nlm.hdr, sizeof(nlm), AF_INET6);
add_attr_8(&nlm.hdr, sizeof(nlm), IFLA_INET6_ADDR_GEN_MODE,
static const char *prefix = "/proc/sys/net/ipv6/conf";
int
-if_checkipv6(struct dhcpcd_ctx *ctx, const char *ifname, int own)
+if_checkipv6(struct dhcpcd_ctx *ctx, const struct interface *ifp, int own)
{
+ const char *ifname;
int ra;
char path[256];
- if (ifname == NULL)
+ if (ifp == NULL)
ifname = "all";
else if (own) {
- if (if_disable_autolinklocal(ctx, ifname) == -1)
+ if (if_disable_autolinklocal(ctx, ifp->index) == -1)
syslog(LOG_DEBUG, "%s: if_disable_autolinklocal: %m",
ifname);
}
+ if (ifp)
+ ifname = ifp->name;
snprintf(path, sizeof(path), "%s/%s/autoconf", prefix, ifname);
ra = check_proc_int(path);