blob: 8594a9146ae681772e1cbc1f5032d03eab2d0278 [file] [log] [blame]
Mikio Hara4d355832012-03-05 07:42:07 +09001// Copyright 2011 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
Mikio Hara4d355832012-03-05 07:42:07 +09005package net
6
Brad Fitzpatrick82a92942012-03-05 11:43:28 -08007const hexDigit = "0123456789abcdef"
Mikio Hara4d355832012-03-05 07:42:07 +09008
9// A HardwareAddr represents a physical hardware address.
10type HardwareAddr []byte
11
12func (a HardwareAddr) String() string {
Brad Fitzpatrick82a92942012-03-05 11:43:28 -080013 if len(a) == 0 {
14 return ""
15 }
16 buf := make([]byte, 0, len(a)*3-1)
Mikio Hara4d355832012-03-05 07:42:07 +090017 for i, b := range a {
18 if i > 0 {
Brad Fitzpatrick82a92942012-03-05 11:43:28 -080019 buf = append(buf, ':')
Mikio Hara4d355832012-03-05 07:42:07 +090020 }
Brad Fitzpatrick82a92942012-03-05 11:43:28 -080021 buf = append(buf, hexDigit[b>>4])
22 buf = append(buf, hexDigit[b&0xF])
Mikio Hara4d355832012-03-05 07:42:07 +090023 }
Brad Fitzpatrick82a92942012-03-05 11:43:28 -080024 return string(buf)
Mikio Hara4d355832012-03-05 07:42:07 +090025}
26
27// ParseMAC parses s as an IEEE 802 MAC-48, EUI-48, or EUI-64 using one of the
28// following formats:
29// 01:23:45:67:89:ab
30// 01:23:45:67:89:ab:cd:ef
31// 01-23-45-67-89-ab
32// 01-23-45-67-89-ab-cd-ef
33// 0123.4567.89ab
34// 0123.4567.89ab.cdef
35func ParseMAC(s string) (hw HardwareAddr, err error) {
36 if len(s) < 14 {
37 goto error
38 }
39
40 if s[2] == ':' || s[2] == '-' {
41 if (len(s)+1)%3 != 0 {
42 goto error
43 }
44 n := (len(s) + 1) / 3
45 if n != 6 && n != 8 {
46 goto error
47 }
48 hw = make(HardwareAddr, n)
49 for x, i := 0, 0; i < n; i++ {
50 var ok bool
51 if hw[i], ok = xtoi2(s[x:], s[2]); !ok {
52 goto error
53 }
54 x += 3
55 }
56 } else if s[4] == '.' {
57 if (len(s)+1)%5 != 0 {
58 goto error
59 }
60 n := 2 * (len(s) + 1) / 5
61 if n != 6 && n != 8 {
62 goto error
63 }
64 hw = make(HardwareAddr, n)
65 for x, i := 0, 0; i < n; i += 2 {
66 var ok bool
67 if hw[i], ok = xtoi2(s[x:x+2], 0); !ok {
68 goto error
69 }
70 if hw[i+1], ok = xtoi2(s[x+2:], s[4]); !ok {
71 goto error
72 }
73 x += 5
74 }
75 } else {
76 goto error
77 }
78 return hw, nil
79
80error:
Mikio Hara055ecb72015-04-21 21:20:15 +090081 return nil, &AddrError{Err: "invalid MAC address", Addr: s}
Mikio Hara4d355832012-03-05 07:42:07 +090082}