in lib/handler.go [238:299]
func (s *Server) handleRawPacketV6(buffer []byte, peer *net.UDPAddr) {
// runs in a separate go routine
start := time.Now()
packet, err := dhcpv6.FromBytes(buffer)
if err != nil {
glog.Errorf("Error encoding DHCPv6 packet: %s", err)
s.logger.LogErr(start, nil, nil, peer, ErrParse, err)
return
}
if s.server {
s.handleV6Server(start, packet, peer)
return
}
if packet.Type() == dhcpv6.MessageTypeRelayReply {
s.handleV6RelayRepl(start, packet, peer)
return
}
var message DHCPMessage
msg, err := packet.GetInnerMessage()
if err != nil {
glog.Errorf("Error getting inner message: %s", err)
s.logger.LogErr(start, nil, packet.ToBytes(), peer, ErrParse, err)
return
}
message.XID = msg.TransactionID[:]
message.Peer = peer
duid := msg.Options.ClientID()
if duid == nil {
errMsg := errors.New("failed to extract Client ID")
glog.Errorf("%v", errMsg)
s.logger.LogErr(start, nil, packet.ToBytes(), peer, ErrParse, errMsg)
return
}
message.ClientID = duid.ToBytes()
mac, err := dhcpv6.ExtractMAC(packet)
if err != nil {
glog.Errorf("Failed to extract MAC, drop due to %s", err)
s.logger.LogErr(start, nil, packet.ToBytes(), peer, ErrParse, err)
return
}
message.Mac = mac
if vendorData, err := ztpv6.ParseVendorData(msg); err != nil {
glog.V(2).Infof("Failed to extract vendor data: %s", err)
} else {
message.Serial = vendorData.Serial
}
server, err := selectDestinationServer(s.config, &message)
if err != nil {
glog.Errorf("%s, Drop due to %s", packet.Summary(), err)
s.logger.LogErr(start, nil, packet.ToBytes(), peer, ErrNoServer, err)
return
}
relayMsg, err := dhcpv6.EncapsulateRelay(packet, dhcpv6.MessageTypeRelayForward, net.IPv6zero, peer.IP)
s.sendToServer(start, server, relayMsg.ToBytes(), peer)
}