Ver código fonte

Handle rapid-commit requests

Signed-off-by: Andrea Barberio <insomniac@slackware.it>
Andrea Barberio 6 anos atrás
pai
commit
caeec85874
1 arquivos alterados com 10 adições e 6 exclusões
  1. 10 6
      coredhcp.go

+ 10 - 6
coredhcp.go

@@ -104,18 +104,23 @@ func (s *Server) LoadPlugins(conf *config.Config) ([]*plugins.Plugin, []*plugins
 // It will not reply if the resulting response is `nil`.
 func (s *Server) MainHandler6(conn net.PacketConn, peer net.Addr, req dhcpv6.DHCPv6) {
 	var (
-		resp, tmp dhcpv6.DHCPv6
-		stop      bool
-		err       error
+		resp dhcpv6.DHCPv6
+		stop bool
+		err  error
 	)
 
 	// Create a suitable basic response packet
 	switch req.Type() {
 	case dhcpv6.MessageTypeSolicit:
-		tmp, err = dhcpv6.NewAdvertiseFromSolicit(req.(*dhcpv6.Message))
+		m := req.(*dhcpv6.Message)
+		if m.GetOneOption(dhcpv6.OptionRapidCommit) != nil {
+			resp, err = dhcpv6.NewReplyFromMessage(m)
+		} else {
+			resp, err = dhcpv6.NewAdvertiseFromSolicit(m)
+		}
 	case dhcpv6.MessageTypeRequest, dhcpv6.MessageTypeConfirm, dhcpv6.MessageTypeRenew,
 		dhcpv6.MessageTypeRebind, dhcpv6.MessageTypeRelease, dhcpv6.MessageTypeInformationRequest:
-		tmp, err = dhcpv6.NewReplyFromMessage(req.(*dhcpv6.Message))
+		resp, err = dhcpv6.NewReplyFromMessage(req.(*dhcpv6.Message))
 	default:
 		err = fmt.Errorf("MainHandler6: message type %d not supported", req.Type())
 	}
@@ -124,7 +129,6 @@ func (s *Server) MainHandler6(conn net.PacketConn, peer net.Addr, req dhcpv6.DHC
 		log.Printf("MainHandler6: NewReplyFromDHCPv6Message failed: %v", err)
 		return
 	}
-	resp = tmp
 	for _, handler := range s.Handlers6 {
 		resp, stop = handler(req, resp)
 		if stop {