Skip to content

Commit a49f603

Browse files
kderdanordicjm
authored andcommitted
[nrf fromtree] net: ipv6: route: get nexthop's LL address only if relevant
This commit moves reading nexthop's LL address only if it's supported by a given neighbor and can be used for routing between interfaces. Signed-off-by: Konrad Derda <[email protected]> (cherry picked from commit 5e4e63b)
1 parent 695e407 commit a49f603

File tree

1 file changed

+15
-13
lines changed

1 file changed

+15
-13
lines changed

subsys/net/ip/route.c

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1031,7 +1031,7 @@ static bool is_ll_addr_supported(struct net_if *iface)
10311031

10321032
int net_route_packet(struct net_pkt *pkt, struct in6_addr *nexthop)
10331033
{
1034-
struct net_linkaddr_storage *lladdr;
1034+
struct net_linkaddr_storage *lladdr = NULL;
10351035
struct net_nbr *nbr;
10361036
int err;
10371037

@@ -1045,16 +1045,16 @@ int net_route_packet(struct net_pkt *pkt, struct in6_addr *nexthop)
10451045
goto error;
10461046
}
10471047

1048-
lladdr = net_nbr_get_lladdr(nbr->idx);
1049-
if (!lladdr) {
1050-
NET_DBG("Cannot find %s neighbor link layer address.",
1051-
net_sprint_ipv6_addr(nexthop));
1052-
err = -ESRCH;
1053-
goto error;
1054-
}
1055-
1056-
if (is_ll_addr_supported(net_pkt_iface(pkt)) &&
1048+
if (is_ll_addr_supported(nbr->iface) && is_ll_addr_supported(net_pkt_iface(pkt)) &&
10571049
is_ll_addr_supported(net_pkt_orig_iface(pkt))) {
1050+
lladdr = net_nbr_get_lladdr(nbr->idx);
1051+
if (!lladdr) {
1052+
NET_DBG("Cannot find %s neighbor link layer address.",
1053+
net_sprint_ipv6_addr(nexthop));
1054+
err = -ESRCH;
1055+
goto error;
1056+
}
1057+
10581058
if (!net_pkt_lladdr_src(pkt)->addr) {
10591059
NET_DBG("Link layer source address not set");
10601060
err = -EINVAL;
@@ -1084,9 +1084,11 @@ int net_route_packet(struct net_pkt *pkt, struct in6_addr *nexthop)
10841084
net_pkt_lladdr_src(pkt)->len = net_pkt_lladdr_if(pkt)->len;
10851085
}
10861086

1087-
net_pkt_lladdr_dst(pkt)->addr = lladdr->addr;
1088-
net_pkt_lladdr_dst(pkt)->type = lladdr->type;
1089-
net_pkt_lladdr_dst(pkt)->len = lladdr->len;
1087+
if (lladdr) {
1088+
net_pkt_lladdr_dst(pkt)->addr = lladdr->addr;
1089+
net_pkt_lladdr_dst(pkt)->type = lladdr->type;
1090+
net_pkt_lladdr_dst(pkt)->len = lladdr->len;
1091+
}
10901092

10911093
net_pkt_set_iface(pkt, nbr->iface);
10921094

0 commit comments

Comments
 (0)