|  | // Copyright 2011 The Go Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style | 
|  | // license that can be found in the LICENSE file. | 
|  |  | 
|  | package net | 
|  |  | 
|  | const hexDigit = "0123456789abcdef" | 
|  |  | 
|  | // A HardwareAddr represents a physical hardware address. | 
|  | type HardwareAddr []byte | 
|  |  | 
|  | func (a HardwareAddr) String() string { | 
|  | if len(a) == 0 { | 
|  | return "" | 
|  | } | 
|  | buf := make([]byte, 0, len(a)*3-1) | 
|  | for i, b := range a { | 
|  | if i > 0 { | 
|  | buf = append(buf, ':') | 
|  | } | 
|  | buf = append(buf, hexDigit[b>>4]) | 
|  | buf = append(buf, hexDigit[b&0xF]) | 
|  | } | 
|  | return string(buf) | 
|  | } | 
|  |  | 
|  | // ParseMAC parses s as an IEEE 802 MAC-48, EUI-48, EUI-64, or a 20-octet | 
|  | // IP over InfiniBand link-layer address using one of the following formats: | 
|  | //	00:00:5e:00:53:01 | 
|  | //	02:00:5e:10:00:00:00:01 | 
|  | //	00:00:00:00:fe:80:00:00:00:00:00:00:02:00:5e:10:00:00:00:01 | 
|  | //	00-00-5e-00-53-01 | 
|  | //	02-00-5e-10-00-00-00-01 | 
|  | //	00-00-00-00-fe-80-00-00-00-00-00-00-02-00-5e-10-00-00-00-01 | 
|  | //	0000.5e00.5301 | 
|  | //	0200.5e10.0000.0001 | 
|  | //	0000.0000.fe80.0000.0000.0000.0200.5e10.0000.0001 | 
|  | func ParseMAC(s string) (hw HardwareAddr, err error) { | 
|  | if len(s) < 14 { | 
|  | goto error | 
|  | } | 
|  |  | 
|  | if s[2] == ':' || s[2] == '-' { | 
|  | if (len(s)+1)%3 != 0 { | 
|  | goto error | 
|  | } | 
|  | n := (len(s) + 1) / 3 | 
|  | if n != 6 && n != 8 && n != 20 { | 
|  | goto error | 
|  | } | 
|  | hw = make(HardwareAddr, n) | 
|  | for x, i := 0, 0; i < n; i++ { | 
|  | var ok bool | 
|  | if hw[i], ok = xtoi2(s[x:], s[2]); !ok { | 
|  | goto error | 
|  | } | 
|  | x += 3 | 
|  | } | 
|  | } else if s[4] == '.' { | 
|  | if (len(s)+1)%5 != 0 { | 
|  | goto error | 
|  | } | 
|  | n := 2 * (len(s) + 1) / 5 | 
|  | if n != 6 && n != 8 && n != 20 { | 
|  | goto error | 
|  | } | 
|  | hw = make(HardwareAddr, n) | 
|  | for x, i := 0, 0; i < n; i += 2 { | 
|  | var ok bool | 
|  | if hw[i], ok = xtoi2(s[x:x+2], 0); !ok { | 
|  | goto error | 
|  | } | 
|  | if hw[i+1], ok = xtoi2(s[x+2:], s[4]); !ok { | 
|  | goto error | 
|  | } | 
|  | x += 5 | 
|  | } | 
|  | } else { | 
|  | goto error | 
|  | } | 
|  | return hw, nil | 
|  |  | 
|  | error: | 
|  | return nil, &AddrError{Err: "invalid MAC address", Addr: s} | 
|  | } |