diff --git a/sys/net/if.c b/sys/net/if.c --- a/sys/net/if.c +++ b/sys/net/if.c @@ -4327,6 +4327,12 @@ return (ifp->if_idxgen); } +const char * +if_getdescr(if_t ifp) +{ + return (ifp->if_description); +} + void if_setdescr(if_t ifp, char *descrbuf) { @@ -4357,6 +4363,12 @@ return (ifp->if_alloctype); } +void +if_setlastchange(if_t ifp) +{ + getmicrotime(&ifp->if_lastchange); +} + /* * This is largely undesirable because it ties ifnet to a device, but does * provide flexiblity for an embedded product vendor. Should be used with @@ -4714,6 +4726,38 @@ return (count); } +struct ifaddr * +ifa_iter_start(if_t ifp, struct ifa_iter *iter) +{ + struct ifaddr *ifa; + + NET_EPOCH_ASSERT(); + + bzero(iter, sizeof(*iter)); + ifa = CK_STAILQ_FIRST(&ifp->if_addrhead); + if (ifa != NULL) + iter->context[0] = CK_STAILQ_NEXT(ifa, ifa_link); + else + iter->context[0] = NULL; + return (ifa); +} + +struct ifaddr * +ifa_iter_next(struct ifa_iter *iter) +{ + struct ifaddr *ifa = iter->context[0]; + + if (ifa != NULL) + iter->context[0] = CK_STAILQ_NEXT(ifa, ifa_link); + return (ifa); +} + +void +ifa_iter_finish(struct ifa_iter *iter) +{ + /* Nothing to do here for now. */ +} + int if_setsoftc(if_t ifp, void *softc) { @@ -4825,6 +4869,12 @@ return (ifp->if_resolvemulti(ifp, srcs, dst)); } +int +if_ioctl(if_t ifp, u_long cmd, void *data) +{ + return (ifp->if_ioctl(ifp, cmd, data)); +} + struct mbuf * if_dequeue(if_t ifp) { diff --git a/sys/net/if_var.h b/sys/net/if_var.h --- a/sys/net/if_var.h +++ b/sys/net/if_var.h @@ -573,9 +573,11 @@ const char *if_name(if_t ifp); int if_setname(if_t ifp, const char *name); int if_rename(if_t ifp, char *new_name); +const char *if_getdescr(if_t ifp); void if_setdescr(if_t ifp, char *descrbuf); char *if_allocdescr(size_t sz, int malloc_flag); void if_freedescr(char *descrbuf); +void if_setlastchange(if_t ifp); int if_getalloctype(const if_t ifp); int if_gettype(const if_t ifp); int if_setdev(if_t ifp, void *dev); @@ -633,6 +635,7 @@ void if_vlancap(if_t ifp); int if_transmit(if_t ifp, struct mbuf *m); void if_init(if_t ifp, void *ctx); +int if_ioctl(if_t ifp, u_long cmd, void *data); int if_resolvemulti(if_t ifp, struct sockaddr **, struct sockaddr *); uint64_t if_getcounter(if_t ifp, ift_counter counter); struct label *if_getmaclabel(if_t ifp); @@ -677,6 +680,14 @@ if_t if_iter_next(struct if_iter *); void if_iter_finish(struct if_iter *); +struct ifa_iter { + void *context[4]; +}; + +struct ifaddr *ifa_iter_start(if_t ifp, struct ifa_iter *iter); +struct ifaddr *ifa_iter_next(struct ifa_iter *iter); +void ifa_iter_finish(struct ifa_iter *iter); + /* Functions */ void if_setinitfn(if_t ifp, if_init_fn_t); void if_setinputfn(if_t ifp, if_input_fn_t); diff --git a/sys/netlink/route/iface.c b/sys/netlink/route/iface.c --- a/sys/netlink/route/iface.c +++ b/sys/netlink/route/iface.c @@ -120,11 +120,11 @@ }; static void -get_operstate_ether(struct ifnet *ifp, struct if_state *pstate) +get_operstate_ether(if_t ifp, struct if_state *pstate) { struct ifmediareq ifmr = {}; int error; - error = (*ifp->if_ioctl)(ifp, SIOCGIFMEDIA, (void *)&ifmr); + error = if_ioctl(ifp, SIOCGIFMEDIA, (void *)&ifmr); if (error != 0) { NL_LOG(LOG_DEBUG, "error calling SIOCGIFMEDIA on %s: %d", @@ -136,7 +136,7 @@ case IFM_ETHER: if (ifmr.ifm_status & IFM_ACTIVE) { pstate->ifla_carrier = 1; - if (ifp->if_flags & IFF_MONITOR) + if (if_getflags(ifp) & IFF_MONITOR) pstate->ifla_operstate = IF_OPER_DORMANT; else pstate->ifla_operstate = IF_OPER_UP; @@ -146,7 +146,7 @@ } static bool -get_stats(struct nl_writer *nw, struct ifnet *ifp) +get_stats(struct nl_writer *nw, if_t ifp) { struct rtnl_link_stats64 *stats; @@ -158,34 +158,34 @@ nla->nla_len = nla_len; stats = (struct rtnl_link_stats64 *)(nla + 1); - stats->rx_packets = ifp->if_get_counter(ifp, IFCOUNTER_IPACKETS); - stats->tx_packets = ifp->if_get_counter(ifp, IFCOUNTER_OPACKETS); - stats->rx_bytes = ifp->if_get_counter(ifp, IFCOUNTER_IBYTES); - stats->tx_bytes = ifp->if_get_counter(ifp, IFCOUNTER_OBYTES); - stats->rx_errors = ifp->if_get_counter(ifp, IFCOUNTER_IERRORS); - stats->tx_errors = ifp->if_get_counter(ifp, IFCOUNTER_OERRORS); - stats->rx_dropped = ifp->if_get_counter(ifp, IFCOUNTER_IQDROPS); - stats->tx_dropped = ifp->if_get_counter(ifp, IFCOUNTER_OQDROPS); - stats->multicast = ifp->if_get_counter(ifp, IFCOUNTER_IMCASTS); - stats->rx_nohandler = ifp->if_get_counter(ifp, IFCOUNTER_NOPROTO); + stats->rx_packets = if_getcounter(ifp, IFCOUNTER_IPACKETS); + stats->tx_packets = if_getcounter(ifp, IFCOUNTER_OPACKETS); + stats->rx_bytes = if_getcounter(ifp, IFCOUNTER_IBYTES); + stats->tx_bytes = if_getcounter(ifp, IFCOUNTER_OBYTES); + stats->rx_errors = if_getcounter(ifp, IFCOUNTER_IERRORS); + stats->tx_errors = if_getcounter(ifp, IFCOUNTER_OERRORS); + stats->rx_dropped = if_getcounter(ifp, IFCOUNTER_IQDROPS); + stats->tx_dropped = if_getcounter(ifp, IFCOUNTER_OQDROPS); + stats->multicast = if_getcounter(ifp, IFCOUNTER_IMCASTS); + stats->rx_nohandler = if_getcounter(ifp, IFCOUNTER_NOPROTO); return (true); } static void -get_operstate(struct ifnet *ifp, struct if_state *pstate) +get_operstate(if_t ifp, struct if_state *pstate) { pstate->ifla_operstate = IF_OPER_UNKNOWN; pstate->ifla_carrier = 0; /* no carrier */ - switch (ifp->if_type) { + switch (if_gettype(ifp)) { case IFT_ETHER: case IFT_L2VLAN: get_operstate_ether(ifp, pstate); break; default: /* Map admin state to the operstate */ - if (ifp->if_flags & IFF_UP) { + if (if_getflags(ifp) & IFF_UP) { pstate->ifla_operstate = IF_OPER_UP; pstate->ifla_carrier = 1; } else @@ -195,7 +195,7 @@ } static void -get_hwaddr(struct nl_writer *nw, struct ifnet *ifp) +get_hwaddr(struct nl_writer *nw, if_t ifp) { struct ifreq ifr = {}; @@ -206,9 +206,9 @@ } static unsigned -ifp_flags_to_netlink(const struct ifnet *ifp) +ifp_flags_to_netlink(const if_t ifp) { - return (ifp->if_flags | ifp->if_drv_flags); + return (if_getflags(ifp) | if_getdrvflags(ifp)); } #define LLADDR_CONST(s) ((const void *)((s)->sdl_data + (s)->sdl_nlen)) @@ -290,7 +290,7 @@ * This function is called without epoch and MAY sleep. */ static bool -dump_iface(struct nl_writer *nw, struct ifnet *ifp, const struct nlmsghdr *hdr, +dump_iface(struct nl_writer *nw, if_t ifp, const struct nlmsghdr *hdr, int if_flags_mask) { struct ifinfomsg *ifinfo; @@ -303,8 +303,8 @@ ifinfo = nlmsg_reserve_object(nw, struct ifinfomsg); ifinfo->ifi_family = AF_UNSPEC; ifinfo->__ifi_pad = 0; - ifinfo->ifi_type = ifp->if_type; - ifinfo->ifi_index = ifp->if_index; + ifinfo->ifi_type = if_gettype(ifp); + ifinfo->ifi_index = if_getindex(ifp); ifinfo->ifi_flags = ifp_flags_to_netlink(ifp); ifinfo->ifi_change = if_flags_mask; @@ -328,20 +328,20 @@ dump_sa(nw, IFLA_ADDRESS, ifa->ifa_addr); } - if ((ifp->if_broadcastaddr != NULL)) { - nlattr_add(nw, IFLA_BROADCAST, ifp->if_addrlen, - ifp->if_broadcastaddr); + if ((if_getbroadcastaddr(ifp) != NULL)) { + nlattr_add(nw, IFLA_BROADCAST, if_getaddrlen(ifp), + if_getbroadcastaddr(ifp)); } - nlattr_add_u32(nw, IFLA_MTU, ifp->if_mtu); + nlattr_add_u32(nw, IFLA_MTU, if_getmtu(ifp)); /* nlattr_add_u32(nw, IFLA_MIN_MTU, 60); nlattr_add_u32(nw, IFLA_MAX_MTU, 9000); nlattr_add_u32(nw, IFLA_GROUP, 0); */ - if (ifp->if_description != NULL) - nlattr_add_string(nw, IFLA_IFALIAS, ifp->if_description); + if (if_getdescr(ifp) != NULL) + nlattr_add_string(nw, IFLA_IFALIAS, if_getdescr(ifp)); /* Store FreeBSD-specific attributes */ int off = nlattr_add_nested(nw, IFLA_FREEBSD); @@ -354,7 +354,7 @@ get_stats(nw, ifp); - uint32_t val = (ifp->if_flags & IFF_PROMISC) != 0; + uint32_t val = (if_getflags(ifp) & IFF_PROMISC) != 0; nlattr_add_u32(nw, IFLA_PROMISCUITY, val); ifc_dump_ifp_nl(ifp, nw); @@ -412,13 +412,13 @@ NL_DECLARE_STRICT_PARSER(ifmsg_parser, struct ifinfomsg, check_ifmsg, nlf_p_if, nla_p_if); static bool -match_iface(struct ifnet *ifp, void *_arg) +match_iface(if_t ifp, void *_arg) { struct nl_parsed_link *attrs = (struct nl_parsed_link *)_arg; - if (attrs->ifi_index != 0 && attrs->ifi_index != ifp->if_index) + if (attrs->ifi_index != 0 && attrs->ifi_index != if_getindex(ifp)) return (false); - if (attrs->ifi_type != 0 && attrs->ifi_index != ifp->if_type) + if (attrs->ifi_type != 0 && attrs->ifi_index != if_gettype(ifp)) return (false); if (attrs->ifla_ifname != NULL && strcmp(attrs->ifla_ifname, if_name(ifp))) return (false); @@ -428,7 +428,7 @@ } static int -dump_cb(struct ifnet *ifp, void *_arg) +dump_cb(if_t ifp, void *_arg) { struct netlink_walkargs *wa = (struct netlink_walkargs *)_arg; if (!dump_iface(wa->nw, ifp, &wa->hdr, 0)) @@ -448,7 +448,7 @@ rtnl_handle_getlink(struct nlmsghdr *hdr, struct nlpcb *nlp, struct nl_pstate *npt) { struct epoch_tracker et; - struct ifnet *ifp; + if_t ifp; int error = 0; struct nl_parsed_link attrs = {}; @@ -529,7 +529,7 @@ rtnl_handle_dellink(struct nlmsghdr *hdr, struct nlpcb *nlp, struct nl_pstate *npt) { struct epoch_tracker et; - struct ifnet *ifp; + if_t ifp; int error; struct nl_parsed_link attrs = {}; @@ -609,7 +609,7 @@ modify_link(struct nlmsghdr *hdr, struct nl_parsed_link *lattrs, struct nlattr_bmask *bm, struct nlpcb *nlp, struct nl_pstate *npt) { - struct ifnet *ifp = NULL; + if_t ifp = NULL; struct epoch_tracker et; if (lattrs->ifi_index == 0 && lattrs->ifla_ifname == NULL) { @@ -948,7 +948,7 @@ ('IFA_CACHEINFO', {'ifa_preferred': 4294967295, 'ifa_valid': 4294967295, 'cstamp': 63745746, 'tstamp': 63745746})], */ static bool -dump_iface_addr(struct nl_writer *nw, struct ifnet *ifp, struct ifaddr *ifa, +dump_iface_addr(struct nl_writer *nw, if_t ifp, struct ifaddr *ifa, const struct nlmsghdr *hdr) { struct ifaddrmsg *ifamsg; @@ -966,9 +966,9 @@ ifamsg->ifa_prefixlen = get_sa_plen(ifa->ifa_netmask); ifamsg->ifa_flags = 0; // ifa_flags is useless ifamsg->ifa_scope = ifa_get_scope(ifa); - ifamsg->ifa_index = ifp->if_index; + ifamsg->ifa_index = if_getindex(ifp); - if ((ifp->if_flags & IFF_POINTOPOINT) && sa_dst != NULL && sa_dst->sa_family != 0) { + if ((if_getflags(ifp) & IFF_POINTOPOINT) && sa_dst != NULL && sa_dst->sa_family != 0) { /* P2P interface may have IPv6 LL with no dst address */ dump_sa(nw, IFA_ADDRESS, sa_dst); dump_sa(nw, IFA_LOCAL, sa); @@ -983,7 +983,7 @@ dump_sa(nw, IFA_LOCAL, sa); #endif } - if (ifp->if_flags & IFF_BROADCAST) + if (if_getflags(ifp) & IFF_BROADCAST) dump_sa(nw, IFA_BROADCAST, ifa->ifa_broadaddr); nlattr_add_string(nw, IFA_LABEL, if_name(ifp)); @@ -1027,11 +1027,13 @@ } static int -dump_iface_addrs(struct netlink_walkargs *wa, struct ifnet *ifp) +dump_iface_addrs(struct netlink_walkargs *wa, if_t ifp) { struct ifaddr *ifa; + struct ifa_iter it; + int error = 0; - CK_STAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) { + for (ifa = ifa_iter_start(ifp, &it); ifa != NULL; ifa = ifa_iter_next(&it)) { if (wa->family != 0 && wa->family != ifa->ifa_addr->sa_family) continue; if (ifa->ifa_addr->sa_family == AF_LINK) @@ -1039,18 +1041,21 @@ if (prison_if(wa->cred, ifa->ifa_addr) != 0) continue; wa->count++; - if (!dump_iface_addr(wa->nw, ifp, ifa, &wa->hdr)) - return (ENOMEM); + if (!dump_iface_addr(wa->nw, ifp, ifa, &wa->hdr)) { + error = ENOMEM; + break; + } wa->dumped++; } + ifa_iter_finish(&it); - return (0); + return (error); } static int rtnl_handle_getaddr(struct nlmsghdr *hdr, struct nlpcb *nlp, struct nl_pstate *npt) { - struct ifnet *ifp; + if_t ifp; int error = 0; struct nl_parsed_ifa attrs = {}; @@ -1078,11 +1083,14 @@ else error = dump_iface_addrs(&wa, ifp); } else { - CK_STAILQ_FOREACH(ifp, &V_ifnet, if_link) { + struct if_iter it; + + for (ifp = if_iter_start(&it); ifp != NULL; ifp = if_iter_next(&it)) { error = dump_iface_addrs(&wa, ifp); if (error != 0) break; } + if_iter_finish(&it); } NL_LOG(LOG_DEBUG2, "End dump, iterated %d dumped %d", wa.count, wa.dumped); @@ -1098,7 +1106,7 @@ #ifdef INET static int handle_newaddr_inet(struct nlmsghdr *hdr, struct nl_parsed_ifa *attrs, - struct ifnet *ifp, struct nlpcb *nlp, struct nl_pstate *npt) + if_t ifp, struct nlpcb *nlp, struct nl_pstate *npt) { int plen = attrs->ifa_prefixlen; int if_flags = if_getflags(ifp); @@ -1182,7 +1190,7 @@ static int handle_deladdr_inet(struct nlmsghdr *hdr, struct nl_parsed_ifa *attrs, - struct ifnet *ifp, struct nlpcb *nlp, struct nl_pstate *npt) + if_t ifp, struct nlpcb *nlp, struct nl_pstate *npt) { struct sockaddr_in *addr = (struct sockaddr_in *)attrs->ifa_local; @@ -1203,7 +1211,7 @@ #ifdef INET6 static int handle_newaddr_inet6(struct nlmsghdr *hdr, struct nl_parsed_ifa *attrs, - struct ifnet *ifp, struct nlpcb *nlp, struct nl_pstate *npt) + if_t ifp, struct nlpcb *nlp, struct nl_pstate *npt) { struct sockaddr_in6 *addr, *dst; @@ -1266,7 +1274,7 @@ static int handle_deladdr_inet6(struct nlmsghdr *hdr, struct nl_parsed_ifa *attrs, - struct ifnet *ifp, struct nlpcb *nlp, struct nl_pstate *npt) + if_t ifp, struct nlpcb *nlp, struct nl_pstate *npt) { struct sockaddr_in6 *addr = (struct sockaddr_in6 *)attrs->ifa_local; @@ -1297,7 +1305,7 @@ return (error); NET_EPOCH_ENTER(et); - struct ifnet *ifp = ifnet_byindex_ref(attrs.ifa_index); + if_t ifp = ifnet_byindex_ref(attrs.ifa_index); NET_EPOCH_EXIT(et); if (ifp == NULL) { @@ -1386,7 +1394,7 @@ } static void -rtnl_handle_ifevent(struct ifnet *ifp, int nlmsg_type, int if_flags_mask) +rtnl_handle_ifevent(if_t ifp, int nlmsg_type, int if_flags_mask) { struct nlmsghdr hdr = { .nlmsg_type = nlmsg_type }; struct nl_writer nw = {}; @@ -1403,28 +1411,28 @@ } static void -rtnl_handle_ifattach(void *arg, struct ifnet *ifp) +rtnl_handle_ifattach(void *arg, if_t ifp) { NL_LOG(LOG_DEBUG2, "ifnet %s", if_name(ifp)); rtnl_handle_ifevent(ifp, NL_RTM_NEWLINK, 0); } static void -rtnl_handle_ifdetach(void *arg, struct ifnet *ifp) +rtnl_handle_ifdetach(void *arg, if_t ifp) { NL_LOG(LOG_DEBUG2, "ifnet %s", if_name(ifp)); rtnl_handle_ifevent(ifp, NL_RTM_DELLINK, 0); } static void -rtnl_handle_iflink(void *arg, struct ifnet *ifp) +rtnl_handle_iflink(void *arg, if_t ifp) { NL_LOG(LOG_DEBUG2, "ifnet %s", if_name(ifp)); rtnl_handle_ifevent(ifp, NL_RTM_NEWLINK, 0); } void -rtnl_handle_ifnet_event(struct ifnet *ifp, int if_flags_mask) +rtnl_handle_ifnet_event(if_t ifp, int if_flags_mask) { NL_LOG(LOG_DEBUG2, "ifnet %s", if_name(ifp)); rtnl_handle_ifevent(ifp, NL_RTM_NEWLINK, if_flags_mask); diff --git a/sys/netlink/route/iface_drivers.c b/sys/netlink/route/iface_drivers.c --- a/sys/netlink/route/iface_drivers.c +++ b/sys/netlink/route/iface_drivers.c @@ -77,7 +77,7 @@ memcpy(buf, lattrs->ifla_ifalias, len); if_setdescr(ifp, buf); - getmicrotime(&ifp->if_lastchange); + if_setlastchange(ifp); } else { nlmsg_report_err_msg(npt, "Not enough privileges to set descr"); return (EPERM); @@ -122,7 +122,7 @@ _nl_store_ifp_cookie(struct nl_pstate *npt, struct ifnet *ifp) { int ifname_len = strlen(if_name(ifp)); - uint32_t ifindex = (uint32_t)ifp->if_index; + uint32_t ifindex = (uint32_t)if_getindex(ifp); int nla_len = sizeof(struct nlattr) * 3 + sizeof(ifindex) + NL_ITEM_ALIGN(ifname_len + 1); diff --git a/sys/netlink/route/neigh.c b/sys/netlink/route/neigh.c --- a/sys/netlink/route/neigh.c +++ b/sys/netlink/route/neigh.c @@ -39,6 +39,8 @@ #include #include +#include +#include #include #include #include @@ -62,7 +64,7 @@ struct nl_writer *nw; struct nlmsghdr hdr; struct nlpcb *so; - struct ifnet *ifp; + if_t ifp; int family; int error; int count; @@ -156,7 +158,7 @@ ndm = nlmsg_reserve_object(nw, struct ndmsg); ndm->ndm_family = wa->family; - ndm->ndm_ifindex = wa->ifp->if_index; + ndm->ndm_ifindex = if_getindex(wa->ifp); ndm->ndm_state = lle_state_to_nl_state(wa->family, lle); ndm->ndm_flags = lle_flags_to_nl_flags(lle); @@ -178,7 +180,7 @@ if (lle->r_flags & RLLE_VALID) { /* Has L2 */ - int addrlen = wa->ifp->if_addrlen; + int addrlen = if_getaddrlen(wa->ifp); nlattr_add(nw, NDA_LLADDR, addrlen, lle->ll_addr); } @@ -226,7 +228,7 @@ } static int -dump_llts_iface(struct netlink_walkargs *wa, struct ifnet *ifp, int family) +dump_llts_iface(struct netlink_walkargs *wa, if_t ifp, int family) { int error = 0; @@ -248,21 +250,24 @@ } static int -dump_llts(struct netlink_walkargs *wa, struct ifnet *ifp, int family) +dump_llts(struct netlink_walkargs *wa, if_t ifp, int family) { - NL_LOG(LOG_DEBUG, "Start dump ifp=%s family=%d", ifp ? if_name(ifp) : "NULL", family); + NL_LOG(LOG_DEBUG2, "Start dump ifp=%s family=%d", ifp ? if_name(ifp) : "NULL", family); wa->hdr.nlmsg_flags |= NLM_F_MULTI; if (ifp != NULL) { dump_llts_iface(wa, ifp, family); } else { - CK_STAILQ_FOREACH(ifp, &V_ifnet, if_link) { + struct if_iter it; + + for (ifp = if_iter_start(&it); ifp != NULL; ifp = if_iter_next(&it)) { dump_llts_iface(wa, ifp, family); } + if_iter_finish(&it); } - NL_LOG(LOG_DEBUG, "End dump, iterated %d dumped %d", wa->count, wa->dumped); + NL_LOG(LOG_DEBUG2, "End dump, iterated %d dumped %d", wa->count, wa->dumped); if (!nlmsg_end_dump(wa->nw, wa->error, &wa->hdr)) { NL_LOG(LOG_DEBUG, "Unable to add new message"); @@ -273,7 +278,7 @@ } static int -get_lle(struct netlink_walkargs *wa, struct ifnet *ifp, int family, struct sockaddr *dst) +get_lle(struct netlink_walkargs *wa, if_t ifp, int family, struct sockaddr *dst) { struct lltable *llt = lltable_get(ifp, family); if (llt == NULL) @@ -290,7 +295,7 @@ } static void -set_scope6(struct sockaddr *sa, struct ifnet *ifp) +set_scope6(struct sockaddr *sa, if_t ifp) { #ifdef INET6 if (sa != NULL && sa->sa_family == AF_INET6 && ifp != NULL) { @@ -382,7 +387,7 @@ return (EINVAL); } - int addrlen = attrs.nda_ifp->if_addrlen; + int addrlen = if_getaddrlen(attrs.nda_ifp); if (attrs.nda_lladdr->nla_len != sizeof(struct nlattr) + addrlen) { NLMSG_REPORT_ERR_MSG(npt, "NDA_LLADDR address length (%d) is different from expected (%d)", @@ -552,7 +557,7 @@ static void rtnl_lle_event(void *arg __unused, struct llentry *lle, int evt) { - struct ifnet *ifp; + if_t ifp; int family; LLE_WLOCK_ASSERT(lle); diff --git a/sys/netlink/route/nexthop.c b/sys/netlink/route/nexthop.c --- a/sys/netlink/route/nexthop.c +++ b/sys/netlink/route/nexthop.c @@ -455,7 +455,7 @@ nlattr_add_flag(nw, NHA_BLACKHOLE); goto done; } - nlattr_add_u32(nw, NHA_OIF, nh->nh_ifp->if_index); + nlattr_add_u32(nw, NHA_OIF, if_getindex(nh->nh_ifp)); switch (nh->gw_sa.sa_family) { #ifdef INET @@ -476,7 +476,7 @@ int off = nlattr_add_nested(nw, NHA_FREEBSD); if (off != 0) { - nlattr_add_u32(nw, NHAF_AIF, nh->nh_aifp->if_index); + nlattr_add_u32(nw, NHAF_AIF, if_getindex(nh->nh_aifp)); if (uidx == 0) { nlattr_add_u32(nw, NHAF_KID, nhop_get_idx(nh)); @@ -679,7 +679,7 @@ } static void -set_scope6(struct sockaddr *sa, struct ifnet *ifp) +set_scope6(struct sockaddr *sa, if_t ifp) { #ifdef INET6 if (sa != NULL && sa->sa_family == AF_INET6 && ifp != NULL) { @@ -799,7 +799,7 @@ * Returns 0 on success or errno. */ int -nl_set_nexthop_gw(struct nhop_object *nh, struct sockaddr *gw, struct ifnet *ifp, +nl_set_nexthop_gw(struct nhop_object *nh, struct sockaddr *gw, if_t ifp, struct nl_pstate *npt) { #ifdef INET6 @@ -810,7 +810,7 @@ NLMSG_REPORT_ERR_MSG(npt, "interface not set"); return (EINVAL); } - in6_set_unicast_scopeid(&gw6->sin6_addr, ifp->if_index); + in6_set_unicast_scopeid(&gw6->sin6_addr, if_getindex(ifp)); } } #endif @@ -908,7 +908,7 @@ } } - NL_LOG(LOG_DEBUG, "IFINDEX %d", attrs.nha_oif ? attrs.nha_oif->if_index : 0); + NL_LOG(LOG_DEBUG, "IFINDEX %d", attrs.nha_oif ? if_getindex(attrs.nha_oif) : 0); unhop = malloc(sizeof(struct user_nhop), M_NETLINK, M_NOWAIT | M_ZERO); if (unhop == NULL) { diff --git a/sys/netlink/route/rt.c b/sys/netlink/route/rt.c --- a/sys/netlink/route/rt.c +++ b/sys/netlink/route/rt.c @@ -201,7 +201,7 @@ if (rtnh == NULL) return; rtnh->rtnh_flags = 0; - rtnh->rtnh_ifindex = wn[i].nh->nh_ifp->if_index; + rtnh->rtnh_ifindex = if_getindex(wn[i].nh->nh_ifp); rtnh->rtnh_hops = wn[i].weight; dump_rc_nhop_gw(nw, wn[i].nh); uint32_t rtflags = nhop_get_rtflags(wn[i].nh); @@ -256,7 +256,7 @@ nlattr_add_u32(nw, NL_RTA_EXPIRES, nh_expire - time_uptime); /* In any case, fill outgoing interface */ - nlattr_add_u32(nw, NL_RTA_OIF, nh->nh_ifp->if_index); + nlattr_add_u32(nw, NL_RTA_OIF, if_getindex(nh->nh_ifp)); if (rnd->rnd_weight != RT_DEFAULT_WEIGHT) nlattr_add_u32(nw, NL_RTA_WEIGHT, rnd->rnd_weight);