func()

in cmd/ziffy/node/sender.go [272:314]


func (s *Sender) handleIcmpPacket(rawPacket []byte, len int, rAddr net.Addr) {
	icmpType := rawPacket[0]
	if ipv6.ICMPType(icmpType) != ipv6.ICMPTypeTimeExceeded {
		log.Tracef("not ipv6 timeexceeded packet")
		return
	}
	ptpOffset := Ipv6HeaderSize + UDPHeaderSize + ICMPHeaderSize
	if ptpOffset > len {
		log.Tracef("packet too short")
		return
	}
	ptpPacket, err := ptp.DecodePacket(rawPacket[ptpOffset:len])
	if err != nil {
		log.Tracef("PTP not contained in ICMP")
		return
	}

	var (
		corrField  ptp.Correction
		sequenceID uint16
		portNum    uint16
	)
	switch v := ptpPacket.(type) {
	case *ptp.SyncDelayReq:
		corrField = v.Header.CorrectionField
		sequenceID = v.Header.SequenceID
		portNum = v.Header.SourcePortIdentity.PortNumber
	case *ptp.Signaling:
		corrField = v.Header.CorrectionField
		sequenceID = v.Header.SequenceID
		portNum = v.Header.SourcePortIdentity.PortNumber
	default:
		log.Errorf("Received unexpected packet %T, ignoring", v)
	}

	s.inputQueue <- &SwitchTrafficInfo{
		ip:        rAddr.String(),
		corrField: corrField,
		hop:       int(sequenceID),
		routeIdx:  int(portNum),
	}
	log.Debugf("%v cf: %v hop: %v", getLookUpName(rAddr.String()), corrField, sequenceID)
}