diff options
-rw-r--r-- | dhcpv4/ztpv4/parse_circuitid.go | 7 | ||||
-rw-r--r-- | dhcpv4/ztpv4/parse_circuitid_test.go | 1 |
2 files changed, 7 insertions, 1 deletions
diff --git a/dhcpv4/ztpv4/parse_circuitid.go b/dhcpv4/ztpv4/parse_circuitid.go index b9db358..5bcee24 100644 --- a/dhcpv4/ztpv4/parse_circuitid.go +++ b/dhcpv4/ztpv4/parse_circuitid.go @@ -1,6 +1,7 @@ package ztpv4 import ( + "bytes" "fmt" "regexp" @@ -47,7 +48,11 @@ func ParseCircuitID(packet *dhcpv4.DHCPv4) (*CircuitID, error) { // As per RFC 3046 sub-Option 1 is circuit-id. Look at 2.0 section in that RFC // https://tools.ietf.org/html/rfc3046 - circuitIdStr := string(relayOptions.Options.Get(dhcpv4.AgentCircuitIDSubOption)) + cid := relayOptions.Options.Get(dhcpv4.AgentCircuitIDSubOption) + // Some Vendor like Arista sends SHIFT IN character i.e. 0x000f before circuitid + // remove it before matching against regexps. + cid = bytes.TrimPrefix(cid, []byte{0x00, 0x0f}) + circuitIdStr := string(cid) if circuitIdStr == "" { return nil, fmt.Errorf("no circuit-id suboption found in dhcpv4 packet") } diff --git a/dhcpv4/ztpv4/parse_circuitid_test.go b/dhcpv4/ztpv4/parse_circuitid_test.go index 94061c4..897fdb2 100644 --- a/dhcpv4/ztpv4/parse_circuitid_test.go +++ b/dhcpv4/ztpv4/parse_circuitid_test.go @@ -85,6 +85,7 @@ func TestParseCircuitID(t *testing.T) { {name: "Cisco pattern", circuit: []byte("Gi1/10:2020"), want: &CircuitID{Slot: "1", Port: "10", Vlan: "2020"}}, {name: "Cisco Nexus pattern", circuit: []byte("Ethernet1/3"), want: &CircuitID{Slot: "1", Port: "3"}}, {name: "Juniper Bundle Pattern", circuit: []byte("ae52.0"), want: &CircuitID{Port: "52", SubPort: "0"}}, + {name: "Arista Vlan pattern 1 with SHIFT IN", circuit: []byte("\x00\x0fEthernet14:Vlan2001"), want: &CircuitID{Port: "14", Vlan: "Vlan2001"}}, } for _, tc := range tt { t.Run(tc.name, func(t *testing.T) { |