Bug #943
Updated by martin1234 almost 6 years ago
Hi, It turns out the previous problem (tcp_timer_2msl) is related to calling tcp_output() in tcp_usr_connect() and tcp_connect(). For TCP PRU_CONNECT is handled on tcp_thread[0] following two functions are executed in _that_ thread: tcp_connect() and tcp_output() tcp_connect() will call in_pcbladdr() if source address is INADDR_ANY, then inp's route will be filled. If the target port of this TCP connection is not tcp_thread[0]'s port then we actually use an route entry on a different CPU and will unref it on different CPU. If we free the route entry allocated in in_pcbladdr() if target port is not tcp_thread[0]'s port, then tcp_output() in tcp_usr_connect() will cause problem too, since it is called in tcp_thread[0], an route entry in CPU0 will still be installed to inp's route. So I made following patch: - If target port is not tcp_thread[0]'s port, then we free the route entry allocated by in_pcbladdr(). - In tcp_usr_connect(), if target port is not tcp_thread[0]'s port, we dispatch tcp_output to the target port to be called. Please review it: http://leaf.dragonflybsd.org/~sephe/tcp_connect.diff Best Regards, sephe