static char dev_buf[256];
+static bool iprules_flushed = false;
+
static void
handler_nl_event(struct uloop_fd *u, unsigned int events)
{
int system_add_iprule(struct iprule *rule)
{
+ /* trigger flush of existing rules when adding first rule the first time */
+ if (!iprules_flushed)
+ {
+ system_flush_iprules();
+ iprules_flushed = true;
+ }
+
return system_iprule(rule, RTM_NEWRULE);
}
return -EINVAL;
unsigned int link = 0;
- if ((cur = tb[TUNNEL_ATTR_LINK]) &&
- !(link = if_nametoindex((const char*)blobmsg_data(cur))))
- return -EINVAL;
+ if ((cur = tb[TUNNEL_ATTR_LINK])) {
+ struct interface *iface = vlist_find(&interfaces, blobmsg_data(cur), iface, node);
+ if (!iface)
+ return -EINVAL;
+
+ if (iface->l3_dev.dev)
+ link = iface->l3_dev.dev->ifindex;
+ }
if (!strcmp(str, "sit")) {