diff --git a/sys/net/route/nhop_ctl.c b/sys/net/route/nhop_ctl.c --- a/sys/net/route/nhop_ctl.c +++ b/sys/net/route/nhop_ctl.c @@ -753,7 +753,14 @@ bool nhop_set_gw(struct nhop_object *nh, const struct sockaddr *gw, bool is_gw) { - if (gw->sa_len > sizeof(nh->gw_buf)) { + unsigned char sa_len; + + if (gw->sa_family != AF_LINK) + sa_len = gw->sa_len; + else + sa_len = sizeof(struct sockaddr_dl_short); + + if (sa_len > sizeof(nh->gw_buf)) { FIB_NH_LOG(LOG_DEBUG, nh, "nhop SA size too big: AF %d len %u", gw->sa_family, gw->sa_len); return (false); @@ -766,8 +773,11 @@ return (false); } - memcpy(&nh->gw_sa, gw, gw->sa_len); - memset(&nh->gw_buf[gw->sa_len], 0, sizeof(nh->gw_buf) - gw->sa_len); + memcpy(&nh->gw_sa, gw, sa_len); + memset(&nh->gw_buf[sa_len], 0, sizeof(nh->gw_buf) - sa_len); + + if (gw->sa_family == AF_LINK) + nh->gwl_sa.sdl_len = sa_len; if (is_gw) { nh->nh_flags |= NHF_GATEWAY;