diff --git a/lib/gat/modules/net_listener/module.go b/lib/gat/modules/net_listener/module.go
index 91b4f6dabdc2be2db6493a5783d978c50ef80909..e214c1c1212943059c5822c2b81b9ff02517a49f 100644
--- a/lib/gat/modules/net_listener/module.go
+++ b/lib/gat/modules/net_listener/module.go
@@ -15,6 +15,7 @@ type Module struct {
 	Config
 
 	listener net.Listener
+	closed   chan struct{}
 	accepted chan<- gat.AcceptedConn
 }
 
@@ -26,6 +27,8 @@ func (T *Module) Start() error {
 		return nil
 	}
 
+	T.closed = make(chan struct{})
+
 	var err error
 	T.listener, err = net.Listen(T.Network, T.Address)
 	if err != nil {
@@ -40,6 +43,7 @@ func (T *Module) Stop() error {
 	if err := T.listener.Close(); err != nil {
 		return err
 	}
+	close(T.closed)
 	return nil
 }
 
@@ -61,10 +65,13 @@ func (T *Module) accept(raw net.Conn) {
 		log.Printf("failed to accept conn: %v", err)
 		return
 	}
-	_ = params // TODO(garet)
-	T.accepted <- gat.AcceptedConn{
+	select {
+	case T.accepted <- gat.AcceptedConn{
 		Conn:   conn,
 		Params: params,
+	}:
+	case <-T.closed:
+		_ = conn.Close()
 	}
 }