Statistics
| Branch: | Tag: | Revision:

root / snf-common / synnefo / util / mac2eui64.py @ d509e6da

History | View | Annotate | Download (2.4 kB)

1
# Copyright 2011, 2012, 2013 GRNET S.A. All rights reserved.
2
#
3
# Redistribution and use in source and binary forms, with or
4
# without modification, are permitted provided that the following
5
# conditions are met:
6
#
7
#   1. Redistributions of source code must retain the above
8
#      copyright notice, this list of conditions and the following
9
#      disclaimer.
10
#
11
#   2. Redistributions in binary form must reproduce the above
12
#      copyright notice, this list of conditions and the following
13
#      disclaimer in the documentation and/or other materials
14
#      provided with the distribution.
15
#
16
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
# POSSIBILITY OF SUCH DAMAGE.
28
#
29
# The views and conclusions contained in the software and
30
# documentation are those of the authors and should not be
31
# interpreted as representing official policies, either expressed
32
# or implied, of GRNET S.A.
33
#
34

    
35
from IPy import IP
36

    
37
# Adapted from NFDHCPD's mac2eui64 utility, repository commit:feca7bb95
38

    
39

    
40
def mac2eui64(mac, prefixstr):
41
    try:
42
        prefix = IP(prefixstr)
43
    except ValueError:
44
        raise Exception("Invalid IPv6 prefix '%s'" % prefixstr)
45

    
46
    if prefix.version() != 6:
47
        raise Exception("%s is not a valid IPv6 prefix" % prefixstr)
48

    
49
    if prefix.prefixlen() != 64:
50
        raise Exception("Cannot generate an EUI-64 address on a non-64 subnet")
51

    
52
    mac_parts = mac.split(":")
53
    pfx_parts = prefix.net().strFullsize().split(":")
54

    
55
    if len(mac_parts) != 6:
56
        raise Exception("%s is not a valid MAC-48 address" % mac)
57

    
58
    eui64 = mac_parts[:3] + ["ff", "fe"] + mac_parts[3:]
59

    
60
    eui64[0] = "%02x" % (int(eui64[0], 16) ^ 0x02)
61

    
62
    ip = ":".join(pfx_parts[:4])
63
    for l in range(0, len(eui64), 2):
64
        ip += ":%s" % "".join(eui64[l:l + 2])
65

    
66
    return IP(ip).strCompressed()
67

    
68
# vim: set ts=4 sts=4 sw=4 et ai :