Hi list, We have update coded from the upstream session&tcp changes to our code base and find a possible bug which cause tcp connection can't be established anymore.
Our scenario is that we will connect to a remote tcp server with specified local port and local ip, however, new vpp code have introduced a lcl_endpts_freelist which will be either flushed when pending local endpoint exceeded the limit (32) or when transport_alloc_local_port is called. However, since we specify the local port and local ip and the total session count is limited (< 32), in this case, the transport_cleanup_freelist will never be called which cause the previous session which use the specified local port and local ip will not be released after the session aborted. I think we should also try to free the list in such case as I did in the following code: int > transport_alloc_local_endpoint (u8 proto, transport_endpoint_cfg_t * > rmt_cfg, > ip46_address_t * lcl_addr, u16 * lcl_port) > { > // ZDY: > transport_main_t *tm = &tp_main; > transport_endpoint_t *rmt = (transport_endpoint_t *) rmt_cfg; > session_error_t error; > int port; > > /* > * Find the local address > */ > if (ip_is_zero (&rmt_cfg->peer.ip, rmt_cfg->peer.is_ip4)) > { > error = transport_find_local_ip_for_remote > (&rmt_cfg->peer.sw_if_index, > rmt, lcl_addr); > if (error) > return error; > } > else > { > /* Assume session layer vetted this address */ > clib_memcpy_fast (lcl_addr, &rmt_cfg->peer.ip, > sizeof (rmt_cfg->peer.ip)); > } > > /* > * Allocate source port > */ > if (rmt_cfg->peer.port == 0) > { > port = transport_alloc_local_port (proto, lcl_addr, rmt_cfg); > if (port < 1) > return SESSION_E_NOPORT; > *lcl_port = port; > } > else > { > port = clib_net_to_host_u16 (rmt_cfg->peer.port); > *lcl_port = port; > > > > > > > * // ZDY: need add this to to cleanup because in specified src port > // case, we will not run to transport_alloc_local_port, then // > freelist will only be freeed when list is full (>32). /* Cleanup > freelist if need be */ if (vec_len (tm->lcl_endpts_freelist)) > transport_cleanup_freelist ();* > > return transport_endpoint_mark_used (proto, lcl_addr, port); > } > > return 0; > } >
-=-=-=-=-=-=-=-=-=-=-=- Links: You receive all messages sent to this group. View/Reply Online (#22698): https://lists.fd.io/g/vpp-dev/message/22698 Mute This Topic: https://lists.fd.io/mt/97596886/21656 Group Owner: vpp-dev+ow...@lists.fd.io Unsubscribe: https://lists.fd.io/g/vpp-dev/leave/1480452/21656/631435203/xyzzy [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-