master
go 70 lines 1.32 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package l2topology
4
5 import (
6 "encoding/hex"
7 "strings"
8 )
9
10 func normalizeLLDPPortIDForMatch(portID, subtype string) string {
11 portID = strings.TrimSpace(portID)
12 if portID == "" {
13 return ""
14 }
15
16 switch normalizeLLDPPortSubtypeForMatch(subtype) {
17 case "mac":
18 if mac := canonicalLLDPMACToken(portID); mac != "" {
19 return mac
20 }
21 case "network":
22 if ip := canonicalIP(portID); ip != "" {
23 return ip
24 }
25 }
26
27 return portID
28 }
29
30 func normalizeLLDPPortSubtypeForMatch(subtype string) string {
31 switch strings.ToLower(strings.TrimSpace(subtype)) {
32 case "3", "macaddress":
33 return "mac"
34 case "4", "networkaddress":
35 return "network"
36 default:
37 return strings.ToLower(strings.TrimSpace(subtype))
38 }
39 }
40
41 func normalizeLLDPChassisForMatch(v string) string {
42 v = strings.TrimSpace(v)
43 if v == "" {
44 return ""
45 }
46 if ip := canonicalIP(v); ip != "" {
47 return ip
48 }
49 if mac := canonicalLLDPMACToken(v); mac != "" {
50 return mac
51 }
52 return v
53 }
54
55 func canonicalLLDPMACToken(v string) string {
56 v = strings.TrimSpace(strings.ToLower(v))
57 if v == "" {
58 return ""
59 }
60
61 clean := strings.TrimPrefix(v, "0x")
62 clean = strings.NewReplacer(":", "", "-", "", ".", "", " ", "").Replace(clean)
63 if len(clean) != 12 {
64 return ""
65 }
66 if _, err := hex.DecodeString(clean); err != nil {
67 return ""
68 }
69 return clean
70 }