func()

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)
}