@@ -348,14 +348,20 @@ public struct NetlinkSession {
348348 /// Adds a default IPv4 route to an interface.
349349 /// - Parameters:
350350 /// - interface: The name of the interface.
351- /// - ipv4Gateway: The gateway address.
351+ /// - ipv4Gateway: The gateway address, or nil .
352352 public func routeAddDefault(
353353 interface: String ,
354- ipv4Gateway: IPv4Address
354+ ipv4Gateway: IPv4Address ?
355355 ) throws {
356- // ip route add default via [dst-address] src [src-address]
357- let dstAddrBytes = ipv4Gateway. bytes
358- let dstAddrAttrSize = RTAttribute . size + dstAddrBytes. count
356+ // ip route add default via [gateway] dev [interface] or
357+ // ip route add default dev [interface]
358+ let dstAddrBytes = ipv4Gateway? . bytes
359+ let dstAddrAttrSize : Int
360+ if let dstAddrBytes {
361+ dstAddrAttrSize = RTAttribute . size + dstAddrBytes. count
362+ } else {
363+ dstAddrAttrSize = 0
364+ }
359365
360366 let interfaceAttrSize = RTAttribute . size + MemoryLayout< UInt32> . size
361367 let interfaceIndex = try getInterfaceIndex ( interface)
@@ -379,16 +385,20 @@ public struct NetlinkSession {
379385 tos: 0 ,
380386 table: RouteTable . MAIN,
381387 proto: RouteProtocol . BOOT,
382- scope: RouteScope . UNIVERSE,
388+ scope: ipv4Gateway != nil ? RouteScope . UNIVERSE : RouteScope . LINK ,
383389 type: RouteType . UNICAST,
384390 flags: 0 )
385391 requestOffset = try requestInfo. appendBuffer ( & requestBuffer, offset: requestOffset)
386392
387- let dstAddrAttr = RTAttribute ( len: UInt16 ( dstAddrAttrSize) , type: RouteAttributeType . GATEWAY)
388- requestOffset = try dstAddrAttr. appendBuffer ( & requestBuffer, offset: requestOffset)
389- guard var requestOffset = requestBuffer. copyIn ( buffer: dstAddrBytes, offset: requestOffset) else {
390- throw BindError . sendMarshalFailure ( type: " RTAttribute " , field: " RTA_GATEWAY " )
393+ if let dstAddrBytes {
394+ let dstAddrAttr = RTAttribute ( len: UInt16 ( dstAddrAttrSize) , type: RouteAttributeType . GATEWAY)
395+ requestOffset = try dstAddrAttr. appendBuffer ( & requestBuffer, offset: requestOffset)
396+ guard let newOffset = requestBuffer. copyIn ( buffer: dstAddrBytes, offset: requestOffset) else {
397+ throw BindError . sendMarshalFailure ( type: " RTAttribute " , field: " RTA_GATEWAY " )
398+ }
399+ requestOffset = newOffset
391400 }
401+
392402 let interfaceAttr = RTAttribute ( len: UInt16 ( interfaceAttrSize) , type: RouteAttributeType . OIF)
393403 requestOffset = try interfaceAttr. appendBuffer ( & requestBuffer, offset: requestOffset)
394404 guard
0 commit comments