static void system_set_dev_sysctl(const char *path, const char *device, const char *val)
{
- char buf[256];
+ static char buf[256];
snprintf(buf, sizeof(buf), path, val);
system_set_sysctl(buf, val);
*/
void system_if_clear_state(struct device *dev)
{
- char buf[256];
+ static char buf[256];
char *bridge;
+ if (dev->external)
+ return;
+
dev->ifindex = system_if_resolve(dev);
if (!dev->ifindex)
return;
.ifa_index = dev->ifindex,
};
- struct nl_msg *msg = nlmsg_alloc_simple(cmd, 0);
+ 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;
int alen = ((route->flags & DEVADDR_FAMILY) == DEVADDR_INET4) ? 4 : 16;
bool have_gw;
unsigned int flags = 0;
+ int ifindex = dev->ifindex;
if (alen == 4)
have_gw = !!route->nexthop.in.s_addr;
.rtm_scope = scope,
.rtm_type = (cmd == RTM_DELROUTE) ? 0: RTN_UNICAST,
};
+ struct nl_msg *msg;
if (cmd == RTM_NEWROUTE)
flags |= NLM_F_CREATE | NLM_F_REPLACE;
- struct nl_msg *msg = nlmsg_alloc_simple(cmd, flags);
+ dev = route->device;
+ if (dev) {
+ if (!dev->ifindex)
+ return -1;
+
+ ifindex = dev->ifindex;
+ }
+
+ msg = nlmsg_alloc_simple(cmd, flags);
if (!msg)
return -1;
nla_put(msg, RTA_GATEWAY, alen, &route->nexthop);
if (route->flags & DEVADDR_DEVICE)
- nla_put_u32(msg, RTA_OIF, dev->ifindex);
+ nla_put_u32(msg, RTA_OIF, ifindex);
return system_rtnl_call(msg);
}