ソースを参照

config: Setup pleasant defaults for listen

This makes a server block without a listen instruction, by default:
 * On v4 listen on broadcast (no functional change)
 * On v6 listen on ff02::1:2 on all capable interfaces and ff05::1:3 on
   the default multicast interface

Which should hopefully be a better solution than the behaviour from the
dhcp library (listening on wildcard)

Signed-off-by: Anatole Denis <anatole@unverle.fr>
Anatole Denis 6 年 前
コミット
18c78ca266
1 ファイル変更22 行追加0 行削除
  1. 22 0
      config/config.go

+ 22 - 0
config/config.go

@@ -270,12 +270,34 @@ func expandLLMulticast(addr *net.UDPAddr) ([]net.UDPAddr, error) {
 	return ret, nil
 }
 
+func defaultListen(ver protocolVersion) ([]net.UDPAddr, error) {
+	switch ver {
+	case protocolV4:
+		return []net.UDPAddr{{Port: dhcpv4.ServerPort}}, nil
+	case protocolV6:
+		l, err := expandLLMulticast(&net.UDPAddr{IP: dhcpv6.AllDHCPRelayAgentsAndServers, Port: dhcpv6.DefaultServerPort})
+		if err != nil {
+			return nil, err
+		}
+		l = append(l,
+			net.UDPAddr{IP: dhcpv6.AllDHCPServers, Port: dhcpv6.DefaultServerPort},
+			// XXX: Do we want to listen on [::] as default ?
+		)
+		return l, nil
+	}
+	return nil, errors.New("defaultListen: Incorrect protocol version")
+}
+
 func (c *Config) parseListen(ver protocolVersion) ([]net.UDPAddr, error) {
 	if err := protoVersionCheck(ver); err != nil {
 		return nil, err
 	}
 
 	listen := c.v.Get(fmt.Sprintf("server%d.listen", ver))
+	if listen == nil {
+		return defaultListen(ver)
+	}
+
 	addrs, err := cast.ToStringSliceE(listen)
 	if err != nil {
 		addrs = []string{cast.ToString(listen)}