Statistics
| Branch: | Tag: | Revision:

root / util / mac2eui64.py @ ee66adf0

History | View | Annotate | Download (2.4 kB)

1 9cb903f9 Vangelis Koukis
# Copyright 2011 GRNET S.A. All rights reserved.
2 9cb903f9 Vangelis Koukis
# 
3 9cb903f9 Vangelis Koukis
# Redistribution and use in source and binary forms, with or
4 9cb903f9 Vangelis Koukis
# without modification, are permitted provided that the following
5 9cb903f9 Vangelis Koukis
# conditions are met:
6 9cb903f9 Vangelis Koukis
# 
7 9cb903f9 Vangelis Koukis
#   1. Redistributions of source code must retain the above
8 9cb903f9 Vangelis Koukis
#      copyright notice, this list of conditions and the following
9 9cb903f9 Vangelis Koukis
#      disclaimer.
10 9cb903f9 Vangelis Koukis
# 
11 9cb903f9 Vangelis Koukis
#   2. Redistributions in binary form must reproduce the above
12 9cb903f9 Vangelis Koukis
#      copyright notice, this list of conditions and the following
13 9cb903f9 Vangelis Koukis
#      disclaimer in the documentation and/or other materials
14 9cb903f9 Vangelis Koukis
#      provided with the distribution.
15 9cb903f9 Vangelis Koukis
# 
16 9cb903f9 Vangelis Koukis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 9cb903f9 Vangelis Koukis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 9cb903f9 Vangelis Koukis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 9cb903f9 Vangelis Koukis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 9cb903f9 Vangelis Koukis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 9cb903f9 Vangelis Koukis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 9cb903f9 Vangelis Koukis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 9cb903f9 Vangelis Koukis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 9cb903f9 Vangelis Koukis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 9cb903f9 Vangelis Koukis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 9cb903f9 Vangelis Koukis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 9cb903f9 Vangelis Koukis
# POSSIBILITY OF SUCH DAMAGE.
28 9cb903f9 Vangelis Koukis
# 
29 9cb903f9 Vangelis Koukis
# The views and conclusions contained in the software and
30 9cb903f9 Vangelis Koukis
# documentation are those of the authors and should not be
31 9cb903f9 Vangelis Koukis
# interpreted as representing official policies, either expressed
32 9cb903f9 Vangelis Koukis
# or implied, of GRNET S.A.
33 9cb903f9 Vangelis Koukis
# 
34 9cb903f9 Vangelis Koukis
35 9cb903f9 Vangelis Koukis
import sys
36 9cb903f9 Vangelis Koukis
from IPy import IP
37 9cb903f9 Vangelis Koukis
38 9cb903f9 Vangelis Koukis
# Adapted from NFDHCPD's mac2eui64 utility, repository commit:feca7bb95
39 9cb903f9 Vangelis Koukis
40 9cb903f9 Vangelis Koukis
def mac2eui64(mac, prefixstr):
41 9cb903f9 Vangelis Koukis
    try:
42 9cb903f9 Vangelis Koukis
        prefix = IP(prefixstr)
43 9cb903f9 Vangelis Koukis
    except ValueError:
44 9cb903f9 Vangelis Koukis
        raise Exception("Invalid IPv6 prefix '%s'" % prefixstr)
45 9cb903f9 Vangelis Koukis
46 9cb903f9 Vangelis Koukis
    if prefix.version() != 6:
47 9cb903f9 Vangelis Koukis
        raise Exception("%s is not a valid IPv6 prefix" % prefixstr)
48 9cb903f9 Vangelis Koukis
49 9cb903f9 Vangelis Koukis
    if prefix.prefixlen() != 64:
50 9cb903f9 Vangelis Koukis
        raise Exception("Cannot generate an EUI-64 address on a non-64 subnet")
51 9cb903f9 Vangelis Koukis
52 9cb903f9 Vangelis Koukis
    mac_parts = mac.split(":")
53 9cb903f9 Vangelis Koukis
    pfx_parts = prefix.net().strFullsize().split(":")
54 9cb903f9 Vangelis Koukis
55 9cb903f9 Vangelis Koukis
    if len(mac_parts) != 6:
56 9cb903f9 Vangelis Koukis
        raise Exception("%s is not a valid MAC-48 address" % mac)
57 9cb903f9 Vangelis Koukis
58 9cb903f9 Vangelis Koukis
    eui64 = mac_parts[:3] + [ "ff", "fe" ] + mac_parts[3:]
59 9cb903f9 Vangelis Koukis
60 9cb903f9 Vangelis Koukis
    eui64[0] = "%02x" % (int(eui64[0], 16) ^ 0x02)
61 9cb903f9 Vangelis Koukis
62 9cb903f9 Vangelis Koukis
    ip = ":".join(pfx_parts[:4])
63 9cb903f9 Vangelis Koukis
    for l in range(0, len(eui64), 2):
64 9cb903f9 Vangelis Koukis
        ip += ":%s" % "".join(eui64[l:l+2])
65 9cb903f9 Vangelis Koukis
66 9cb903f9 Vangelis Koukis
    return IP(ip).strCompressed()
67 9cb903f9 Vangelis Koukis
68 9cb903f9 Vangelis Koukis
# vim: set ts=4 sts=4 sw=4 et ai :