Skip to content

Commit 3e0e9c2

Browse files
mctpd: fix route creation for bridged gatewayed endpoints
if ifindex is zero and mctp_fq_addr is valid then only gateway routes are created. Immediately after bridge allocates the EID to downstream endpoint, they could initiate communication to bridge -> busowner which requires routes to those endpoints for busowner to respond back. Fix: update ifindex as zero for gateway route creation and deletion. Also setup routes for downstream endpoints right allocation of eid happens by the bridge. Signed-off-by: Faizan Ali <[email protected]>
1 parent 291baca commit 3e0e9c2

File tree

1 file changed

+25
-15
lines changed

1 file changed

+25
-15
lines changed

src/mctpd.c

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2840,8 +2840,8 @@ static int peer_route_update(struct peer *peer, uint16_t type)
28402840
gw_addr.net = peer->net;
28412841
gw_addr.eid = peer->eid;
28422842
rc = mctp_nl_route_del(peer->ctx->nl, peer->pool_start,
2843-
peer->pool_size - 1,
2844-
peer->phys.ifindex, &gw_addr);
2843+
peer->pool_size - 1, 0,
2844+
&gw_addr);
28452845
if (rc < 0)
28462846
warnx("failed to delete route for peer pool eids %d-%d %s",
28472847
peer->pool_start,
@@ -4707,12 +4707,35 @@ static int endpoint_allocate_eids(struct peer *peer)
47074707
warnx("Invalid pool start %d", peer->pool_start);
47084708
return -1;
47094709
}
4710+
/* Add gateway route for all bridge's downstream EIDs.
4711+
* After allocation, the endpoint may initiate communication
4712+
* immediately, so set up routes for downstream endpoints beforehand.
4713+
*/
4714+
struct mctp_fq_addr gw_addr = { 0 };
4715+
gw_addr.net = peer->net;
4716+
gw_addr.eid = peer->eid;
4717+
rc = mctp_nl_route_add(peer->ctx->nl, peer->pool_start,
4718+
peer->pool_size - 1, 0, &gw_addr, peer->mtu);
4719+
if (rc < 0 && rc != -EEXIST) {
4720+
warnx("Failed to add gateway route for EID %d: %s", gw_addr.eid,
4721+
strerror(-rc));
4722+
return rc;
4723+
}
4724+
47104725
rc = endpoint_send_allocate_endpoint_ids(
47114726
peer, peer->pool_start, peer->pool_size,
47124727
mctp_ctrl_cmd_allocate_eids_alloc_eids, &allocated_pool_size,
47134728
&allocated_pool_start);
47144729
if (rc) {
47154730
warnx("Failed to allocate downstream EIDs");
4731+
// delete prior set routes for downstream endpoints
4732+
rc = mctp_nl_route_del(peer->ctx->nl, peer->pool_start,
4733+
peer->pool_size - 1, 0, &gw_addr);
4734+
if (rc < 0)
4735+
warnx("failed to delete route for peer pool eids %d-%d %s",
4736+
peer->pool_start,
4737+
peer->pool_start + peer->pool_size - 1,
4738+
strerror(-rc));
47164739
//reset peer pool
47174740
peer->pool_size = 0;
47184741
peer->pool_start = 0;
@@ -4724,19 +4747,6 @@ static int endpoint_allocate_eids(struct peer *peer)
47244747
if (!peer->pool_size)
47254748
return 0;
47264749

4727-
// add gateway route for all bridge's downstream eids
4728-
struct mctp_fq_addr gw_addr = { 0 };
4729-
gw_addr.net = peer->net;
4730-
gw_addr.eid = peer->eid;
4731-
rc = mctp_nl_route_add(peer->ctx->nl, peer->pool_start,
4732-
peer->pool_size - 1, peer->phys.ifindex,
4733-
&gw_addr, peer->mtu);
4734-
if (rc < 0 && rc != -EEXIST) {
4735-
warnx("Failed to add gateway route for EID %d: %s", gw_addr.eid,
4736-
strerror(-rc));
4737-
return rc;
4738-
}
4739-
47404750
sd_bus_add_object_vtable(peer->ctx->bus, &peer->slot_bridge, peer->path,
47414751
CC_MCTP_DBUS_IFACE_BRIDGE, bus_endpoint_bridge,
47424752
peer);

0 commit comments

Comments
 (0)