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: [email protected]
Unsubscribe: https://lists.fd.io/g/vpp-dev/leave/1480452/21656/631435203/xyzzy
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-