strncpy(ifr.ifr_name, dev->ifname, sizeof(ifr.ifr_name));
if (s->flags & DEV_OPT_MTU) {
ifr.ifr_mtu = s->mtu;
- ioctl(sock_ioctl, SIOCSIFMTU, &ifr);
+ if (ioctl(sock_ioctl, SIOCSIFMTU, &ifr) < 0)
+ s->flags &= ~DEV_OPT_MTU;
}
if (s->flags & DEV_OPT_TXQUEUELEN) {
ifr.ifr_qlen = s->txqueuelen;
- ioctl(sock_ioctl, SIOCSIFTXQLEN, &ifr);
+ if (ioctl(sock_ioctl, SIOCSIFTXQLEN, &ifr) < 0)
+ s->flags &= ~DEV_OPT_TXQUEUELEN;
}
if (s->flags & DEV_OPT_MACADDR) {
memcpy(&ifr.ifr_hwaddr, s->macaddr, sizeof(s->macaddr));
- ioctl(sock_ioctl, SIOCSIFHWADDR, &ifr);
+ if (ioctl(sock_ioctl, SIOCSIFHWADDR, &ifr) < 0)
+ s->flags &= ~DEV_OPT_MACADDR;
}
}
static int system_addr(struct device *dev, struct device_addr *addr, int cmd)
{
- int alen = ((addr->flags & DEVADDR_FAMILY) == DEVADDR_INET4) ? 4 : 16;
+ bool v4 = ((addr->flags & DEVADDR_FAMILY) == DEVADDR_INET4);
+ int alen = v4 ? 4 : 16;
struct ifaddrmsg ifa = {
.ifa_family = (alen == 4) ? AF_INET : AF_INET6,
.ifa_prefixlen = addr->mask,
struct nl_msg *msg;
- dev = addr->device;
- if (dev) {
- if (!dev->ifindex)
- return -1;
-
- ifa.ifa_index = dev->ifindex;
- }
-
msg = nlmsg_alloc_simple(cmd, 0);
if (!msg)
return -1;
nlmsg_append(msg, &ifa, sizeof(ifa), 0);
nla_put(msg, IFA_LOCAL, alen, &addr->addr);
+ if (v4)
+ nla_put_u32(msg, IFA_BROADCAST, addr->broadcast);
+
return system_rtnl_call(msg);
}
if (cmd == RTM_NEWROUTE)
flags |= NLM_F_CREATE | NLM_F_REPLACE;
- dev = route->device;
- if (dev) {
- if (!dev->ifindex)
- return -1;
-
- ifindex = dev->ifindex;
- }
-
msg = nlmsg_alloc_simple(cmd, flags);
if (!msg)
return -1;
if (route->mask)
nla_put(msg, RTA_DST, alen, &route->addr);
+ if (route->metric >= 0)
+ nla_put_u32(msg, RTA_PRIORITY, route->metric);
+
if (have_gw)
nla_put(msg, RTA_GATEWAY, alen, &route->nexthop);