From 9e7f8978fa4d59d1e351f98978c4c92cea0e88cf Mon Sep 17 00:00:00 2001 From: Steve Karg Date: Thu, 13 Jul 2023 16:52:30 -0500 Subject: [PATCH] fix router apps action for unknown dnet (#454) Co-authored-by: Steve Karg --- apps/router-ipv6/main.c | 14 +++++++++++--- apps/router-mstp/main.c | 13 ++++++++++--- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/apps/router-ipv6/main.c b/apps/router-ipv6/main.c index 480923a9..4c13eff5 100644 --- a/apps/router-ipv6/main.c +++ b/apps/router-ipv6/main.c @@ -664,7 +664,8 @@ static void network_control_handler(uint16_t snet, case NETWORK_MESSAGE_I_AM_ROUTER_TO_NETWORK: /* add its DNETs to our routing table */ fprintf(stderr, "for Networks: "); - while (npdu_len) { + len = 2; + while (npdu_len >= len) { len = decode_unsigned16(&npdu[npdu_offset], &dnet); fprintf(stderr, "%hu", dnet); dnet_add(snet, dnet, src); @@ -912,8 +913,15 @@ static void routed_apdu_handler(uint16_t snet, routed_src_address(&router_src, snet, src); npdu_len = npdu_encode_pdu(&Tx_Buffer[0], dest, &router_src, npdu); memmove(&Tx_Buffer[npdu_len], apdu, apdu_len); - datalink_send_pdu( - port->net, dest, npdu, &Tx_Buffer[0], npdu_len + apdu_len); + /* send to all other ports */ + port = Router_Table_Head; + while (port != NULL) { + if (port->net != snet) { + datalink_send_pdu(port->net, dest, npdu, &Tx_Buffer[0], + npdu_len + apdu_len); + } + port = port->next; + } /* If the next router is unknown, an attempt shall be made to identify it using a Who-Is-Router-To-Network message. */ send_who_is_router_to_network(0, dest->net); diff --git a/apps/router-mstp/main.c b/apps/router-mstp/main.c index 06cbc45f..8aba77da 100644 --- a/apps/router-mstp/main.c +++ b/apps/router-mstp/main.c @@ -902,7 +902,7 @@ static void routed_apdu_handler(uint16_t snet, datalink_send_pdu(port->net, &remote_dest, npdu, &Tx_Buffer[0], npdu_len + apdu_len); } - } else if (port && dest->net) { + } else if (dest->net) { debug_printf("Routing to Unknown Route %u\n", (unsigned)dest->net); /* Case 3: a global broadcast is required. */ dest->mac_len = 0; @@ -911,8 +911,15 @@ static void routed_apdu_handler(uint16_t snet, routed_src_address(&router_src, snet, src); npdu_len = npdu_encode_pdu(&Tx_Buffer[0], dest, &router_src, npdu); memmove(&Tx_Buffer[npdu_len], apdu, apdu_len); - datalink_send_pdu( - port->net, dest, npdu, &Tx_Buffer[0], npdu_len + apdu_len); + /* send to all other ports */ + port = Router_Table_Head; + while (port != NULL) { + if (port->net != snet) { + datalink_send_pdu(port->net, dest, npdu, &Tx_Buffer[0], + npdu_len + apdu_len); + } + port = port->next; + } /* If the next router is unknown, an attempt shall be made to identify it using a Who-Is-Router-To-Network message. */ send_who_is_router_to_network(0, dest->net);