823823bbl_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
912931bbl_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