X-Git-Url: http://git.archive.openwrt.org/?a=blobdiff_plain;f=system-linux.c;h=eb73e95d428e11e3952e824806bb6e3982a4ffca;hb=902f904ed395521f56e5bfce8f5693cb7fd3805d;hp=aaa8230bbc9fd89359ba9f7909a924d3c00dc63f;hpb=b0ef5945af9d68a435868546b4bf30020a6e6ab8;p=project%2Fnetifd.git diff --git a/system-linux.c b/system-linux.c index aaa8230..eb73e95 100644 --- a/system-linux.c +++ b/system-linux.c @@ -154,7 +154,7 @@ static void system_set_sysctl(const char *path, const char *val) static void system_set_dev_sysctl(const char *path, const char *device, const char *val) { - snprintf(dev_buf, sizeof(dev_buf), path, val); + snprintf(dev_buf, sizeof(dev_buf), path, device); system_set_sysctl(dev_buf, val); } @@ -235,6 +235,9 @@ found: if (dev->type != &simple_device_type) return; + if (add && system_if_force_external(dev->ifname)) + return; + device_set_present(dev, add); } @@ -275,6 +278,8 @@ int system_bridge_delbr(struct device *bridge) static int system_bridge_if(const char *bridge, struct device *dev, int cmd, void *data) { struct ifreq ifr; + + memset(&ifr, 0, sizeof(ifr)); if (dev) ifr.ifr_ifindex = dev->ifindex; else @@ -350,6 +355,8 @@ static int system_if_resolve(struct device *dev) static int system_if_flags(const char *ifname, unsigned add, unsigned rem) { struct ifreq ifr; + + memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); ioctl(sock_ioctl, SIOCGIFFLAGS, &ifr); ifr.ifr_flags |= add; @@ -375,8 +382,13 @@ static bool check_ifaddr(struct nlmsghdr *hdr, int ifindex) static bool check_route(struct nlmsghdr *hdr, int ifindex) { + struct rtmsg *r = NLMSG_DATA(hdr); struct nlattr *tb[__RTA_MAX]; + if (r->rtm_protocol == RTPROT_KERNEL && + r->rtm_family == AF_INET6) + return false; + nlmsg_parse(hdr, sizeof(struct rtmsg), tb, __RTA_MAX - 1, NULL); if (!tb[RTA_OIF]) return false; @@ -625,7 +637,7 @@ system_if_get_settings(struct device *dev, struct device_settings *s) } } -static void +void system_if_apply_settings(struct device *dev, struct device_settings *s) { struct ifreq ifr; @@ -642,7 +654,7 @@ system_if_apply_settings(struct device *dev, struct device_settings *s) if (ioctl(sock_ioctl, SIOCSIFTXQLEN, &ifr) < 0) s->flags &= ~DEV_OPT_TXQUEUELEN; } - if (s->flags & DEV_OPT_MACADDR) { + if ((s->flags & DEV_OPT_MACADDR) && !dev->external) { 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) @@ -909,7 +921,7 @@ static int system_rt(struct device *dev, struct device_route *route, int cmd) .rtm_family = (alen == 4) ? AF_INET : AF_INET6, .rtm_dst_len = route->mask, .rtm_table = RT_TABLE_MAIN, - .rtm_protocol = (route->flags & DEVADDR_KERNEL) ? RTPROT_KERNEL : RTPROT_BOOT, + .rtm_protocol = (route->flags & DEVADDR_KERNEL) ? RTPROT_KERNEL : RTPROT_STATIC, .rtm_scope = scope, .rtm_type = (cmd == RTM_DELROUTE) ? 0: RTN_UNICAST, }; @@ -1065,6 +1077,7 @@ int system_add_ip_tunnel(const char *name, struct blob_attr *attr) if (tunnel_ioctl(base, SIOCADDTUNNEL, &p) < 0) return -1; +#ifdef SIOCADD6RD cur = tb[TUNNEL_ATTR_6RD_PREFIX]; if (cur && is_sit) { unsigned int mask; @@ -1089,6 +1102,7 @@ int system_add_ip_tunnel(const char *name, struct blob_attr *attr) return -1; } } +#endif return 0; }