Lines Matching refs:ifp

127 void	(*bridge_linkstate_p)(struct ifnet *ifp);
128 void (*ng_ether_link_state_p)(struct ifnet *ifp, int state);
129 void (*lagg_linkstate_p)(struct ifnet *ifp, int state);
131 void (*carp_linkstate_p)(struct ifnet *ifp);
135 int (*carp_forus_p)(struct ifnet *ifp, u_char *dhost);
136 int (*carp_output_p)(struct ifnet *ifp, struct mbuf *m,
146 struct ifaddr *(*carp_iamatch6_p)(struct ifnet *ifp, struct in6_addr *taddr6);
147 caddr_t (*carp_macmatch6_p)(struct ifnet *ifp, struct mbuf *m,
166 static int if_transmit(struct ifnet *ifp, struct mbuf *m);
240 struct ifnet *ifp;
243 ifp = ifnet_byindex_locked(idx);
245 return (ifp);
251 struct ifnet *ifp;
254 ifp = ifnet_byindex_locked(idx);
255 if (ifp == NULL || (ifp->if_flags & IFF_DYING)) {
259 if_ref(ifp);
261 return (ifp);
320 ifnet_setbyindex_locked(u_short idx, struct ifnet *ifp)
325 V_ifindex_table[idx].ife_ifnet = ifp;
329 ifnet_setbyindex(u_short idx, struct ifnet *ifp)
333 ifnet_setbyindex_locked(idx, ifp);
431 struct ifnet *ifp;
434 ifp = malloc(sizeof(struct ifnet), M_IFNET, M_WAITOK|M_ZERO);
438 free(ifp, M_IFNET);
443 ifp->if_index = idx;
444 ifp->if_type = type;
445 ifp->if_alloctype = type;
447 ifp->if_l2com = if_com_alloc[type](type, ifp);
448 if (ifp->if_l2com == NULL) {
449 free(ifp, M_IFNET);
455 IF_ADDR_LOCK_INIT(ifp);
456 TASK_INIT(&ifp->if_linktask, 0, do_link_state_change, ifp);
457 ifp->if_afdata_initialized = 0;
458 IF_AFDATA_LOCK_INIT(ifp);
459 TAILQ_INIT(&ifp->if_addrhead);
460 TAILQ_INIT(&ifp->if_multiaddrs);
461 TAILQ_INIT(&ifp->if_groups);
463 mac_ifnet_init(ifp);
465 ifq_init(&ifp->if_snd, ifp);
467 refcount_init(&ifp->if_refcount, 1); /* Index reference. */
468 ifnet_setbyindex(ifp->if_index, ifp);
469 return (ifp);
478 if_free_internal(struct ifnet *ifp)
481 KASSERT((ifp->if_flags & IFF_DYING),
484 if (if_com_free[ifp->if_alloctype] != NULL)
485 if_com_free[ifp->if_alloctype](ifp->if_l2com,
486 ifp->if_alloctype);
489 mac_ifnet_destroy(ifp);
491 if (ifp->if_description != NULL)
492 free(ifp->if_description, M_IFDESCR);
493 IF_AFDATA_DESTROY(ifp);
494 IF_ADDR_LOCK_DESTROY(ifp);
495 ifq_delete(&ifp->if_snd);
496 free(ifp, M_IFNET);
503 if_free(struct ifnet *ifp)
506 ifp->if_flags |= IFF_DYING; /* XXX: Locking */
508 CURVNET_SET_QUIET(ifp->if_vnet);
510 KASSERT(ifp == ifnet_byindex_locked(ifp->if_index),
511 ("%s: freeing unallocated ifnet", ifp->if_xname));
513 ifindex_free_locked(ifp->if_index);
516 if (refcount_release(&ifp->if_refcount))
517 if_free_internal(ifp);
527 if_ref(struct ifnet *ifp)
531 refcount_acquire(&ifp->if_refcount);
535 if_rele(struct ifnet *ifp)
538 if (!refcount_release(&ifp->if_refcount))
540 if_free_internal(ifp);
544 ifq_init(struct ifaltq *ifq, struct ifnet *ifp)
547 mtx_init(&ifq->ifq_mtx, ifp->if_xname, "if send queue", MTX_DEF);
556 ifq->altq_ifp = ifp;
579 if_attach(struct ifnet *ifp)
582 if_attach_internal(ifp, 0);
586 if_attach_internal(struct ifnet *ifp, int vmove)
593 if (ifp->if_index == 0 || ifp != ifnet_byindex(ifp->if_index))
595 ifp->if_xname);
598 ifp->if_vnet = curvnet;
599 if (ifp->if_home_vnet == NULL)
600 ifp->if_home_vnet = curvnet;
603 if_addgroup(ifp, IFG_ALL);
605 getmicrotime(&ifp->if_lastchange);
606 ifp->if_data.ifi_epoch = time_uptime;
607 ifp->if_data.ifi_datalen = sizeof(struct if_data);
609 KASSERT((ifp->if_transmit == NULL && ifp->if_qflush == NULL) ||
610 (ifp->if_transmit != NULL && ifp->if_qflush != NULL),
612 if (ifp->if_transmit == NULL) {
613 ifp->if_transmit = if_transmit;
614 ifp->if_qflush = if_qflush;
619 mac_ifnet_create(ifp);
625 namelen = strlen(ifp->if_xname);
631 socksize = masklen + ifp->if_addrlen;
641 bcopy(ifp->if_xname, sdl->sdl_data, namelen);
643 sdl->sdl_index = ifp->if_index;
644 sdl->sdl_type = ifp->if_type;
645 ifp->if_addr = ifa;
646 ifa->ifa_ifp = ifp;
654 TAILQ_INSERT_HEAD(&ifp->if_addrhead, ifa, ifa_link);
656 ifp->if_broadcastaddr = NULL;
660 if (ifp->if_hw_tsomax == 0)
661 ifp->if_hw_tsomax = IP_MAXPACKET;
662 KASSERT(ifp->if_hw_tsomax <= IP_MAXPACKET &&
663 ifp->if_hw_tsomax >= IP_MAXPACKET / 8,
673 for (ifa = ifp->if_addr; ifa != NULL;
677 sdl->sdl_index = ifp->if_index;
684 TAILQ_INSERT_TAIL(&V_ifnet, ifp, if_link);
691 if_attachdomain1(ifp);
693 EVENTHANDLER_INVOKE(ifnet_arrival_event, ifp);
695 devctl_notify("IFNET", ifp->if_xname, "ATTACH", NULL);
698 rt_ifannouncemsg(ifp, IFAN_ARRIVAL);
704 struct ifnet *ifp;
706 TAILQ_FOREACH(ifp, &V_ifnet, if_link)
707 if_attachdomain1(ifp);
713 if_attachdomain1(struct ifnet *ifp)
719 * cannot lock ifp->if_afdata initialization, entirely.
721 if (IF_AFDATA_TRYLOCK(ifp) == 0)
723 if (ifp->if_afdata_initialized >= domain_init_status) {
724 IF_AFDATA_UNLOCK(ifp);
726 __func__, ifp->if_xname);
729 ifp->if_afdata_initialized = domain_init_status;
730 IF_AFDATA_UNLOCK(ifp);
733 bzero(ifp->if_afdata, sizeof(ifp->if_afdata));
736 ifp->if_afdata[dp->dom_family] =
737 (*dp->dom_ifattach)(ifp);
745 if_purgeaddrs(struct ifnet *ifp)
749 TAILQ_FOREACH_SAFE(ifa, &ifp->if_addrhead, ifa_link, next) {
761 if (in_control(NULL, SIOCDIFADDR, (caddr_t)&ifr, ifp,
773 TAILQ_REMOVE(&ifp->if_addrhead, ifa, ifa_link);
783 if_purgemaddrs(struct ifnet *ifp)
788 IF_ADDR_WLOCK(ifp);
789 TAILQ_FOREACH_SAFE(ifma, &ifp->if_multiaddrs, ifma_link, next)
790 if_delmulti_locked(ifp, ifma, 1);
791 IF_ADDR_WUNLOCK(ifp);
804 if_detach(struct ifnet *ifp)
807 CURVNET_SET_QUIET(ifp->if_vnet);
808 if_detach_internal(ifp, 0);
813 if_detach_internal(struct ifnet *ifp, int vmove)
824 if (iter == ifp) {
825 TAILQ_REMOVE(&V_ifnet, ifp, if_link);
836 panic("%s: ifp=%p not on the ifnet tailq %p",
837 __func__, ifp, &V_ifnet);
845 taskqueue_drain(taskqueue_swi, &ifp->if_linktask);
850 if_down(ifp);
852 if (ALTQ_IS_ENABLED(&ifp->if_snd))
853 altq_disable(&ifp->if_snd);
854 if (ALTQ_IS_ATTACHED(&ifp->if_snd))
855 altq_detach(&ifp->if_snd);
858 if_purgeaddrs(ifp);
861 in_ifdetach(ifp);
866 * Remove all IPv6 kernel structs related to ifp. This should be done
871 in6_ifdetach(ifp);
873 if_purgemaddrs(ifp);
879 if_dead(ifp);
885 ifp->if_addr = NULL;
888 if (!TAILQ_EMPTY(&ifp->if_addrhead)) {
889 ifa = TAILQ_FIRST(&ifp->if_addrhead);
890 TAILQ_REMOVE(&ifp->if_addrhead, ifa, ifa_link);
907 (void) rnh->rnh_walktree(rnh, if_rtdel, ifp);
913 rt_ifannouncemsg(ifp, IFAN_DEPARTURE);
914 EVENTHANDLER_INVOKE(ifnet_departure_event, ifp);
916 devctl_notify("IFNET", ifp->if_xname, "DETACH", NULL);
917 if_delgroups(ifp);
924 IF_AFDATA_LOCK(ifp);
925 i = ifp->if_afdata_initialized;
926 ifp->if_afdata_initialized = 0;
927 IF_AFDATA_UNLOCK(ifp);
929 if (dp->dom_ifdetach && ifp->if_afdata[dp->dom_family])
930 (*dp->dom_ifdetach)(ifp,
931 ifp->if_afdata[dp->dom_family]);
944 if_vmove(struct ifnet *ifp, struct vnet *new_vnet)
952 if_detach_internal(ifp, 1);
962 ifindex_free_locked(ifp->if_index);
969 if (ifp->if_reassign != NULL)
970 ifp->if_reassign(ifp, new_vnet, NULL);
982 ifp->if_index = idx;
983 ifnet_setbyindex_locked(ifp->if_index, ifp);
986 if_attach_internal(ifp, 1);
995 if_vmove_loan(struct thread *td, struct ifnet *ifp, char *ifname, int jid)
1010 if (pr->pr_vnet == ifp->if_vnet) {
1026 if_vmove(ifp, pr->pr_vnet);
1029 sprintf(ifname, "%s", ifp->if_xname);
1040 struct ifnet *ifp;
1053 ifp = ifunit(ifname); /* XXX Lock to avoid races. */
1054 if (ifp == NULL) {
1062 if (vnet_dst == ifp->if_vnet) {
1069 if_vmove(ifp, vnet_dst);
1073 sprintf(ifname, "%s", ifp->if_xname);
1084 if_addgroup(struct ifnet *ifp, const char *groupname)
1096 TAILQ_FOREACH(ifgl, &ifp->if_groups, ifgl_next)
1136 ifgm->ifgm_ifp = ifp;
1138 IF_ADDR_WLOCK(ifp);
1140 TAILQ_INSERT_TAIL(&ifp->if_groups, ifgl, ifgl_next);
1141 IF_ADDR_WUNLOCK(ifp);
1156 if_delgroup(struct ifnet *ifp, const char *groupname)
1162 TAILQ_FOREACH(ifgl, &ifp->if_groups, ifgl_next)
1170 IF_ADDR_WLOCK(ifp);
1171 TAILQ_REMOVE(&ifp->if_groups, ifgl, ifgl_next);
1172 IF_ADDR_WUNLOCK(ifp);
1175 if (ifgm->ifgm_ifp == ifp)
1202 if_delgroups(struct ifnet *ifp)
1209 while (!TAILQ_EMPTY(&ifp->if_groups)) {
1210 ifgl = TAILQ_FIRST(&ifp->if_groups);
1214 IF_ADDR_WLOCK(ifp);
1215 TAILQ_REMOVE(&ifp->if_groups, ifgl, ifgl_next);
1216 IF_ADDR_WUNLOCK(ifp);
1219 if (ifgm->ifgm_ifp == ifp)
1251 if_getgroup(struct ifgroupreq *data, struct ifnet *ifp)
1259 IF_ADDR_RLOCK(ifp);
1260 TAILQ_FOREACH(ifgl, &ifp->if_groups, ifgl_next)
1262 IF_ADDR_RUNLOCK(ifp);
1269 IF_ADDR_RLOCK(ifp);
1270 TAILQ_FOREACH(ifgl, &ifp->if_groups, ifgl_next) {
1272 IF_ADDR_RUNLOCK(ifp);
1279 IF_ADDR_RUNLOCK(ifp);
1285 IF_ADDR_RUNLOCK(ifp);
1359 struct ifnet *ifp = arg;
1362 if (rt->rt_ifp == ifp) {
1390 if_addr_rlock(struct ifnet *ifp)
1393 IF_ADDR_RLOCK(ifp);
1397 if_addr_runlock(struct ifnet *ifp)
1400 IF_ADDR_RUNLOCK(ifp);
1404 if_maddr_rlock(struct ifnet *ifp)
1407 IF_ADDR_RLOCK(ifp);
1411 if_maddr_runlock(struct ifnet *ifp)
1414 IF_ADDR_RUNLOCK(ifp);
1522 struct ifnet *ifp;
1526 TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
1527 IF_ADDR_RLOCK(ifp);
1528 TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
1534 IF_ADDR_RUNLOCK(ifp);
1538 if ((ifp->if_flags & IFF_BROADCAST) &&
1544 IF_ADDR_RUNLOCK(ifp);
1548 IF_ADDR_RUNLOCK(ifp);
1577 struct ifnet *ifp;
1581 TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
1582 IF_ADDR_RLOCK(ifp);
1583 TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
1586 if ((ifp->if_flags & IFF_BROADCAST) &&
1591 IF_ADDR_RUNLOCK(ifp);
1595 IF_ADDR_RUNLOCK(ifp);
1610 struct ifnet *ifp;
1614 TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
1615 if ((ifp->if_flags & IFF_POINTOPOINT) == 0)
1617 IF_ADDR_RLOCK(ifp);
1618 TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
1624 IF_ADDR_RUNLOCK(ifp);
1628 IF_ADDR_RUNLOCK(ifp);
1643 struct ifnet *ifp;
1666 TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
1667 IF_ADDR_RLOCK(ifp);
1668 TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
1674 ifp->if_flags & IFF_POINTOPOINT && !ignore_ptp) {
1686 IF_ADDR_RUNLOCK(ifp);
1697 IF_ADDR_RUNLOCK(ifp);
1739 IF_ADDR_RUNLOCK(ifp);
1755 ifaof_ifpforaddr(struct sockaddr *addr, struct ifnet *ifp)
1765 IF_ADDR_RLOCK(ifp);
1766 TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
1778 if (ifp->if_flags & IFF_POINTOPOINT) {
1797 IF_ADDR_RUNLOCK(ifp);
1828 struct ifnet *ifp;
1833 ((ifp = ifa->ifa_ifp) == 0) || ((dst = rt_key(rt)) == 0))
1835 ifa = ifaof_ifpforaddr(dst, ifp);
1850 if_unroute(struct ifnet *ifp, int flag, int fam)
1856 ifp->if_flags &= ~flag;
1857 getmicrotime(&ifp->if_lastchange);
1858 TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link)
1861 ifp->if_qflush(ifp);
1863 if (ifp->if_carp)
1864 (*carp_linkstate_p)(ifp);
1865 rt_ifmsg(ifp);
1873 if_route(struct ifnet *ifp, int flag, int fam)
1879 ifp->if_flags |= flag;
1880 getmicrotime(&ifp->if_lastchange);
1881 TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link)
1884 if (ifp->if_carp)
1885 (*carp_linkstate_p)(ifp);
1886 rt_ifmsg(ifp);
1888 in6_if_up(ifp);
1907 if_link_state_change(struct ifnet *ifp, int link_state)
1910 if (ifp->if_link_state == link_state)
1913 ifp->if_link_state = link_state;
1915 taskqueue_enqueue(taskqueue_swi, &ifp->if_linktask);
1921 struct ifnet *ifp = (struct ifnet *)arg;
1922 int link_state = ifp->if_link_state;
1923 CURVNET_SET(ifp->if_vnet);
1926 rt_ifmsg(ifp);
1927 if (ifp->if_vlantrunk != NULL)
1928 (*vlan_link_state_p)(ifp);
1930 if ((ifp->if_type == IFT_ETHER || ifp->if_type == IFT_L2VLAN) &&
1931 IFP2AC(ifp)->ac_netgraph != NULL)
1932 (*ng_ether_link_state_p)(ifp, link_state);
1933 if (ifp->if_carp)
1934 (*carp_linkstate_p)(ifp);
1935 if (ifp->if_bridge)
1936 (*bridge_linkstate_p)(ifp);
1937 if (ifp->if_lagg)
1938 (*lagg_linkstate_p)(ifp, link_state);
1941 devctl_notify("IFNET", ifp->if_xname,
1945 if_printf(ifp, "%d link states coalesced\n", pending);
1947 log(LOG_NOTICE, "%s: link state changed to %s\n", ifp->if_xname,
1949 EVENTHANDLER_INVOKE(ifnet_link_event, ifp, ifp->if_link_state);
1958 if_down(struct ifnet *ifp)
1961 if_unroute(ifp, IFF_UP, AF_UNSPEC);
1969 if_up(struct ifnet *ifp)
1972 if_route(ifp, IFF_UP, AF_UNSPEC);
1979 if_qflush(struct ifnet *ifp)
1984 ifq = &ifp->if_snd;
2008 struct ifnet *ifp;
2011 TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
2012 if (strncmp(name, ifp->if_xname, IFNAMSIZ) == 0 &&
2013 !(ifp->if_flags & IFF_DYING))
2016 if (ifp != NULL)
2017 if_ref(ifp);
2019 return (ifp);
2025 struct ifnet *ifp;
2028 TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
2029 if (strncmp(name, ifp->if_xname, IFNAMSIZ) == 0)
2033 return (ifp);
2040 ifhwioctl(u_long cmd, struct ifnet *ifp, caddr_t data, struct thread *td)
2056 ifr->ifr_index = ifp->if_index;
2060 temp_flags = ifp->if_flags | ifp->if_drv_flags;
2066 ifr->ifr_reqcap = ifp->if_capabilities;
2067 ifr->ifr_curcap = ifp->if_capenable;
2072 error = mac_ifnet_ioctl_get(td->td_ucred, ifr, ifp);
2077 ifr->ifr_metric = ifp->if_metric;
2081 ifr->ifr_mtu = ifp->if_mtu;
2085 ifr->ifr_phys = ifp->if_physical;
2091 if (ifp->if_description == NULL)
2095 descrlen = strlen(ifp->if_description) + 1;
2099 error = copyout(ifp->if_description,
2133 odescrbuf = ifp->if_description;
2134 ifp->if_description = descrbuf;
2137 getmicrotime(&ifp->if_lastchange);
2142 ifr->ifr_fib = ifp->if_fib;
2152 ifp->if_fib = ifr->ifr_fib;
2165 if (ifp->if_flags & IFF_SMART) {
2167 } else if (ifp->if_flags & IFF_UP &&
2169 if_down(ifp);
2171 (ifp->if_flags & IFF_UP) == 0) {
2172 if_up(ifp);
2175 if ((ifp->if_flags ^ new_flags) & IFF_PPROMISC) {
2177 ifp->if_flags |= IFF_PROMISC;
2178 else if (ifp->if_pcount == 0)
2179 ifp->if_flags &= ~IFF_PROMISC;
2181 ifp->if_xname,
2184 ifp->if_flags = (ifp->if_flags & IFF_CANTCHANGE) |
2186 if (ifp->if_ioctl) {
2187 (void) (*ifp->if_ioctl)(ifp, cmd, data);
2189 getmicrotime(&ifp->if_lastchange);
2196 if (ifp->if_ioctl == NULL)
2198 if (ifr->ifr_reqcap & ~ifp->if_capabilities)
2200 error = (*ifp->if_ioctl)(ifp, cmd, data);
2202 getmicrotime(&ifp->if_lastchange);
2207 error = mac_ifnet_ioctl_set(td->td_ucred, ifr, ifp);
2229 ifp->if_flags |= IFF_RENAMING;
2232 rt_ifannouncemsg(ifp, IFAN_DEPARTURE);
2233 EVENTHANDLER_INVOKE(ifnet_departure_event, ifp);
2236 ifp->if_xname, new_name);
2238 strlcpy(ifp->if_xname, new_name, sizeof(ifp->if_xname));
2239 ifa = ifp->if_addr;
2261 EVENTHANDLER_INVOKE(ifnet_arrival_event, ifp);
2263 rt_ifannouncemsg(ifp, IFAN_ARRIVAL);
2265 ifp->if_flags &= ~IFF_RENAMING;
2273 error = if_vmove_loan(td, ifp, ifr->ifr_name, ifr->ifr_jid);
2281 ifp->if_metric = ifr->ifr_metric;
2282 getmicrotime(&ifp->if_lastchange);
2289 if (ifp->if_ioctl == NULL)
2291 error = (*ifp->if_ioctl)(ifp, cmd, data);
2293 getmicrotime(&ifp->if_lastchange);
2298 u_long oldmtu = ifp->if_mtu;
2305 if (ifp->if_ioctl == NULL)
2307 error = (*ifp->if_ioctl)(ifp, cmd, data);
2309 getmicrotime(&ifp->if_lastchange);
2310 rt_ifmsg(ifp);
2315 if (ifp->if_mtu != oldmtu) {
2317 nd6_setmtu(ifp);
2333 if ((ifp->if_flags & IFF_MULTICAST) == 0)
2350 IF_ADDR_RLOCK(ifp);
2351 ifma = if_findmulti(ifp, &ifr->ifr_addr);
2352 IF_ADDR_RUNLOCK(ifp);
2356 error = if_addmulti(ifp, &ifr->ifr_addr, &ifma);
2358 error = if_delmulti(ifp, &ifr->ifr_addr);
2361 getmicrotime(&ifp->if_lastchange);
2375 if (ifp->if_ioctl == NULL)
2377 error = (*ifp->if_ioctl)(ifp, cmd, data);
2379 getmicrotime(&ifp->if_lastchange);
2391 if (ifp->if_ioctl == NULL)
2393 error = (*ifp->if_ioctl)(ifp, cmd, data);
2400 error = if_setlladdr(ifp,
2402 EVENTHANDLER_INVOKE(iflladdr_event, ifp);
2412 if ((error = if_addgroup(ifp, ifgr->ifgr_group)))
2418 if ((error = if_getgroup((struct ifgroupreq *)ifr, ifp)))
2429 if ((error = if_delgroup(ifp, ifgr->ifgr_group)))
2458 struct ifnet *ifp;
2537 ifp = ifunit_ref(ifr->ifr_name);
2538 if (ifp == NULL) {
2543 error = ifhwioctl(cmd, ifp, data, td);
2545 if_rele(ifp);
2550 oif_flags = ifp->if_flags;
2552 if_rele(ifp);
2569 ifp, td));
2570 if (error == EOPNOTSUPP && ifp != NULL && ifp->if_ioctl != NULL &&
2573 error = (*ifp->if_ioctl)(ifp, cmd, data);
2614 ifp, td));
2615 if (error == EOPNOTSUPP && ifp != NULL &&
2616 ifp->if_ioctl != NULL &&
2619 error = (*ifp->if_ioctl)(ifp, cmd, data);
2632 if ((oif_flags ^ ifp->if_flags) & IFF_UP) {
2634 if (ifp->if_flags & IFF_UP)
2635 in6_if_up(ifp);
2638 if_rele(ifp);
2652 if_setflag(struct ifnet *ifp, int flag, int pflag, int *refcount, int onswitch)
2672 if (ifp->if_flags & pflag) {
2679 oldflags = ifp->if_flags;
2688 ifp->if_flags |= flag;
2692 ifp->if_flags &= ~flag;
2696 if (ifp->if_ioctl == NULL) {
2700 ifr.ifr_flags = ifp->if_flags & 0xffff;
2701 ifr.ifr_flagshigh = ifp->if_flags >> 16;
2702 error = (*ifp->if_ioctl)(ifp, SIOCSIFFLAGS, (caddr_t)&ifr);
2706 rt_ifmsg(ifp);
2712 ifp->if_flags = oldflags;
2717 * Set/clear promiscuous mode on interface ifp based on the truth value
2723 ifpromisc(struct ifnet *ifp, int pswitch)
2726 int oldflags = ifp->if_flags;
2728 error = if_setflag(ifp, IFF_PROMISC, IFF_PPROMISC,
2729 &ifp->if_pcount, pswitch);
2731 if (error == 0 && ((ifp->if_flags ^ oldflags) & IFF_PROMISC))
2733 ifp->if_xname,
2734 (ifp->if_flags & IFF_PROMISC) ? "enabled" : "disabled");
2749 struct ifnet *ifp;
2772 TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
2781 if (strlcpy(ifr.ifr_name, ifp->if_xname, sizeof(ifr.ifr_name))
2789 IF_ADDR_RLOCK(ifp);
2790 TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
2821 IF_ADDR_RUNLOCK(ifp);
2854 if_allmulti(struct ifnet *ifp, int onswitch)
2857 return (if_setflag(ifp, IFF_ALLMULTI, 0, &ifp->if_amcount, onswitch));
2861 if_findmulti(struct ifnet *ifp, struct sockaddr *sa)
2865 IF_ADDR_LOCK_ASSERT(ifp);
2867 TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
2888 if_allocmulti(struct ifnet *ifp, struct sockaddr *sa, struct sockaddr *llsa,
2907 ifma->ifma_ifp = ifp;
2968 if_addmulti(struct ifnet *ifp, struct sockaddr *sa,
2979 IF_ADDR_WLOCK(ifp);
2980 ifma = if_findmulti(ifp, sa);
2985 IF_ADDR_WUNLOCK(ifp);
2997 if (ifp->if_resolvemulti != NULL) {
2998 error = ifp->if_resolvemulti(ifp, &llsa, sa);
3007 ifma = if_allocmulti(ifp, sa, llsa, M_NOWAIT);
3020 ll_ifma = if_findmulti(ifp, llsa);
3022 ll_ifma = if_allocmulti(ifp, llsa, NULL, M_NOWAIT);
3029 TAILQ_INSERT_HEAD(&ifp->if_multiaddrs, ll_ifma,
3041 TAILQ_INSERT_HEAD(&ifp->if_multiaddrs, ifma, ifma_link);
3051 IF_ADDR_WUNLOCK(ifp);
3057 if (ifp->if_ioctl != NULL) {
3058 (void) (*ifp->if_ioctl)(ifp, SIOCADDMULTI, 0);
3071 IF_ADDR_WUNLOCK(ifp);
3078 * Returns ENOENT if the entry could not be found. If ifp no longer
3080 * from subsystems which do appropriate locking to hold ifp for the
3085 if_delmulti(struct ifnet *ifp, struct sockaddr *sa)
3094 if (ifp == oifp)
3096 if (ifp != oifp)
3097 ifp = NULL;
3100 KASSERT(ifp != NULL, ("%s: ifnet went away", __func__));
3102 if (ifp == NULL)
3105 IF_ADDR_WLOCK(ifp);
3107 ifma = if_findmulti(ifp, sa);
3109 lastref = if_delmulti_locked(ifp, ifma, 0);
3110 IF_ADDR_WUNLOCK(ifp);
3115 if (lastref && ifp->if_ioctl != NULL) {
3116 (void)(*ifp->if_ioctl)(ifp, SIOCDELMULTI, 0);
3127 if_delallmulti(struct ifnet *ifp)
3132 IF_ADDR_WLOCK(ifp);
3133 TAILQ_FOREACH_SAFE(ifma, &ifp->if_multiaddrs, ifma_link, next)
3134 if_delmulti_locked(ifp, ifma, 0);
3135 IF_ADDR_WUNLOCK(ifp);
3142 * It is safe to call this routine if the ifp disappeared.
3147 struct ifnet *ifp;
3150 ifp = ifma->ifma_ifp;
3152 if (ifp == NULL) {
3159 if (ifp == oifp)
3161 if (ifp != oifp) {
3162 printf("%s: ifnet %p disappeared\n", __func__, ifp);
3163 ifp = NULL;
3171 if (ifp != NULL)
3172 IF_ADDR_WLOCK(ifp);
3174 lastref = if_delmulti_locked(ifp, ifma, 0);
3176 if (ifp != NULL) {
3182 IF_ADDR_WUNLOCK(ifp);
3183 if (lastref && ifp->if_ioctl != NULL) {
3184 (void)(*ifp->if_ioctl)(ifp, SIOCDELMULTI, 0);
3197 if_delmulti_locked(struct ifnet *ifp, struct ifmultiaddr *ifma, int detaching)
3201 if (ifp != NULL && ifma->ifma_ifp != NULL) {
3202 KASSERT(ifma->ifma_ifp == ifp,
3203 ("%s: inconsistent ifp %p", __func__, ifp));
3204 IF_ADDR_WLOCK_ASSERT(ifp);
3207 ifp = ifma->ifma_ifp;
3218 printf("%s: detaching ifnet instance %p\n", __func__, ifp);
3221 * ifp may already be nulled out if we are being reentered
3224 if (ifp != NULL) {
3244 if (ifp != NULL) {
3245 TAILQ_REMOVE(&ifp->if_multiaddrs, ll_ifma,
3252 if (ifp != NULL)
3253 TAILQ_REMOVE(&ifp->if_multiaddrs, ifma, ifma_link);
3271 if_setlladdr(struct ifnet *ifp, const u_char *lladdr, int len)
3277 IF_ADDR_RLOCK(ifp);
3278 ifa = ifp->if_addr;
3280 IF_ADDR_RUNLOCK(ifp);
3284 IF_ADDR_RUNLOCK(ifp);
3294 switch (ifp->if_type) {
3317 if ((ifp->if_flags & IFF_UP) != 0) {
3318 if (ifp->if_ioctl) {
3319 ifp->if_flags &= ~IFF_UP;
3320 ifr.ifr_flags = ifp->if_flags & 0xffff;
3321 ifr.ifr_flagshigh = ifp->if_flags >> 16;
3322 (*ifp->if_ioctl)(ifp, SIOCSIFFLAGS, (caddr_t)&ifr);
3323 ifp->if_flags |= IFF_UP;
3324 ifr.ifr_flags = ifp->if_flags & 0xffff;
3325 ifr.ifr_flagshigh = ifp->if_flags >> 16;
3326 (*ifp->if_ioctl)(ifp, SIOCSIFFLAGS, (caddr_t)&ifr);
3333 TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
3335 arp_ifinit(ifp, ifa);
3349 if_initname(struct ifnet *ifp, const char *name, int unit)
3351 ifp->if_dname = name;
3352 ifp->if_dunit = unit;
3354 snprintf(ifp->if_xname, IFNAMSIZ, "%s%d", name, unit);
3356 strlcpy(ifp->if_xname, name, IFNAMSIZ);
3360 if_printf(struct ifnet *ifp, const char * fmt, ...)
3365 retval = printf("%s: ", ifp->if_xname);
3373 if_start(struct ifnet *ifp)
3376 (*(ifp)->if_start)(ifp);
3384 if_transmit(struct ifnet *ifp, struct mbuf *m)
3388 IFQ_HANDOFF(ifp, m, error);
3393 if_handoff(struct ifqueue *ifq, struct mbuf *m, struct ifnet *ifp, int adjust)
3404 if (ifp != NULL) {
3405 ifp->if_obytes += m->m_pkthdr.len + adjust;
3407 ifp->if_omcasts++;
3408 active = ifp->if_drv_flags & IFF_DRV_OACTIVE;
3412 if (ifp != NULL && !active)
3413 (*(ifp)->if_start)(ifp);