Parcourir la source

Improved DHCP v4 support (#25)

* Allow server with v4 to work without v6

Signed-off-by: Dipen Lad <dipen.lad@gmail.com>

* Add support for DHCPv4 relays

Signed-off-by: Dipen Lad <dipen.lad@gmail.com>
Dipen Lad il y a 6 ans
Parent
commit
372d95460f
2 fichiers modifiés avec 9 ajouts et 5 suppressions
  1. 4 5
      config/config.go
  2. 5 0
      coredhcp.go

+ 4 - 5
config/config.go

@@ -124,11 +124,6 @@ func (c *Config) getListenAddress(ver protocolVersion) (*net.UDPAddr, error) {
 	if err := protoVersionCheck(ver); err != nil {
 		return nil, err
 	}
-	if exists := c.v.Get(fmt.Sprintf("server%d", ver)); exists == nil {
-		// it is valid to have no server configuration defined, and in this case
-		// no listening address and no error are returned.
-		return nil, nil
-	}
 	addr := c.v.GetString(fmt.Sprintf("server%d.listen", ver))
 	if addr == "" {
 		return nil, ConfigErrorFromString("dhcpv%d: missing `server%d.listen` directive", ver, ver)
@@ -172,6 +167,10 @@ func (c *Config) parseConfig(ver protocolVersion) error {
 	if err := protoVersionCheck(ver); err != nil {
 		return err
 	}
+	if exists := c.v.Get(fmt.Sprintf("server%d", ver)); exists == nil {
+		// it is valid to have no server configuration defined
+		return nil
+	}
 	ifname, err := c.getInterface(ver)
 	if err != nil {
 		return err

+ 5 - 0
coredhcp.go

@@ -167,6 +167,11 @@ func (s *Server) MainHandler4(conn net.PacketConn, peer net.Addr, req *dhcpv4.DH
 	}
 
 	if resp != nil {
+		if !req.GatewayIPAddr.IsUnspecified() {
+			// TODO: make RFC8357 compliant
+			peer = &net.UDPAddr{IP: req.GatewayIPAddr, Port: dhcpv4.ServerPort}
+		}
+
 		if _, err := conn.WriteTo(resp.ToBytes(), peer); err != nil {
 			log.Printf("MainHandler4: conn.Write to %v failed: %v", peer, err)
 		}