From e1ee59f176c2acb01eefa8b83e54e1d0377930b1 Mon Sep 17 00:00:00 2001
From: Jacek Kowalski <Jacek@jacekk.info>
Date: Thu, 12 Mar 2026 23:58:38 +0000
Subject: [PATCH] Add nogw/nogw4/nogw6 options to prevent assignment of gateway

---
 lib/NetworkDriver.py |   34 ++++++++++++++++++++++++++++++++--
 1 files changed, 32 insertions(+), 2 deletions(-)

diff --git a/lib/NetworkDriver.py b/lib/NetworkDriver.py
index 6fa4a0d..948a6a6 100644
--- a/lib/NetworkDriver.py
+++ b/lib/NetworkDriver.py
@@ -40,7 +40,16 @@
             print(ip.link("set", index=idx, master=id_parent))
         endpoint.Interface.Peer = ifname1
 
-    return ifname0
+    return ifname0, ifname1
+
+
+def delete_interface(interface):
+    try:
+        with pyroute2.IPRoute() as ip:
+            idx = ip.link_lookup(ifname=interface)[0]
+            ip.link("delete", index=idx)
+    except:
+        pass
 
 
 @app.route('/NetworkDriver.GetCapabilities', methods=['POST'])
@@ -48,6 +57,21 @@
     return {
         'Scope': 'local',
         'ConnectivityScope': 'global',
+        'GwAllocChecker': True,
+    }
+
+
+@app.route('/NetworkDriver.GwAllocCheck', methods=['POST'])
+def GwAllocCheck():
+    request = GwAllocCheckEntity(**flask.request.get_json(force=True))
+    skip_ipv4 = skip_ipv6 = request.Options.get('com.docker.network.generic', {}).get('nogw') == '1'
+    if request.Options.get('com.docker.network.generic', {}).get('nogw4') == '1':
+        skip_ipv4 = True
+    if request.Options.get('com.docker.network.generic', {}).get('nogw6') == '1':
+        skip_ipv6 = True
+    return {
+        'SkipIPv4': skip_ipv4,
+        'SkipIPv6': skip_ipv6,
     }
 
 
@@ -108,7 +132,10 @@
     network = networks[join.NetworkID]
     endpoint = endpoints['{}-{}'.format(join.NetworkID, join.EndpointID)]
 
-    interface = create_interface(endpoint, network)
+    interface, interface_external = create_interface(endpoint, network)
+
+    endpoint.internal_interface_name = interface
+    endpoint.external_interface_name = interface_external
 
     gw4 = None
     for net4 in network.IPv4:
@@ -141,6 +168,9 @@
 @app.route('/NetworkDriver.Leave', methods=['POST'])
 def Leave():
     leave = LeaveEntity(**flask.request.get_json(force=True))
+    endpoint = endpoints.get('{}-{}'.format(leave.NetworkID, leave.EndpointID), None)
+    if endpoint is not None and endpoint.external_interface_name:
+        delete_interface(endpoint.external_interface_name)
     return {}
 
 

--
Gitblit v1.10.0