#!/usr/bin/perl
#
#	call2mac.pl quick&dirty perl version
#
#	convert ham radio callsign with sid to mac address
#	see http://db0fhn.efi.fh-nuernberg.de/doku.php?id=projects:wlan:proposal
#
#	Author: Michael Beck, DH5DAX/HB9ERP
#

if (!$ARGV[0]) {
  print "Usage: ip2call.pl <callsign-sid|mac_addr>\n";
  exit;
}

if ($ARGV[0]=~/:/) {
  @mac=split(":",$ARGV[0]);
  foreach $item (@mac) {
    $chunk=sprintf("%08b",hex($item));
    $sid.=substr($chunk,length($chunk)-2,2);
    print chr(sprintf("%d",unpack("N",pack("B32",substr("0" x 32 ."00".substr($chunk,0,6),-32))))+32) unless (substr($chunk,0,6)=="000000");
  }
  print "-".unpack("N", pack("B32", substr("0" x 32 . "0000".substr($sid,4,8), -32)))."\n";
} else {
  ($call,$sid)=split("-",$ARGV[0]); # splic call and possible sid
  $sid="1000".sprintf("%08b",$sid); # prepend 4 bits: 1=unicast 2=locally administered 3&4=reserved
  for ($i=0; $i<6; $i++) {
    print sprintf("%02X",ord(pack('B8', sprintf("%06b",ord(substr(sprintf("%-6s",uc($call)),$i,1))-32).substr($sid,$i*2,2)))); 
    if ($i<5) { print ":"; } else { print "\n" };
  }
}

