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