yes, this is exactly what I want do, this patch works as expected, thanks a lot.
Florin Coras <fcoras.li...@gmail.com> 于2023年3月15日周三 01:22写道: > Hi, > > Are you looking for behavior similar to the one when random local ports > are allocated when, if port is used, we check if the 5-tuple is available? > > Don’t think we explicitly supported this before but here’s a patch [1]. > > Regards, > Florin > > [1] https://gerrit.fd.io/r/c/vpp/+/38486 > > > On Mar 14, 2023, at 12:56 AM, Zhang Dongya <fortitude.zh...@gmail.com> > wrote: > > Just use this patch and the connection can be reconnected after closed. > > However, I find another possible bug when using local ip + local port for > different target server due to transport_endpoint_mark_used return error > if it find local ip + port being created. > > I think it should increase the refcnt instead if it find 6 tuple is unique. > > static int >> transport_endpoint_mark_used (u8 proto, ip46_address_t *ip, u16 port) >> { >> transport_main_t *tm = &tp_main; >> local_endpoint_t *lep; >> u32 tei; >> >> ASSERT (vlib_get_thread_index () <= transport_cl_thread ()); >> > // BUG??? maybe should allow reuse ??? >> > tei = >> transport_endpoint_lookup (&tm->local_endpoints_table, proto, ip, >> port); >> if (tei != ENDPOINT_INVALID_INDEX) >> return SESSION_E_PORTINUSE; >> >> /* Pool reallocs with worker barrier */ >> lep = transport_endpoint_alloc (); >> clib_memcpy_fast (&lep->ep.ip, ip, sizeof (*ip)); >> lep->ep.port = port; >> lep->proto = proto; >> lep->refcnt = 1; >> >> transport_endpoint_table_add (&tm->local_endpoints_table, proto, >> &lep->ep, >> lep - tm->local_endpoints); >> >> return 0; >> } >> > > Florin Coras <fcoras.li...@gmail.com> 于2023年3月14日周二 11:38写道: > >> Hi, >> >> Could you try this out [1]? I’ve hit this issue myself today but with udp >> sessions. Unfortunately, as you’ve correctly pointed out, we were forcing a >> cleanup only on the non-fixed local port branch. >> >> Regards, >> Florin >> >> [1] https://gerrit.fd.io/r/c/vpp/+/38473 >> >> On Mar 13, 2023, at 7:35 PM, Zhang Dongya <fortitude.zh...@gmail.com> >> wrote: >> >> 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 (#22717): https://lists.fd.io/g/vpp-dev/message/22717 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] -=-=-=-=-=-=-=-=-=-=-=-