iMax
iMax

Reputation: 587

How to convert IPv6 link-local address to MAC address in Python

I am looking for a way to convert a IPV6 address, for example

fe80::1d81:b870:163c:5845 

into a MAC-Adress with Python. So the output should be

 1f:81:b8:3c:58:45

Like it is on this page: http://ben.akrin.com/?p=4103 How can I convert IPV6 to MAC?

Upvotes: 3

Views: 9838

Answers (1)

snodo
snodo

Reputation: 178

Here are two functions to convert in both ways.

It might also be useful to check if the given arguments are correct MACs or IPv6s.

From MAC to IPv6

def mac2ipv6(mac):
    # only accept MACs separated by a colon
    parts = mac.split(":")

    # modify parts to match IPv6 value
    parts.insert(3, "ff")
    parts.insert(4, "fe")
    parts[0] = "%x" % (int(parts[0], 16) ^ 2)

    # format output
    ipv6Parts = []
    for i in range(0, len(parts), 2):
        ipv6Parts.append("".join(parts[i:i+2]))
    ipv6 = "fe80::%s/64" % (":".join(ipv6Parts))
    return ipv6

From IPv6 to MAC

def ipv62mac(ipv6):
    # remove subnet info if given
    subnetIndex = ipv6.find("/")
    if subnetIndex != -1:
        ipv6 = ipv6[:subnetIndex]

    ipv6Parts = ipv6.split(":")
    macParts = []
    for ipv6Part in ipv6Parts[-4:]:
        while len(ipv6Part) < 4:
            ipv6Part = "0" + ipv6Part
        macParts.append(ipv6Part[:2])
        macParts.append(ipv6Part[-2:])

    # modify parts to match MAC value
    macParts[0] = "%02x" % (int(macParts[0], 16) ^ 2)
    del macParts[4]
    del macParts[3]

    return ":".join(macParts)

Example

ipv6 = mac2ipv6("52:74:f2:b1:a8:7f")
back2mac = ipv62mac(ipv6)
print "IPv6:", ipv6    # prints IPv6: fe80::5074:f2ff:feb1:a87f/64
print "MAC:", back2mac # prints MAC: 52:74:f2:b1:a8:7f

Upvotes: 13

Related Questions