git: 26056fa8d348 - main - Revert "ifconfig: switch IPv4/IPv6 address manipulations to Netlink"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 22 May 2023 15:19:16 UTC
The branch main has been updated by melifaro: URL: https://cgit.FreeBSD.org/src/commit/?id=26056fa8d348b8ec03b4b2d0c9d086c4232f2711 commit 26056fa8d348b8ec03b4b2d0c9d086c4232f2711 Author: Alexander V. Chernikov <melifaro@FreeBSD.org> AuthorDate: 2023-05-22 15:17:57 +0000 Commit: Alexander V. Chernikov <melifaro@FreeBSD.org> CommitDate: 2023-05-22 15:17:57 +0000 Revert "ifconfig: switch IPv4/IPv6 address manipulations to Netlink" Revert the change as 2 non-expected issues have been reported. This reverts commit 54418f79fd292e14abf121f87a3c790a17447971. --- sbin/ifconfig/af_inet.c | 184 ++------------------------------------- sbin/ifconfig/af_inet6.c | 152 +------------------------------- sbin/ifconfig/af_link.c | 3 - sbin/ifconfig/ifconfig.c | 102 ++++++---------------- sbin/ifconfig/ifconfig.h | 22 ++--- sbin/ifconfig/ifconfig_netlink.c | 46 +--------- 6 files changed, 45 insertions(+), 464 deletions(-) diff --git a/sbin/ifconfig/af_inet.c b/sbin/ifconfig/af_inet.c index ab2b01320d04..cb030dbc711b 100644 --- a/sbin/ifconfig/af_inet.c +++ b/sbin/ifconfig/af_inet.c @@ -55,26 +55,8 @@ static const char rcsid[] = #include "ifconfig.h" #include "ifconfig_netlink.h" -#ifdef WITHOUT_NETLINK static struct in_aliasreq in_addreq; static struct ifreq in_ridreq; -#else -struct in_px { - struct in_addr addr; - int plen; - bool addrset; - bool maskset; -}; -struct in_pdata { - struct in_px addr; - struct in_px dst_addr; - struct in_px brd_addr; - uint32_t flags; - uint32_t vhid; -}; -static struct in_pdata in_add, in_del; -#endif - static char addr_buf[NI_MAXHOST]; /*for getnameinfo()*/ extern char *f_inet, *f_addr; @@ -200,8 +182,6 @@ in_status_nl(struct ifconfig_args *args __unused, struct io_handler *h, } #endif - -#ifdef WITHOUT_NETLINK #define SIN(x) ((struct sockaddr_in *) &(x)) static struct sockaddr_in *sintab[] = { SIN(in_ridreq.ifr_addr), SIN(in_addreq.ifra_addr), @@ -253,156 +233,14 @@ in_getaddr(const char *s, int which) errx(1, "%s: bad value", s); } -#else - -static struct in_px *sintab_nl[] = { - &in_del.addr, /* RIDADDR */ - &in_add.addr, /* ADDR */ - NULL, /* MASK */ - &in_add.dst_addr, /* DSTADDR*/ - &in_add.brd_addr, /* BRDADDR*/ -}; - -static void -in_getip(const char *addr_str, struct in_addr *ip) -{ - struct hostent *hp; - struct netent *np; - - if (inet_aton(addr_str, ip)) - return; - if ((hp = gethostbyname(addr_str)) != NULL) - bcopy(hp->h_addr, (char *)ip, - MIN((size_t)hp->h_length, sizeof(ip))); - else if ((np = getnetbyname(addr_str)) != NULL) - *ip = inet_makeaddr(np->n_net, INADDR_ANY); - else - errx(1, "%s: bad value", addr_str); -} - -static void -in_getaddr(const char *s, int which) -{ - struct in_px *px = sintab_nl[which]; - - if (which == MASK) { - struct in_px *px_addr = sintab_nl[ADDR]; - struct in_addr mask = {}; - - in_getip(s, &mask); - px_addr->plen = __bitcount32(mask.s_addr); - px_addr->maskset = true; - return; - } - - if (which == ADDR) { - char *p = NULL; - - if((p = strrchr(s, '/')) != NULL) { - const char *errstr; - /* address is `name/masklen' */ - int masklen; - *p = '\0'; - if (!isdigit(*(p + 1))) - errstr = "invalid"; - else - masklen = (int)strtonum(p + 1, 0, 32, &errstr); - if (errstr != NULL) { - *p = '/'; - errx(1, "%s: bad value (width %s)", s, errstr); - } - px->plen = masklen; - px->maskset = true; - } - } - - in_getip(s, &px->addr); - px->addrset = true; -} - - -static int -in_exec_nl(struct io_handler *h, int action, void *data) -{ - struct in_pdata *pdata = (struct in_pdata *)data; - struct snl_writer nw = {}; - - snl_init_writer(h->ss, &nw); - struct nlmsghdr *hdr = snl_create_msg_request(&nw, action); - struct ifaddrmsg *ifahdr = snl_reserve_msg_object(&nw, struct ifaddrmsg); - - ifahdr->ifa_family = AF_INET; - ifahdr->ifa_prefixlen = pdata->addr.plen; - ifahdr->ifa_index = if_nametoindex_nl(h->ss, name); - - snl_add_msg_attr_ip4(&nw, IFA_LOCAL, &pdata->addr.addr); - if (action == NL_RTM_NEWADDR && pdata->dst_addr.addrset) - snl_add_msg_attr_ip4(&nw, IFA_ADDRESS, &pdata->dst_addr.addr); - if (action == NL_RTM_NEWADDR && pdata->brd_addr.addrset) - snl_add_msg_attr_ip4(&nw, IFA_BROADCAST, &pdata->brd_addr.addr); - - int off = snl_add_msg_attr_nested(&nw, IFA_FREEBSD); - snl_add_msg_attr_u32(&nw, IFAF_FLAGS, pdata->flags); - if (pdata->vhid != 0) - snl_add_msg_attr_u32(&nw, IFAF_VHID, pdata->vhid); - snl_end_attr_nested(&nw, off); - - if (!snl_finalize_msg(&nw) || !snl_send_message(h->ss, hdr)) - return (0); - - struct snl_errmsg_data e = {}; - snl_read_reply_code(h->ss, hdr->nlmsg_seq, &e); - if (e.error_str != NULL) - warnx("%s(): %s", __func__, e.error_str); - - return (e.error); -} - -static void -in_setdefaultmask_nl(void) -{ - struct in_px *px = sintab_nl[ADDR]; - - in_addr_t i = ntohl(px->addr.s_addr); - - /* - * If netmask isn't supplied, use historical default. - * This is deprecated for interfaces other than loopback - * or point-to-point; warn in other cases. In the future - * we should return an error rather than warning. - */ - if (IN_CLASSA(i)) - px->plen = IN_CLASSA_NSHIFT; - else if (IN_CLASSB(i)) - px->plen = IN_CLASSB_NSHIFT; - else - px->plen = IN_CLASSC_NSHIFT; - px->maskset = true; -} -#endif - -static void -warn_nomask(ifflags) -{ - if ((ifflags & (IFF_POINTOPOINT | IFF_LOOPBACK)) == 0) { - warnx("WARNING: setting interface address without mask " - "is deprecated,\ndefault mask may not be correct."); - } -} - static void in_postproc(int s, const struct afswtch *afp, int newaddr, int ifflags) { -#ifdef WITHOUT_NETLINK - if (sintab[ADDR]->sin_len != 0 && sintab[MASK]->sin_len == 0 && newaddr) { - warn_nomask(ifflags); - } -#else - if (sintab_nl[ADDR]->addrset && !sintab_nl[ADDR]->maskset && newaddr) { - warn_nomask(ifflags); - in_setdefaultmask_nl(); + if (sintab[ADDR]->sin_len != 0 && sintab[MASK]->sin_len == 0 && + newaddr && (ifflags & (IFF_POINTOPOINT | IFF_LOOPBACK)) == 0) { + warnx("WARNING: setting interface address without mask " + "is deprecated,\ndefault mask may not be correct."); } -#endif } static void @@ -450,13 +288,10 @@ in_set_tunnel(int s, struct addrinfo *srcres, struct addrinfo *dstres) static void in_set_vhid(int vhid) { -#ifdef WITHOUT_NETLINK in_addreq.ifra_vhid = vhid; -#else - in_add.vhid = (uint32_t)vhid; -#endif } + static struct afswtch af_inet = { .af_name = "inet", .af_af = AF_INET, @@ -470,19 +305,10 @@ static struct afswtch af_inet = { .af_status_tunnel = in_status_tunnel, .af_settunnel = in_set_tunnel, .af_setvhid = in_set_vhid, -#ifdef WITHOUT_NETLINK .af_difaddr = SIOCDIFADDR, .af_aifaddr = SIOCAIFADDR, .af_ridreq = &in_ridreq, .af_addreq = &in_addreq, - .af_exec = af_exec_ioctl, -#else - .af_difaddr = NL_RTM_DELADDR, - .af_aifaddr = NL_RTM_NEWADDR, - .af_ridreq = &in_del, - .af_addreq = &in_add, - .af_exec = in_exec_nl, -#endif }; static __constructor void diff --git a/sbin/ifconfig/af_inet6.c b/sbin/ifconfig/af_inet6.c index c932087b4d86..1bb08c8a6a5a 100644 --- a/sbin/ifconfig/af_inet6.c +++ b/sbin/ifconfig/af_inet6.c @@ -59,30 +59,10 @@ static const char rcsid[] = #include "ifconfig.h" #include "ifconfig_netlink.h" -#ifndef WITHOUT_NETLINK -struct in6_px { - struct in6_addr addr; - int plen; - bool set; -}; -struct in6_pdata { - struct in6_px addr; - struct in6_px dst_addr; - struct in6_addrlifetime lifetime; - uint32_t flags; - uint32_t vhid; -}; - -static struct in6_pdata in6_del; -static struct in6_pdata in6_add = { - .lifetime = { 0, 0, ND6_INFINITE_LIFETIME, ND6_INFINITE_LIFETIME }, -}; -#else static struct in6_ifreq in6_ridreq; static struct in6_aliasreq in6_addreq = { .ifra_flags = 0, .ifra_lifetime = { 0, 0, ND6_INFINITE_LIFETIME, ND6_INFINITE_LIFETIME } }; -#endif static int ip6lifetime; static int prefix(void *, int); @@ -100,16 +80,8 @@ static void setifprefixlen(const char *addr, int dummy __unused, int s, const struct afswtch *afp) { -#ifdef WITHOUT_NETLINK if (afp->af_getprefix != NULL) afp->af_getprefix(addr, MASK); -#else - int plen = strtol(addr, NULL, 10); - - if ((plen < 0) || (plen > 128)) - errx(1, "%s: bad value", addr); - in6_add.addr.plen = plen; -#endif explicit_prefix = 1; } @@ -120,17 +92,10 @@ setip6flags(const char *dummyaddr __unused, int flag, int dummysoc __unused, if (afp->af_af != AF_INET6) err(1, "address flags can be set only for inet6 addresses"); -#ifdef WITHOUT_NETLINK if (flag < 0) in6_addreq.ifra_flags &= ~(-flag); else in6_addreq.ifra_flags |= flag; -#else - if (flag < 0) - in6_add.flags &= ~(-flag); - else - in6_add.flags |= flag; -#endif } static void @@ -140,11 +105,6 @@ setip6lifetime(const char *cmd, const char *val, int s, struct timespec now; time_t newval; char *ep; -#ifdef WITHOUT_NETLINK - struct in6_addrlifetime *lifetime = &in6_addreq.ifra_lifetime; -#else - struct in6_addrlifetime *lifetime = &in6_add.lifetime; -#endif clock_gettime(CLOCK_MONOTONIC_FAST, &now); newval = (time_t)strtoul(val, &ep, 0); @@ -153,11 +113,11 @@ setip6lifetime(const char *cmd, const char *val, int s, if (afp->af_af != AF_INET6) errx(1, "%s not allowed for the AF", cmd); if (strcmp(cmd, "vltime") == 0) { - lifetime->ia6t_expire = now.tv_sec + newval; - lifetime->ia6t_vltime = newval; + in6_addreq.ifra_lifetime.ia6t_expire = now.tv_sec + newval; + in6_addreq.ifra_lifetime.ia6t_vltime = newval; } else if (strcmp(cmd, "pltime") == 0) { - lifetime->ia6t_preferred = now.tv_sec + newval; - lifetime->ia6t_pltime = newval; + in6_addreq.ifra_lifetime.ia6t_preferred = now.tv_sec + newval; + in6_addreq.ifra_lifetime.ia6t_pltime = newval; } } @@ -186,11 +146,7 @@ setip6eui64(const char *cmd, int dummy __unused, int s, if (afp->af_af != AF_INET6) errx(EXIT_FAILURE, "%s not allowed for the AF", cmd); -#ifdef WITHOUT_NETLINK in6 = (struct in6_addr *)&in6_addreq.ifra_addr.sin6_addr; -#else - in6 = &in6_add.addr.addr; -#endif if (memcmp(&in6addr_any.s6_addr[8], &in6->s6_addr[8], 8) != 0) errx(EXIT_FAILURE, "interface index is already filled"); if (getifaddrs(&ifap) != 0) @@ -418,92 +374,8 @@ in6_status_nl(struct ifconfig_args *args __unused, struct io_handler *h, putchar('\n'); } - -static struct in6_px *sin6tab_nl[] = { - &in6_del.addr, /* RIDADDR */ - &in6_add.addr, /* ADDR */ - NULL, /* MASK */ - &in6_add.dst_addr, /* DSTADDR*/ -}; - -static void -in6_getaddr(const char *addr_str, int which) -{ - struct in6_px *px = sin6tab_nl[which]; - - newaddr &= 1; - - px->set = true; - px->plen = 128; - if (which == ADDR) { - char *p = NULL; - if((p = strrchr(addr_str, '/')) != NULL) { - *p = '\0'; - int plen = strtol(p + 1, NULL, 10); - if (plen < 0 || plen > 128) - errx(1, "%s: bad value", p + 1); - px->plen = plen; - explicit_prefix = 1; - } - } - - struct addrinfo hints = { .ai_family = AF_INET6 }; - struct addrinfo *res; - - int error = getaddrinfo(addr_str, NULL, &hints, &res); - if (error != 0) { - if (inet_pton(AF_INET6, addr_str, &px->addr) != 1) - errx(1, "%s: bad value", addr_str); - } else { - struct sockaddr_in6 *sin6; - - sin6 = (struct sockaddr_in6 *)(void *)res->ai_addr; - px->addr = sin6->sin6_addr; - freeaddrinfo(res); - } -} - -static int -in6_exec_nl(struct io_handler *h, int action, void *data) -{ - struct in6_pdata *pdata = (struct in6_pdata *)data; - struct snl_writer nw = {}; - - snl_init_writer(h->ss, &nw); - struct nlmsghdr *hdr = snl_create_msg_request(&nw, action); - struct ifaddrmsg *ifahdr = snl_reserve_msg_object(&nw, struct ifaddrmsg); - - ifahdr->ifa_family = AF_INET6; - ifahdr->ifa_prefixlen = pdata->addr.plen; - ifahdr->ifa_index = if_nametoindex_nl(h->ss, name); - - snl_add_msg_attr_ip6(&nw, IFA_LOCAL, &pdata->addr.addr); - if (action == NL_RTM_NEWADDR && pdata->dst_addr.set) - snl_add_msg_attr_ip6(&nw, IFA_ADDRESS, &pdata->dst_addr.addr); - - struct ifa_cacheinfo ci = { - .ifa_prefered = pdata->lifetime.ia6t_pltime, - .ifa_valid = pdata->lifetime.ia6t_vltime, - }; - snl_add_msg_attr(&nw, IFA_CACHEINFO, sizeof(ci), &ci); - - int off = snl_add_msg_attr_nested(&nw, IFA_FREEBSD); - snl_add_msg_attr_u32(&nw, IFAF_FLAGS, pdata->flags); - if (pdata->vhid != 0) - snl_add_msg_attr_u32(&nw, IFAF_VHID, pdata->vhid); - snl_end_attr_nested(&nw, off); - - if (!snl_finalize_msg(&nw) || !snl_send_message(h->ss, hdr)) - return (0); - - struct snl_errmsg_data e = {}; - snl_read_reply_code(h->ss, hdr->nlmsg_seq, &e); - - return (e.error); -} #endif -#ifdef WITHOUT_NETLINK #define SIN6(x) ((struct sockaddr_in6 *) &(x)) static struct sockaddr_in6 *sin6tab[] = { SIN6(in6_ridreq.ifr_addr), SIN6(in6_addreq.ifra_addr), @@ -591,7 +463,6 @@ prefix(void *val, int size) return(0); return (plen); } -#endif static char * sec2str(time_t total) @@ -687,11 +558,7 @@ in6_set_tunnel(int s, struct addrinfo *srcres, struct addrinfo *dstres) static void in6_set_vhid(int vhid) { -#ifdef WITHOUT_NETLINK in6_addreq.ifra_vhid = vhid; -#else - in6_add.vhid = (uint32_t)vhid; -#endif } static struct cmd inet6_cmds[] = { @@ -739,27 +606,16 @@ static struct afswtch af_inet6 = { .af_status_nl = in6_status_nl, #endif .af_getaddr = in6_getaddr, -#ifdef WITHOUT_NETLINK .af_getprefix = in6_getprefix, -#endif .af_other_status = nd6_status, .af_postproc = in6_postproc, .af_status_tunnel = in6_status_tunnel, .af_settunnel = in6_set_tunnel, .af_setvhid = in6_set_vhid, -#ifdef WITHOUT_NETLINK .af_difaddr = SIOCDIFADDR_IN6, .af_aifaddr = SIOCAIFADDR_IN6, .af_ridreq = &in6_addreq, .af_addreq = &in6_addreq, - .af_exec = af_exec_ioctl, -#else - .af_difaddr = NL_RTM_DELADDR, - .af_aifaddr = NL_RTM_NEWADDR, - .af_ridreq = &in6_add, - .af_addreq = &in6_add, - .af_exec = in6_exec_nl, -#endif }; static void diff --git a/sbin/ifconfig/af_link.c b/sbin/ifconfig/af_link.c index 0d1f5b1f6147..52295453b4f0 100644 --- a/sbin/ifconfig/af_link.c +++ b/sbin/ifconfig/af_link.c @@ -229,7 +229,6 @@ static struct afswtch af_link = { .af_getaddr = link_getaddr, .af_aifaddr = SIOCSIFLLADDR, .af_addreq = &link_ridreq, - .af_exec = af_exec_ioctl, }; static struct afswtch af_ether = { .af_name = "ether", @@ -242,7 +241,6 @@ static struct afswtch af_ether = { .af_getaddr = link_getaddr, .af_aifaddr = SIOCSIFLLADDR, .af_addreq = &link_ridreq, - .af_exec = af_exec_ioctl, }; static struct afswtch af_lladdr = { .af_name = "lladdr", @@ -255,7 +253,6 @@ static struct afswtch af_lladdr = { .af_getaddr = link_getaddr, .af_aifaddr = SIOCSIFLLADDR, .af_addreq = &link_ridreq, - .af_exec = af_exec_ioctl, }; static __constructor void diff --git a/sbin/ifconfig/ifconfig.c b/sbin/ifconfig/ifconfig.c index 3b63eac5574a..c5e7b7befc72 100644 --- a/sbin/ifconfig/ifconfig.c +++ b/sbin/ifconfig/ifconfig.c @@ -112,7 +112,6 @@ static void list_interfaces_ioctl(struct ifconfig_args *args); static void status(struct ifconfig_args *args, const struct sockaddr_dl *sdl, struct ifaddrs *ifa); static _Noreturn void usage(void); -static void Perrorc(const char *cmd, int error); static int getifflags(const char *ifname, int us, bool err_ok); @@ -542,30 +541,6 @@ args_parse(struct ifconfig_args *args, int argc, char *argv[]) verbose = args->verbose; } -static int -ifconfig_wrapper(struct ifconfig_args *args, int iscreate, - const struct afswtch *uafp) -{ -#ifdef WITHOUT_NETLINK - struct io_handler h = {}; - return (ifconfig(args, &h, iscreate, uafp)); -#else - return (ifconfig_wrapper_nl(args, iscreate, uafp)); -#endif -} - -static bool -isargcreate(const char *arg) -{ - if (arg == NULL) - return (false); - - if (strcmp(arg, "create") == 0 || strcmp(arg, "plumb") == 0) - return (true); - - return (false); -} - int main(int ac, char *av[]) { @@ -605,12 +580,13 @@ main(int ac, char *av[]) * right here as we would otherwise fail when trying * to find the interface. */ - if (isargcreate(arg)) { + if (arg != NULL && (strcmp(arg, "create") == 0 || + strcmp(arg, "plumb") == 0)) { iflen = strlcpy(name, args.ifname, sizeof(name)); if (iflen >= sizeof(name)) errx(1, "%s: cloning name too long", args.ifname); - ifconfig_wrapper(&args, 1, NULL); + ifconfig(args.argc, args.argv, 1, NULL); exit(exit_code); } #ifdef JAIL @@ -624,7 +600,7 @@ main(int ac, char *av[]) if (iflen >= sizeof(name)) errx(1, "%s: interface name too long", args.ifname); - ifconfig_wrapper(&args, 0, NULL); + ifconfig(args.argc, args.argv, 0, NULL); exit(exit_code); } #endif @@ -634,7 +610,8 @@ main(int ac, char *av[]) * Do not allow use `create` command as hostname if * address family is not specified. */ - if (isargcreate(arg)) { + if (arg != NULL && (strcmp(arg, "create") == 0 || + strcmp(arg, "plumb") == 0)) { if (args.argc == 1) errx(1, "interface %s already exists", args.ifname); @@ -664,7 +641,7 @@ main(int ac, char *av[]) if (!(((flags & IFF_CANTCONFIG) != 0) || (args.downonly && (flags & IFF_UP) != 0) || (args.uponly && (flags & IFF_UP) == 0))) - ifconfig_wrapper(&args, 0, args.afp); + ifconfig(args.argc, args.argv, 0, args.afp); } goto done; } @@ -792,7 +769,7 @@ list_interfaces_ioctl(struct ifconfig_args *args) ifindex++; if (args->argc > 0) - ifconfig_wrapper(args, 0, args->afp); + ifconfig(args->argc, args->argv, 0, args->afp); else status(args, sdl, ifa); } @@ -991,42 +968,31 @@ static void setifdstaddr(const char *, int, int, const struct afswtch *); static const struct cmd setifdstaddr_cmd = DEF_CMD("ifdstaddr", 0, setifdstaddr); -int -af_exec_ioctl(struct io_handler *h, int action, void *data) -{ - struct ifreq *req = (struct ifreq *)data; - - strlcpy(req->ifr_name, name, sizeof(req->ifr_name)); - if (ioctl(h->s, action, req) == 0) - return (0); - return (errno); -} - static void -delifaddr(struct io_handler *h, const struct afswtch *afp) +delifaddr(int s, const struct afswtch *afp) { - int error; - - if (afp->af_exec == NULL) { + if (afp->af_ridreq == NULL || afp->af_difaddr == 0) { warnx("interface %s cannot change %s addresses!", name, afp->af_name); clearaddr = 0; return; } - afp->af_exec(h, afp->af_difaddr, afp->af_ridreq); - if (error != 0) { - if (error == EADDRNOTAVAIL && (doalias >= 0)) { + strlcpy(((struct ifreq *)afp->af_ridreq)->ifr_name, name, + sizeof ifr.ifr_name); + int ret = ioctl(s, afp->af_difaddr, afp->af_ridreq); + if (ret < 0) { + if (errno == EADDRNOTAVAIL && (doalias >= 0)) { /* means no previous address for interface */ } else - Perrorc("ioctl (SIOCDIFADDR)", error); + Perror("ioctl (SIOCDIFADDR)"); } } static void -addifaddr(struct io_handler *h, const struct afswtch *afp) +addifaddr(int s, const struct afswtch *afp) { - if (afp->af_exec == NULL) { + if (afp->af_addreq == NULL || afp->af_aifaddr == 0) { warnx("interface %s cannot change %s addresses!", name, afp->af_name); newaddr = 0; @@ -1034,24 +1000,21 @@ addifaddr(struct io_handler *h, const struct afswtch *afp) } if (setaddr || setmask) { - int error = afp->af_exec(h, afp->af_aifaddr, afp->af_addreq); - if (error != 0) - Perrorc("ioctl (SIOCAIFADDR)", error); + strlcpy(((struct ifreq *)afp->af_addreq)->ifr_name, name, + sizeof ifr.ifr_name); + if (ioctl(s, afp->af_aifaddr, afp->af_addreq) < 0) + Perror("ioctl (SIOCAIFADDR)"); } } int -ifconfig(struct ifconfig_args *args, struct io_handler *h, int iscreate, - const struct afswtch *uafp) +ifconfig(int argc, char *const *argv, int iscreate, const struct afswtch *uafp) { const struct afswtch *afp, *nafp; const struct cmd *p; struct callback *cb; int s; - int argc = args->argc; - char *const *argv = args->argv; - strlcpy(ifr.ifr_name, name, sizeof ifr.ifr_name); afp = NULL; if (uafp != NULL) @@ -1164,11 +1127,10 @@ top: /* * Do deferred operations. */ - h->s = s; if (clearaddr) - delifaddr(h, afp); + delifaddr(s, afp); if (newaddr) - addifaddr(h, afp); + addifaddr(s, afp); close(s); return(0); @@ -1275,7 +1237,7 @@ setifbroadaddr(const char *addr, int dummy __unused, int s, const struct afswtch *afp) { if (afp->af_getaddr != NULL) - afp->af_getaddr(addr, BRDADDR); + afp->af_getaddr(addr, DSTADDR); } static void @@ -1751,8 +1713,8 @@ tunnel_status(int s) af_all_tunnel_status(s); } -static void -Perrorc(const char *cmd, int error) +void +Perror(const char *cmd) { switch (errno) { @@ -1765,16 +1727,10 @@ Perrorc(const char *cmd, int error) break; default: - errc(1, error, "%s", cmd); + err(1, "%s", cmd); } } -void -Perror(const char *cmd) -{ - Perrorc(cmd, errno); -} - /* * Print a value a la the %b format of the kernel's printf */ diff --git a/sbin/ifconfig/ifconfig.h b/sbin/ifconfig/ifconfig.h index 9d37a6e75eba..7b2b88a4dfac 100644 --- a/sbin/ifconfig/ifconfig.h +++ b/sbin/ifconfig/ifconfig.h @@ -144,15 +144,10 @@ struct ifaddrs; struct addrinfo; enum { - RIDADDR = 0, - ADDR = 1, - MASK = 2, - DSTADDR = 3, -#ifdef WITHOUT_NETLINK - BRDADDR = 3, -#else - BRDADDR = 4, -#endif + RIDADDR, + ADDR, + MASK, + DSTADDR, }; struct snl_state; @@ -169,7 +164,6 @@ struct io_handler { typedef void af_setvhid_f(int vhid); typedef void af_status_nl_f(struct ifconfig_args *args, struct io_handler *h, if_link_t *link, if_addr_t *ifa); -typedef int af_exec_f(struct io_handler *h, int action, void *data); struct afswtch { const char *af_name; /* as given on cmd line, e.g. "inet" */ @@ -196,7 +190,6 @@ struct afswtch { void (*af_postproc)(int s, const struct afswtch *, int newaddr, int ifflags); af_setvhid_f *af_setvhid; /* Set CARP vhid for an address */ - af_exec_f *af_exec; /* Handler to interact with kernel */ u_long af_difaddr; /* set dst if address ioctl */ u_long af_aifaddr; /* set if address ioctl */ void *af_ridreq; /* */ @@ -209,7 +202,6 @@ struct afswtch { struct addrinfo *dstres); }; void af_register(struct afswtch *); -int af_exec_ioctl(struct io_handler *h, int action, void *data); struct ifconfig_args { bool all; /* Match everything */ @@ -267,8 +259,7 @@ void sfp_status(int s, struct ifreq *ifr, int verbose); struct sockaddr_dl; bool match_ether(const struct sockaddr_dl *sdl); bool match_if_flags(struct ifconfig_args *args, int if_flags); -int ifconfig(struct ifconfig_args *args, struct io_handler *h, - int iscreate, const struct afswtch *uafp); +int ifconfig(int argc, char *const *argv, int iscreate, const struct afswtch *uafp); bool group_member(const char *ifname, const char *match, const char *nomatch); void print_ifcap(struct ifconfig_args *args, int s); void tunnel_status(int s); @@ -279,9 +270,6 @@ void print_metric(int s); /* Netlink-related functions */ void list_interfaces_nl(struct ifconfig_args *args); -int ifconfig_wrapper_nl(struct ifconfig_args *args, int iscreate, - const struct afswtch *uafp); -uint32_t if_nametoindex_nl(struct snl_state *ss, const char *ifname); /* * XXX expose this so modules that neeed to know of any pending diff --git a/sbin/ifconfig/ifconfig_netlink.c b/sbin/ifconfig/ifconfig_netlink.c index 598444d0d029..26a42b5866c5 100644 --- a/sbin/ifconfig/ifconfig_netlink.c +++ b/sbin/ifconfig/ifconfig_netlink.c @@ -122,22 +122,6 @@ nl_init_socket(struct snl_state *ss) err(1, "unable to open netlink socket"); } -int -ifconfig_wrapper_nl(struct ifconfig_args *args, int iscreate, - const struct afswtch *uafp) -{ - struct snl_state ss = {}; - struct io_handler h = { .ss = &ss }; - - nl_init_socket(&ss); - - int error = ifconfig(args, &h, iscreate, uafp); - - snl_free(&ss); - - return (error); -} - struct ifa { struct ifa *next; uint32_t count; @@ -202,29 +186,6 @@ prepare_ifmap(struct snl_state *ss) return (ifmap); } -uint32_t -if_nametoindex_nl(struct snl_state *ss, const char *ifname) -{ - struct snl_writer nw = {}; - struct snl_parsed_link_simple link = {}; - - snl_init_writer(ss, &nw); - struct nlmsghdr *hdr = snl_create_msg_request(&nw, RTM_GETLINK); - snl_reserve_msg_object(&nw, struct ifinfomsg); - snl_add_msg_attr_string(&nw, IFLA_IFNAME, ifname); - - if (!snl_finalize_msg(&nw) || !snl_send_message(ss, hdr)) - return (0); - - hdr = snl_read_reply(ss, hdr->nlmsg_seq); - if (hdr->nlmsg_type != NL_RTM_NEWLINK) - return (0); - if (!snl_parse_nlmsg(ss, hdr, &snl_rtm_link_parser_simple, &link)) - return (0); - - return (link.ifi_index); -} - static void prepare_ifaddrs(struct snl_state *ss, struct ifmap *ifmap) { @@ -454,11 +415,8 @@ list_interfaces_nl(struct ifconfig_args *args) fputs(iface->link.ifla_ifname, stdout); } else if (args->argc == 0) status_nl(args, &h, iface); - else { - struct io_handler hh = { .s = -1, .ss = &ss }; - - ifconfig(args, &hh, 0, args->afp); - } + else + ifconfig(args->argc, args->argv, 0, args->afp); } if (args->namesonly) printf("\n");