Changeset View
Changeset View
Standalone View
Standalone View
sys/net/if_llatbl.c
Show First 20 Lines • Show All 788 Lines • ▼ Show 20 Lines | |||||
int | int | ||||
lltable_get_af(const struct lltable *llt) | lltable_get_af(const struct lltable *llt) | ||||
{ | { | ||||
return (llt->llt_af); | return (llt->llt_af); | ||||
} | } | ||||
static bool | |||||
fill_lladdr(struct ifnet *ifp, int family, struct llentry *lle, char *lladdr) | |||||
{ | |||||
uint8_t linkhdr[LLE_MAX_LINKHDR]; | |||||
size_t linkhdrsize; | |||||
int lladdr_off; | |||||
linkhdrsize = sizeof(linkhdr); | |||||
if (lltable_calc_llheader(ifp, family, lladdr, linkhdr, &linkhdrsize, | |||||
&lladdr_off) != 0) | |||||
return (false); | |||||
lltable_set_entry_addr(ifp, lle, linkhdr, linkhdrsize, lladdr_off); | |||||
return (true); | |||||
} | |||||
/* | /* | ||||
* Called in route_output when rtm_flags contains RTF_LLDATA. | * Called in route_output when rtm_flags contains RTF_LLDATA. | ||||
*/ | */ | ||||
int | int | ||||
lla_rt_output(struct rt_msghdr *rtm, struct rt_addrinfo *info) | lla_rt_output(struct rt_msghdr *rtm, struct rt_addrinfo *info) | ||||
{ | { | ||||
struct sockaddr_dl *dl = | struct sockaddr_dl *dl = | ||||
(struct sockaddr_dl *)info->rti_info[RTAX_GATEWAY]; | (struct sockaddr_dl *)info->rti_info[RTAX_GATEWAY]; | ||||
struct sockaddr *dst = (struct sockaddr *)info->rti_info[RTAX_DST]; | struct sockaddr *dst = (struct sockaddr *)info->rti_info[RTAX_DST]; | ||||
struct ifnet *ifp; | struct ifnet *ifp; | ||||
struct lltable *llt; | struct lltable *llt; | ||||
struct llentry *lle, *lle_tmp; | struct llentry *lle, *lle_tmp; | ||||
uint8_t linkhdr[LLE_MAX_LINKHDR]; | |||||
size_t linkhdrsize; | |||||
int lladdr_off; | |||||
u_int laflags = 0; | u_int laflags = 0; | ||||
bool discard; | |||||
int error; | int error; | ||||
if (dl == NULL || dl->sdl_family != AF_LINK) | if (dl == NULL || dl->sdl_family != AF_LINK) | ||||
return (EINVAL); | return (EINVAL); | ||||
/* XXX: should be ntohs() */ | /* XXX: should be ntohs() */ | ||||
ifp = ifnet_byindex(dl->sdl_index); | ifp = ifnet_byindex(dl->sdl_index); | ||||
if (ifp == NULL) { | if (ifp == NULL) { | ||||
Show All 14 Lines | if (llt == NULL) | ||||
return (ESRCH); | return (ESRCH); | ||||
error = 0; | error = 0; | ||||
switch (rtm->rtm_type) { | switch (rtm->rtm_type) { | ||||
case RTM_ADD: | case RTM_ADD: | ||||
/* Add static LLE */ | /* Add static LLE */ | ||||
laflags = 0; | laflags = 0; | ||||
if (rtm->rtm_rmx.rmx_expire == 0) | discard = rtm->rtm_flags & (RTF_BLACKHOLE|RTF_REJECT); | ||||
if ((rtm->rtm_rmx.rmx_expire == 0) && !discard) | |||||
laflags = LLE_STATIC; | laflags = LLE_STATIC; | ||||
lle = lltable_alloc_entry(llt, laflags, dst); | lle = lltable_alloc_entry(llt, laflags, dst); | ||||
if (lle == NULL) | if (lle == NULL) | ||||
return (ENOMEM); | return (ENOMEM); | ||||
linkhdrsize = sizeof(linkhdr); | if (!discard) { | ||||
if (lltable_calc_llheader(ifp, dst->sa_family, LLADDR(dl), | if (!fill_lladdr(ifp, dst->sa_family, lle, LLADDR(dl))) | ||||
linkhdr, &linkhdrsize, &lladdr_off) != 0) | |||||
return (EINVAL); | return (EINVAL); | ||||
lltable_set_entry_addr(ifp, lle, linkhdr, linkhdrsize, | } else { | ||||
lladdr_off); | if (rtm->rtm_flags & RTF_REJECT) | ||||
lle->la_flags |= LLE_REJECT; | |||||
else | |||||
lle->la_flags |= LLE_DISCARD; | |||||
} | |||||
if ((rtm->rtm_flags & RTF_ANNOUNCE)) | if ((rtm->rtm_flags & RTF_ANNOUNCE)) | ||||
lle->la_flags |= LLE_PUB; | lle->la_flags |= LLE_PUB; | ||||
lle->la_expire = rtm->rtm_rmx.rmx_expire; | lle->la_expire = rtm->rtm_rmx.rmx_expire; | ||||
laflags = lle->la_flags; | laflags = lle->la_flags; | ||||
/* Try to link new entry */ | /* Try to link new entry */ | ||||
lle_tmp = NULL; | lle_tmp = NULL; | ||||
▲ Show 20 Lines • Show All 181 Lines • Show Last 20 Lines |