diff --git a/lib/core-net/private-lib-core-net.h b/lib/core-net/private-lib-core-net.h index c515c10d5..4fb99cdf7 100644 --- a/lib/core-net/private-lib-core-net.h +++ b/lib/core-net/private-lib-core-net.h @@ -1375,6 +1375,7 @@ _lws_routing_table_dump(struct lws_context *cx); #define LRR_IGNORE_PRI (1 << 0) #define LRR_MATCH_SRC (1 << 1) +#define LRR_MATCH_DST (1 << 2) lws_route_t * _lws_route_remove(struct lws_context_per_thread *pt, lws_route_t *robj, int flags); diff --git a/lib/core-net/route.c b/lib/core-net/route.c index 14f4beb07..c9fdc2ba2 100644 --- a/lib/core-net/route.c +++ b/lib/core-net/route.c @@ -146,7 +146,7 @@ _lws_route_remove(struct lws_context_per_thread *pt, lws_route_t *robj, int flag lws_route_t *rou = lws_container_of(d, lws_route_t, list); if ((!(flags & LRR_MATCH_SRC) || !lws_sa46_compare_ads(&robj->src, &rou->src)) && - ((flags & LRR_MATCH_SRC) || !lws_sa46_compare_ads(&robj->dest, &rou->dest)) && + (!(flags & LRR_MATCH_DST) || !lws_sa46_compare_ads(&robj->dest, &rou->dest)) && (!robj->gateway.sa4.sin_family || !lws_sa46_compare_ads(&robj->gateway, &rou->gateway)) && robj->dest_len <= rou->dest_len && diff --git a/lib/roles/netlink/ops-netlink.c b/lib/roles/netlink/ops-netlink.c index 846a97433..fa3bf29a2 100644 --- a/lib/roles/netlink/ops-netlink.c +++ b/lib/roles/netlink/ops-netlink.c @@ -371,8 +371,8 @@ ana: lws_pt_lock(pt, __func__); /* returns zero on match already in table */ - rmat = _lws_route_remove(pt, &robj, LRR_MATCH_SRC | - LRR_IGNORE_PRI); + rmat = _lws_route_remove(pt, &robj, h->nlmsg_type == RTM_NEWROUTE ? + LRR_MATCH_DST : LRR_MATCH_SRC | LRR_IGNORE_PRI); lws_pt_unlock(pt); if (rmat) {