Skip to content

Commit 19dbb10

Browse files
committed
add BGP and LDP ECMP support (IPv4/6)
1 parent 7863012 commit 19dbb10

File tree

1 file changed

+63
-8
lines changed

1 file changed

+63
-8
lines changed

code/bngblaster/src/bbl_tcp.c

Lines changed: 63 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -823,7 +823,9 @@ void
823823
bbl_tcp_ipv4_rx(bbl_network_interface_s *interface, bbl_ethernet_header_s *eth, bbl_ipv4_s *ipv4) {
824824
struct pbuf *pbuf;
825825
bbl_tcp_s *tcp;
826-
bgp_session_s *session;
826+
ldp_instance_s *instance;
827+
ldp_session_s *ldp_session;
828+
bgp_session_s *bgp_session;
827829

828830
UNUSED(eth);
829831

@@ -843,13 +845,30 @@ bbl_tcp_ipv4_rx(bbl_network_interface_s *interface, bbl_ethernet_header_s *eth,
843845
#endif
844846

845847
if(tcp->dst == BGP_PORT || tcp->src == BGP_PORT) {
846-
session = g_ctx->bgp_sessions;
847-
while(session) {
848-
if(session->ipv4_local_address == ipv4->dst &&
849-
session->ipv4_peer_address == ipv4->src) {
850-
interface = session->interface;
848+
bgp_session = g_ctx->bgp_sessions;
849+
while(bgp_session) {
850+
if(bgp_session->ipv4_local_address == ipv4->dst &&
851+
bgp_session->ipv4_peer_address == ipv4->src) {
852+
interface = bgp_session->interface;
853+
break;
854+
}
855+
bgp_session = bgp_session->next;
856+
}
857+
}
858+
if(tcp->dst == LDP_PORT || tcp->src == LDP_PORT) {
859+
instance = g_ctx->ldp_instances;
860+
while(instance) {
861+
ldp_session = instance->sessions;
862+
instance = instance->next;
863+
while(ldp_session) {
864+
if(ldp_session->local.ipv4_address == ipv4->dst &&
865+
ldp_session->peer.ipv4_address == ipv4->src) {
866+
interface = ldp_session->interface;
867+
instance = NULL;
868+
break;
869+
}
870+
ldp_session = ldp_session->next;
851871
}
852-
session = session->next;
853872
}
854873
}
855874

@@ -912,6 +931,11 @@ void
912931
bbl_tcp_ipv6_rx(bbl_network_interface_s *interface, bbl_ethernet_header_s *eth, bbl_ipv6_s *ipv6)
913932
{
914933
struct pbuf *pbuf;
934+
bbl_tcp_s *tcp;
935+
ldp_instance_s *instance;
936+
ldp_session_s *ldp_session;
937+
bgp_session_s *bgp_session;
938+
915939
UNUSED(eth);
916940

917941
if(!g_ctx->tcp) {
@@ -920,14 +944,45 @@ bbl_tcp_ipv6_rx(bbl_network_interface_s *interface, bbl_ethernet_header_s *eth,
920944
}
921945
interface->stats.tcp_rx++;
922946

947+
tcp = (bbl_tcp_s*)ipv6->next;
948+
923949
#if BNGBLASTER_TCP_DEBUG
924-
bbl_tcp_s *tcp = (bbl_tcp_s*)ipv6->next;
925950
LOG(DEBUG, "TCP (%s [%s]:%u - [%s]:%u) packet received\n",
926951
interface->name,
927952
format_ipv6_address((ipv6addr_t*)ipv6->dst), tcp->dst,
928953
format_ipv6_address((ipv6addr_t*)ipv6->src), tcp->src);
929954
#endif
930955

956+
if(tcp->dst == BGP_PORT || tcp->src == BGP_PORT) {
957+
bgp_session = g_ctx->bgp_sessions;
958+
while(bgp_session) {
959+
if(bgp_session->ipv6_local_address &&
960+
bgp_session->ipv6_peer_address &&
961+
memcpy(bgp_session->ipv6_local_address, ipv6->dst, IPV6_ADDR_LEN) == 0 &&
962+
memcpy(bgp_session->ipv6_peer_address, ipv6->src, IPV6_ADDR_LEN) == 0) {
963+
interface = bgp_session->interface;
964+
break;
965+
}
966+
bgp_session = bgp_session->next;
967+
}
968+
}
969+
if(tcp->dst == LDP_PORT || tcp->src == LDP_PORT) {
970+
instance = g_ctx->ldp_instances;
971+
while(instance) {
972+
ldp_session = instance->sessions;
973+
instance = instance->next;
974+
while(ldp_session) {
975+
if(memcpy(&ldp_session->local.ipv6_address, ipv6->dst, IPV6_ADDR_LEN) == 0 &&
976+
memcpy(&ldp_session->peer.ipv6_address, ipv6->src, IPV6_ADDR_LEN) == 0) {
977+
interface = ldp_session->interface;
978+
instance = NULL;
979+
break;
980+
}
981+
ldp_session = ldp_session->next;
982+
}
983+
}
984+
}
985+
931986
pbuf = pbuf_alloc_reference(ipv6->hdr, ipv6->len, PBUF_ROM);
932987
interface->netif.input(pbuf, &interface->netif);
933988

0 commit comments

Comments
 (0)