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]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to