#include <linux/if_vlan.h>
#include <linux/if_bridge.h>
#include <linux/ethtool.h>
+#include <net/if_arp.h>
#include <unistd.h>
#include <string.h>
}
if (ioctl(sock_ioctl, SIOCGIFHWADDR, &ifr) == 0) {
- memcpy(s->macaddr, &ifr.ifr_hwaddr, sizeof(s->macaddr));
+ memcpy(s->macaddr, &ifr.ifr_hwaddr.sa_data, sizeof(s->macaddr));
s->flags |= DEV_OPT_MACADDR;
}
}
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);
+ ifr.ifr_hwaddr.sa_family = ARPHRD_ETHER;
+ memcpy(&ifr.ifr_hwaddr.sa_data, s->macaddr, sizeof(s->macaddr));
+ if (ioctl(sock_ioctl, SIOCSIFHWADDR, &ifr) < 0)
+ s->flags &= ~DEV_OPT_MACADDR;
}
}
int system_if_down(struct device *dev)
{
int ret = system_if_flags(dev->ifname, 0, IFF_UP);
+ dev->orig_settings.flags &= dev->settings.flags;
system_if_apply_settings(dev, &dev->orig_settings);
return ret;
}
if (read_int_file(dir_fd, "carrier", &val))
blobmsg_add_u8(b, "link", !!val);
- if (read_string_file(dir_fd, "address", buf, sizeof(buf)))
- blobmsg_add_string(b, "macaddr", buf);
memset(&ecmd, 0, sizeof(ecmd));
memset(&ifr, 0, sizeof(ifr));
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);