diff --git a/dhcpd/dhcpd.go b/dhcpd/dhcpd.go index d4fd9128..0d215f39 100644 --- a/dhcpd/dhcpd.go +++ b/dhcpd/dhcpd.go @@ -47,7 +47,7 @@ type ServerConfig struct { // 0: disable ICMPTimeout uint32 `json:"icmp_timeout_msec" yaml:"icmp_timeout_msec"` - Conf6 V6ServerConf `yaml:"dhcpv6"` + Conf6 V6ServerConf `json:"-" yaml:"dhcpv6"` WorkDir string `json:"-" yaml:"-"` DBFilePath string `json:"-" yaml:"-"` // path to DB file @@ -133,8 +133,10 @@ func Create(config ServerConfig) *Server { s.registerHandlers() } - s.srv6 = v6Create(config.Conf6) + var err error + s.srv6, err = v6Create(config.Conf6) if s.srv6 == nil { + log.Error("%s", err) return nil } @@ -279,6 +281,8 @@ func (s *Server) Start() error { // Stop closes the listening UDP socket func (s *Server) Stop() error { + s.srv6.Stop() + if s.conn == nil { // nothing to do, return silently return nil diff --git a/dhcpd/v6.go b/dhcpd/v6.go index 83b4f699..9d4acfd7 100644 --- a/dhcpd/v6.go +++ b/dhcpd/v6.go @@ -314,18 +314,30 @@ func (s *V6Server) Start(iface net.Interface) error { return nil } -func v6Create(conf V6ServerConf) *V6Server { +// Stop - stop server +func (s *V6Server) Stop() { + if s.srv == nil { + return + } + + err := s.srv.Close() + if err != nil { + log.Error("DHCPv6: srv.Close: %s", err) + } + // now server.Serve() will return +} + +func v6Create(conf V6ServerConf) (*V6Server, error) { s := &V6Server{} s.conf = conf if !conf.Enabled { - return s + return s, nil } s.conf.ipStart = net.ParseIP(conf.RangeStart) if s.conf.ipStart == nil { - log.Error("DHCPv6: invalid range-start IP: %s", conf.RangeStart) - return nil + return nil, fmt.Errorf("DHCPv6: invalid range-start IP: %s", conf.RangeStart) } if conf.LeaseDuration == 0 { @@ -335,5 +347,5 @@ func v6Create(conf V6ServerConf) *V6Server { s.conf.leaseTime = time.Second * time.Duration(conf.LeaseDuration) } - return s + return s, nil }