in lib/handler.go [177:213]
func (s *Server) handleRawPacketV4(buffer []byte, peer *net.UDPAddr) {
// runs in a separate go routine
start := time.Now()
var message DHCPMessage
packet, err := dhcpv4.FromBytes(buffer)
if err != nil {
glog.Errorf("Error encoding DHCPv4 packet: %s", err)
s.logger.LogErr(start, nil, nil, peer, ErrParse, err)
return
}
if s.server {
s.handleV4Server(start, packet, peer)
return
}
message.XID = packet.TransactionID[:]
message.Peer = peer
message.ClientID = packet.ClientHWAddr
message.Mac = packet.ClientHWAddr
if vd, err := ztpv4.ParseVendorData(packet); err != nil {
glog.V(2).Infof("error parsing vendor data: %s", err)
} else {
message.Serial = vd.Serial
}
packet.HopCount++
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
}
s.sendToServer(start, server, packet.ToBytes(), peer)
}