diff --git a/net/netdev/netdev_carrier.c b/net/netdev/netdev_carrier.c index 1c882f5022..43717b2605 100644 --- a/net/netdev/netdev_carrier.c +++ b/net/netdev/netdev_carrier.c @@ -105,6 +105,11 @@ int netdev_carrier_off(FAR struct net_driver_s *dev) { dev->d_flags &= ~IFF_RUNNING; netlink_device_notify(dev); + + /* Notify clients that the network has been taken down */ + + devif_dev_event(dev, NULL, NETDEV_DOWN); + return OK; } diff --git a/net/tcp/tcp_send_buffered.c b/net/tcp/tcp_send_buffered.c index 78d535bb83..c58ed1e3f1 100644 --- a/net/tcp/tcp_send_buffered.c +++ b/net/tcp/tcp_send_buffered.c @@ -205,7 +205,8 @@ static void psock_writebuffer_notify(FAR struct tcp_conn_s *conn) ****************************************************************************/ static inline void psock_lost_connection(FAR struct socket *psock, - FAR struct tcp_conn_s *conn) + FAR struct tcp_conn_s *conn, + bool abort) { FAR sq_entry_t *entry; FAR sq_entry_t *next; @@ -245,6 +246,14 @@ static inline void psock_lost_connection(FAR struct socket *psock, conn->sent = 0; conn->sndseq_max = 0; + + /* Force abort the connection. */ + + if (abort) + { + conn->tx_unacked = 0; + conn->tcpstateflags = TCP_CLOSED; + } } } @@ -503,7 +512,7 @@ static uint16_t psock_send_eventhandler(FAR struct net_driver_s *dev, /* Free write buffers and terminate polling */ - psock_lost_connection(psock, conn); + psock_lost_connection(psock, conn, !!(flags & NETDEV_DOWN)); return flags; }