Changeset View
Changeset View
Standalone View
Standalone View
sys/net/if.c
Show First 20 Lines • Show All 1,830 Lines • ▼ Show 20 Lines | |||||
ifa_maintain_loopback_route(int cmd, const char *otype, struct ifaddr *ifa, | ifa_maintain_loopback_route(int cmd, const char *otype, struct ifaddr *ifa, | ||||
struct sockaddr *ia) | struct sockaddr *ia) | ||||
{ | { | ||||
struct epoch_tracker et; | struct epoch_tracker et; | ||||
int error; | int error; | ||||
struct rt_addrinfo info; | struct rt_addrinfo info; | ||||
struct sockaddr_dl null_sdl; | struct sockaddr_dl null_sdl; | ||||
struct ifnet *ifp; | struct ifnet *ifp; | ||||
struct ifaddr *rti_ifa = NULL; | |||||
ifp = ifa->ifa_ifp; | ifp = ifa->ifa_ifp; | ||||
bzero(&info, sizeof(info)); | bzero(&info, sizeof(info)); | ||||
if (cmd != RTM_DELETE) | if (cmd != RTM_DELETE) | ||||
info.rti_ifp = V_loif; | info.rti_ifp = V_loif; | ||||
if (cmd == RTM_ADD) { | if (cmd == RTM_ADD) { | ||||
/* explicitly specify (loopback) ifa */ | /* explicitly specify (loopback) ifa */ | ||||
if (info.rti_ifp != NULL) { | if (info.rti_ifp != NULL) { | ||||
NET_EPOCH_ENTER(et); | NET_EPOCH_ENTER(et); | ||||
info.rti_ifa = ifaof_ifpforaddr(ifa->ifa_addr, info.rti_ifp); | rti_ifa = ifaof_ifpforaddr(ifa->ifa_addr, info.rti_ifp); | ||||
if (info.rti_ifa != NULL) | if (rti_ifa != NULL) | ||||
ifa_ref(info.rti_ifa); | ifa_ref(rti_ifa); | ||||
info.rti_ifa = rti_ifa; | |||||
NET_EPOCH_EXIT(et); | NET_EPOCH_EXIT(et); | ||||
} | } | ||||
} | } | ||||
info.rti_flags = ifa->ifa_flags | RTF_HOST | RTF_STATIC | RTF_PINNED; | info.rti_flags = ifa->ifa_flags | RTF_HOST | RTF_STATIC | RTF_PINNED; | ||||
info.rti_info[RTAX_DST] = ia; | info.rti_info[RTAX_DST] = ia; | ||||
info.rti_info[RTAX_GATEWAY] = (struct sockaddr *)&null_sdl; | info.rti_info[RTAX_GATEWAY] = (struct sockaddr *)&null_sdl; | ||||
link_init_sdl(ifp, (struct sockaddr *)&null_sdl, ifp->if_type); | link_init_sdl(ifp, (struct sockaddr *)&null_sdl, ifp->if_type); | ||||
error = rtrequest1_fib(cmd, &info, NULL, ifp->if_fib); | error = rtrequest1_fib(cmd, &info, NULL, ifp->if_fib); | ||||
if (rti_ifa != NULL) | |||||
ifa_free(rti_ifa); | |||||
if (error != 0 && | if (error != 0 && | ||||
!(cmd == RTM_ADD && error == EEXIST) && | !(cmd == RTM_ADD && error == EEXIST) && | ||||
!(cmd == RTM_DELETE && error == ENOENT)) | !(cmd == RTM_DELETE && error == ENOENT)) | ||||
if_printf(ifp, "%s failed: %d\n", otype, error); | if_printf(ifp, "%s failed: %d\n", otype, error); | ||||
return (error); | return (error); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 2,680 Lines • Show Last 20 Lines |