From db1e9e2b0caa4e4ef9b6d92270f4fe876dd50793 Mon Sep 17 00:00:00 2001 From: tsosunchia <59512455+tsosunchia@users.noreply.github.com> Date: Thu, 5 Oct 2023 06:42:04 +0800 Subject: [PATCH] =?UTF-8?q?v4=20mpls=E5=AE=9E=E8=A3=85=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- printer/basic.go | 4 ++++ printer/printer.go | 4 ++++ trace/icmp_ipv4.go | 25 ++++++++++++++++++++++--- trace/trace.go | 1 + 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/printer/basic.go b/printer/basic.go index c6ae53a..79377e1 100644 --- a/printer/basic.go +++ b/printer/basic.go @@ -108,4 +108,8 @@ func applyLangSetting(h *trace.Hop) { } } } + + if len(h.MPLS) > 1 { + h.Hostname += " [MPLS: " + h.MPLS + "]" + } } diff --git a/printer/printer.go b/printer/printer.go index ad32f0c..49d19f3 100644 --- a/printer/printer.go +++ b/printer/printer.go @@ -47,6 +47,10 @@ func HopPrinter(h trace.Hop, info HopInfo) { if h.Geo != nil { txt += " " + formatIpGeoData(h.Address.String(), h.Geo) } + + if len(h.MPLS) > 1 { + txt += " [MPLS: " + h.MPLS + "]" + } switch info { case IXP: fmt.Print(CYAN_PREFIX) diff --git a/trace/icmp_ipv4.go b/trace/icmp_ipv4.go index af5178b..029c380 100644 --- a/trace/icmp_ipv4.go +++ b/trace/icmp_ipv4.go @@ -175,6 +175,9 @@ func (t *ICMPTracer) listenICMP() { func (t *ICMPTracer) handleICMPMessage(msg ReceivedMessage, icmpType int8, data []byte, ttl int) { t.inflightRequestRWLock.RLock() defer t.inflightRequestRWLock.RUnlock() + label, err := int64(0), error(nil) + tc, s, ttlMpls := int64(0), "", int64(0) + mpls := "" extensionOffset := 20 + 8 + 52 @@ -185,12 +188,27 @@ func (t *ICMPTracer) handleICMPMessage(msg ReceivedMessage, icmpType int8, data //log.Println("ICMP Multi-Part Extensions detected for TTL:", ttl) //这里感觉会有问题,能力所限先这样吧,等有缘人来改 tmp := fmt.Sprintf("%x", msg.Msg[:*msg.N]) - substring := tmp[len(tmp)-7 : len(tmp)-3] - label, err := strconv.ParseInt(substring, 16, 32) + substring := tmp[len(tmp)-8 : len(tmp)-3] + label, err = strconv.ParseInt(substring, 16, 32) if err != nil { return } - log.Printf("MPLS for TTL %d: Lbl %d\n", ttl, label) + strSlice := []byte(tmp[len(tmp)-3 : len(tmp)-2]) + charValue := int(strSlice[0] - '0') + binaryStr := fmt.Sprintf("%04b", charValue) + tc, err = strconv.ParseInt(binaryStr[:3], 2, 32) + if err != nil { + return + } + s = binaryStr[3:] + + substring = tmp[len(tmp)-2:] + ttlMpls, err = strconv.ParseInt(substring, 16, 32) + if err != nil { + return + } + //fmt.Printf("MPLS for TTL %d: Lbl %d, TC %d, S %s, TTL %d\n", ttl, label, tc, s, ttlMpls) + mpls = fmt.Sprintf("Lbl %d, TC %d, S %s, TTL %d", label, tc, s, ttlMpls) } } @@ -198,6 +216,7 @@ func (t *ICMPTracer) handleICMPMessage(msg ReceivedMessage, icmpType int8, data t.inflightRequest[ttl] <- Hop{ Success: true, Address: msg.Peer, + MPLS: mpls, } } } diff --git a/trace/trace.go b/trace/trace.go index 2b552b3..f52ad7a 100644 --- a/trace/trace.go +++ b/trace/trace.go @@ -124,6 +124,7 @@ type Hop struct { Error error Geo *ipgeo.IPGeoData Lang string + MPLS string } func (h *Hop) fetchIPData(c Config) (err error) {