File Coverage

blib/lib/NetAddr/MAC.pm
Criterion Covered Total %
statement 285 450 63.3
branch 109 268 40.6
condition 30 53 56.6
subroutine 62 69 89.8
pod 54 54 100.0
total 540 894 60.4


line stmt bran cond sub pod time code
1             #!/bin/false
2             # ABSTRACT: MAC hardware address functions and object (EUI48 and EUI64)
3              
4 6     6   1170308 use strict;
  6         14  
  6         301  
5 6     6   34 use warnings;
  6         12  
  6         357  
6 6     6   93 use v5.10;
  6         27  
7             package NetAddr::MAC;
8             $NetAddr::MAC::VERSION = '0.99';
9              
10 6     6   39 use Carp qw( croak );
  6         24  
  6         415  
11 6     6   35 use Exporter 'import';
  6         9  
  6         244  
12 6     6   32 use List::Util qw( first );
  6         8  
  6         514  
13              
14 6     6   42 use constant EUI48LENGTHHEX => 12;
  6         17  
  6         529  
15 6     6   35 use constant EUI48LENGTHDEC => 6;
  6         75  
  6         361  
16 6     6   32 use constant EUI64LENGTHHEX => 16;
  6         10  
  6         323  
17 6     6   36 use constant EUI64LENGTHDEC => 8;
  6         9  
  6         39112  
18              
19             our %EXPORT_TAGS;
20              
21             %EXPORT_TAGS = (
22             all => [
23             qw(
24             mac_is_eui48 mac_is_eui64
25             mac_is_unicast mac_is_multicast
26             mac_is_broadcast mac_is_vrrp
27             mac_is_vrrp4 mac_is_vrrp6
28             mac_is_hsrp mac_is_hsrp2
29             mac_is_msnlb
30             mac_is_local mac_is_universal
31             mac_as_basic mac_as_sun
32             mac_as_microsoft mac_as_cisco
33             mac_as_bpr mac_as_ieee
34             mac_as_ipv6_suffix
35             mac_as_tokenring mac_as_singledash
36             mac_as_pgsql
37             )
38             ],
39             properties => [
40             qw(
41             mac_is_eui48 mac_is_eui64
42             mac_is_unicast mac_is_multicast
43             mac_is_broadcast mac_is_vrrp
44             mac_is_vrrp4 mac_is_vrrp6
45             mac_is_hsrp mac_is_hsrp2
46             mac_is_msnlb
47             mac_is_local mac_is_universal
48             )
49             ],
50             normals => [
51             qw(
52             mac_as_basic mac_as_sun
53             mac_as_microsoft mac_as_cisco
54             mac_as_bpr mac_as_ieee
55             mac_as_ipv6_suffix
56             mac_as_tokenring mac_as_singledash
57             mac_as_pgsql
58             )
59             ],
60             );
61              
62             Exporter::export_ok_tags( keys %EXPORT_TAGS );
63              
64              
65             sub new {
66              
67 16     16 1 448745 my ( $p, @q ) = @_;
68 16   33     88 my $c = ref($p) || $p;
69 16         40 my $self = bless {}, $c;
70              
71             # clear the errstr, see also RT96045
72 16         31 $NetAddr::MAC::errstr = undef;
73              
74 16 100       39 unless (@q) {
75 1         2 my $e = q|Please provide a mac address|;
76 1 50       86 croak "$e\n" if $NetAddr::MAC::die_on_error;
77 0         0 $NetAddr::MAC::errstr = $e;
78             return
79 0         0 }
80              
81             # massage a single argument into a mac argument if needed
82 15 50       109 $self->_init( @q % 2 ? ( mac => shift @q, @q ) : @q )
    100          
83             or return;
84              
85 3         12 return $self
86              
87             }
88              
89             {
90              
91             my $_die;
92              
93             sub _init {
94              
95 15     15   48 my ( $self, %args ) = @_;
96              
97 15 50       41 if ( defined $args{die_on_error} ) {
98 0 0       0 $self->{_die}++ if $args{die_on_error};
99             }
100             else {
101 15 100       58 $self->{_die}++ if $NetAddr::MAC::die_on_error;
102             }
103              
104 15 100       42 $_die++ if $self->{_die};
105              
106 15         35 $self->{original} = $args{mac};
107              
108 15 100       64 if ($args{mac} =~ m/^(\d+)\#(.+)$/ ) {
109 1         6 $self->{priority} = $1;
110 1         4 $args{mac} = $2;
111             }
112              
113 15         46 $self->{mac} = _mac_to_integers( $args{mac} );
114              
115 4 100       14 unless ( $self->{mac} ) {
116 1 50       3 croak $NetAddr::MAC::errstr . "\n" if $self->{_die};
117             return
118 1         8 }
119              
120 3 100       8 if (defined $self->{priority}) {
121 1 50 33     6 if ($args{priority} and $args{priority} != $self->{priority}) {
122 0         0 my $e = "Conflicting priority in '$self->{original}' and priority argument $args{priority}";
123 0 0       0 croak "$e\n" if $self->{_die};
124 0         0 $NetAddr::MAC::errstr = $e;
125             return
126 0         0 }
127             }
128             else {
129 2   50     10 $self->{priority} = $args{priority} || 0;
130             }
131              
132             # check none of the list elements are empty
133 3 50   18   11 if (first { not defined $_ or 0 == length $_} @{$self->{mac}}) {
  18 50       62  
  3         12  
134 0         0 my $e = "Invalid MAC format '$self->{original}'";
135 0 0       0 croak "$e\n" if $self->{_die};
136 0         0 $NetAddr::MAC::errstr = $e;
137             return
138 0         0 }
139              
140 3         19 return 1
141              
142             }
143              
144             sub _mac_to_integers {
145              
146 329     329   622 my $mac = shift;
147 329         521 my $e;
148              
149 329         831 for (1) {
150              
151 329 100       878 unless ($mac) {
152 1         2 $e = 'Please provide a mac address';
153 1         1 last;
154             }
155              
156             # be nice, strip leading and trailing whitespace
157 328         1423 $mac =~ s/^\s+//;
158 328         930 $mac =~ s/\s+$//;
159              
160 328         594 $mac =~ s{^1,\d,}{}
161             ; # blindly remove the prefix from bpr, we could check that \d is the actual length, but oh well
162              
163             # avoid matching ipv6
164 328 100       1102 last if $mac =~ m/[a-f0-9]{1,4}:[a-f0-9]{1,4}::([a-f0-9]{1,4})?/i;
165 323 100       839 last if $mac =~ m/[a-f0-9]{1,4}::[a-f0-9]{1,4}:[a-f0-9]{1,4}/i;
166              
167 321         2096 my @parts = grep { length } split( /[^a-z0-9]+/ix, $mac );
  1107         2586  
168              
169             # anything other than hex...
170 321 100   1074   12481 last if ( first { m{[^a-f0-9]}i } @parts );
  1074         2520  
171              
172             # resolve wierd things like aabb.cc.00.11.22 or 11.22.33.aabbcc
173              
174             @parts = map {
175 303         1319 my $o = $_;
  1026         1693  
176 1026 100       5075 (length($o) % 2) == 0 ? $o =~ m/(..)/g
177             : $o
178             } @parts;
179              
180             # 12 characters for EUI48, 16 for EUI64
181 303 0 0     842 if (
      33        
182             @parts == 1
183             && ( length $parts[0] == EUI48LENGTHHEX
184             || length $parts[0] == EUI64LENGTHHEX )
185             )
186             { # 0019e3010e72
187 0         0 local $_ = shift(@parts);
188 0         0 while (m{([a-f0-9]{2})}igx) { push( @parts, $1 ) }
  0         0  
189 0         0 return [ map { hex($_) } @parts ]
  0         0  
190             }
191              
192             # 00:19:e3:01:0e:72
193 303 100 100     1200 if ( @parts == EUI48LENGTHDEC || @parts == EUI64LENGTHDEC ) {
194 297         615 return [ map { hex($_) } @parts ]
  1932         4861  
195             }
196              
197             # 0019:e301:0e72
198 6 100 66     28 if ( @parts == EUI48LENGTHDEC / 2 || @parts == EUI64LENGTHDEC / 2 )
199             {
200             # it would be nice to accept no leading 0's but this gives
201             # problems detecting broken formatted macs.
202             # cisco doesnt drop leading zeros so lets go for the least
203             # edgey of the edge cases.
204 1 50   1   5 last if (first {length $_ < 4} @parts);
  1         6  
205              
206             return [
207             map {
208 0 0       0 m{^ ([a-f0-9]{2}) ([a-f0-9]{2}) $}ix
  0         0  
209             && ( hex($1), hex($2) )
210             } @parts
211             ];
212             }
213              
214             last
215              
216 5         14 } # just so we can jump out
217              
218 32   66     221 $e ||= "Invalid MAC format '$mac'";
219              
220 32 100       109 if ( defined $_die ) {
    100          
221 11 50       1485 croak "$e\n" if $_die;
222             }
223             elsif ($NetAddr::MAC::die_on_error) {
224 20         4646 croak "$e\n";
225             }
226              
227 1         2 $NetAddr::MAC::errstr = $e;
228              
229             return
230 1         4 }
231              
232             }
233              
234              
235             sub random {
236              
237 0     0 1 0 my ( $p, @q ) = @_;
238 0   0     0 my $c = ref($p) || $p;
239 0         0 my $self = bless {}, $c;
240              
241             # clear the errstr, see also RT96045
242 0         0 $NetAddr::MAC::errstr = undef;
243              
244 0 0       0 unless (@q) {
245 0         0 my $e = q|Please provide an oui prefix|;
246 0 0       0 croak "$e\n" if $NetAddr::MAC::die_on_error;
247 0         0 $NetAddr::MAC::errstr = $e;
248             return
249 0         0 }
250              
251 0         0 die 'TODO';
252              
253             # massage a single argument into a mac argument if needed
254 0 0       0 $self->_init( @q % 2 ? ( oui => shift @q, @q ) : @q )
    0          
255             or return;
256              
257 0         0 return $self
258              
259             }
260              
261              
262             sub original {
263              
264 0     0 1 0 my $self = shift;
265             return $self->{original}
266              
267 0         0 }
268              
269              
270             sub oui {
271              
272 1     1 1 421 my $self = shift;
273             return uc join(
274             q{-},
275 3         18 map { sprintf( '%02x', $_ ) }
276 1         4 @{ $self->{mac} }[0 .. 2]
  1         12  
277             );
278              
279             }
280              
281              
282             sub errstr {
283              
284 0     0 1 0 my $self = shift;
285 0 0       0 return $NetAddr::MAC::errstr unless ref $self;
286             return $self->{_errstr}
287              
288 0         0 }
289              
290              
291             sub is_eui48 {
292 192     192 1 288 my $self = shift;
293 192         306 return scalar @{ $self->{mac} } == EUI48LENGTHDEC
  192         2467  
294             }
295              
296              
297             sub is_eui64 {
298 21     21 1 40 my $self = shift;
299 21         35 return scalar @{ $self->{mac} } == EUI64LENGTHDEC
  21         148  
300             }
301              
302              
303             sub is_multicast {
304 15     15 1 28 my $self = shift;
305              
306 15   100     90 return ($self->{mac}->[0] & 1) && ! is_broadcast($self);
307             }
308              
309              
310              
311             sub is_broadcast {
312 22     22 1 41 my $self = shift;
313              
314 22         36 for (@{$self->{mac}}) {
  22         66  
315 32 100       174 return 0 if $_ != 255
316             }
317 2         17 return 1
318             }
319              
320              
321             sub is_vrrp {
322 39     39 1 65 my $self = shift;
323              
324 39   100     111 return is_vrrp4( $self ) || is_vrrp6( $self );
325             }
326              
327              
328             sub is_vrrp4 {
329 43     43 1 75 my $self = shift;
330              
331             return
332             is_eui48($self) &&
333             $self->{mac}->[0] == 0 &&
334             $self->{mac}->[1] == 0 &&
335             $self->{mac}->[2] == hex('0x5e') &&
336             $self->{mac}->[3] == 0 &&
337 43   100     87 $self->{mac}->[4] == 1;
338              
339             }
340              
341              
342             sub is_vrrp6 {
343 35     35 1 63 my $self = shift;
344              
345             return
346             is_eui48($self) &&
347             $self->{mac}->[0] == 0 &&
348             $self->{mac}->[1] == 0 &&
349             $self->{mac}->[2] == hex('0x5e') &&
350             $self->{mac}->[3] == 0 &&
351 35   100     64 $self->{mac}->[4] == 2;
352              
353             }
354              
355              
356             sub is_hsrp {
357 31     31 1 52 my $self = shift;
358              
359             return
360             is_eui48($self) &&
361             $self->{mac}->[0] == 0 &&
362             $self->{mac}->[1] == 0 &&
363             $self->{mac}->[2] == hex('0xc') &&
364             $self->{mac}->[3] == 7 &&
365 31   66     83 $self->{mac}->[4] == hex('0xac');
366              
367             }
368              
369              
370             sub is_hsrp2 {
371 31     31 1 53 my $self = shift;
372              
373             return
374             is_eui48($self) &&
375             $self->{mac}->[0] == 0 &&
376             $self->{mac}->[1] == 0 &&
377             $self->{mac}->[2] == hex('0xc') &&
378 31   100     64 $self->{mac}->[3] == hex('0x9f');
379 0         0 $self->{mac}->[4] >= 240; # 0xFX
380              
381             }
382              
383              
384              
385             sub is_msnlb {
386 31     31 1 54 my $self = shift;
387              
388             return
389             is_eui48($self) &&
390             ($self->{mac}->[0] == 2
391             || $self->{mac}->[0] == 3) &&
392 31   66     65 $self->{mac}->[1] == hex('0xbf')
393              
394             }
395              
396              
397             sub is_unicast {
398 15     15 1 32 my $self = shift;
399 15         105 return ! ($self->{mac}->[0] & 1);
400             }
401              
402              
403             sub is_local {
404 56     56 1 83 my $self = shift;
405 56         392 return $self->{mac}->[0] & 2
406             }
407              
408              
409             sub is_universal {
410 28     28 1 45 my $self = shift;
411 28         64 return !is_local($self)
412             }
413              
414              
415             sub as_basic {
416 1     1 1 2 my $self = shift;
417 1         3 return join( q{}, map { sprintf( '%02x', $_ ) } @{ $self->{mac} } )
  6         25  
  1         3  
418             }
419              
420              
421             sub as_bridge_id {
422 1     1 1 1463 my $self = shift;
423             return $self->{priority}
424 1         6 . '#'
425             . $self->as_cisco;
426             }
427              
428              
429             sub as_bpr {
430 1     1 1 2 my $self = shift;
431             return
432             q{1,}
433 1         4 . scalar @{ $self->{mac} } . q{,}
434 1         3 . join( q{:}, map { sprintf( '%02x', $_ ) } @{ $self->{mac} } );
  6         25  
  1         3  
435             }
436              
437              
438             sub as_cisco {
439 2     2 1 7 my $self = shift;
440             return join( q{.},
441 2         32 map { m{([a-f0-9]{4})}gxi }
442 2         6 join( q{}, map { sprintf( '%02x', $_ ) } @{ $self->{mac} } ) )
  12         36  
  2         13  
443             }
444              
445              
446             sub as_ieee {
447 1     1 1 2 my $self = shift;
448 1         3 return join( q{:}, map { sprintf( '%02x', $_ ) } @{ $self->{mac} } )
  6         23  
  1         3  
449             }
450              
451              
452             sub as_ipv6_suffix {
453              
454 0     0 1 0 my $self = shift;
455 0         0 my @tmpmac;
456              
457             # be slightly evil here, so that hashrefs and objects work
458 0 0       0 if ( is_eui48($self) ) {
459              
460             # save this for later
461 0         0 @tmpmac = @{ $self->{mac} };
  0         0  
462              
463 0         0 to_eui64($self);
464              
465             }
466              
467 0         0 my @suffix = ( @{ $self->{mac} }[0] ^ 0x02, @{ $self->{mac} }[ 1 .. 7 ] );
  0         0  
  0         0  
468              
469             # restore the eui48 if needed
470 0 0       0 $self->{mac} = \@tmpmac if @tmpmac;
471              
472             return join(
473             q{:},
474             map {
475 0         0 my $i = $_;
  0         0  
476 0         0 $i *= 2;
477 0         0 sprintf( '%02x%02x', $suffix[$i], $suffix[ $i + 1 ] )
478             } 0 .. 3
479             );
480             }
481              
482              
483             sub as_microsoft {
484 1     1 1 2 my $self = shift;
485 1         2 return join( q{-}, map { sprintf( '%02x', $_ ) } @{ $self->{mac} } )
  6         23  
  1         4  
486             }
487              
488              
489             sub as_pgsql {
490 1     1 1 3 my $self = shift;
491              
492             # there may be a better way to do this
493 1         2 my $len = scalar @{ $self->{mac} };
  1         3  
494             return join(
495             q{:},
496             join( '',
497 3         40 map { sprintf( '%02x', $_ ) }
498 1         3 @{ $self->{mac} }[ 0 .. ( $len / 2 - 1 ) ] ),
499             join( '',
500 3         15 map { sprintf( '%02x', $_ ) }
501 1         7 @{ $self->{mac} }[ ( $len / 2 ) .. ( $len - 1 ) ] ),
  1         4  
502             );
503             }
504              
505              
506             sub as_singledash {
507 1     1 1 2 my $self = shift;
508              
509             # there may be a better way to do this
510 1         2 my $len = scalar @{ $self->{mac} };
  1         4  
511             return join(
512             q{-},
513             join( '',
514 3         13 map { sprintf( '%02x', $_ ) }
515 1         4 @{ $self->{mac} }[ 0 .. ( $len / 2 - 1 ) ] ),
516             join( '',
517 3         15 map { sprintf( '%02x', $_ ) }
518 1         6 @{ $self->{mac} }[ ( $len / 2 ) .. ( $len - 1 ) ] ),
  1         3  
519             );
520             }
521              
522              
523             sub as_sun {
524 1     1 1 2 my $self = shift;
525 1         3 return join( q{-}, map { sprintf( '%01x', $_ ) } @{ $self->{mac} } )
  6         23  
  1         3  
526             }
527              
528              
529             sub as_tokenring {
530              
531 3     3 1 6 my $self = shift;
532              
533             return join '-', map {
534 18         29 my $byte = $_;
535 18         25 my $rev = 0;
536 18         148 $rev = ($rev << 1) | ($byte & 1), $byte >>= 1 for 1..8;
537 18         77 sprintf '%02x', $rev
538 3         6 } @{ $self->{mac} };
  3         8  
539             }
540              
541              
542             sub to_eui48 {
543              
544 0     0 1 0 my $self = shift;
545              
546             # be slightly evil here, so that hashrefs and objects work
547 0 0       0 if ( is_eui64($self) ) {
548 0 0 0     0 if ( @{ $self->{mac} }[3] == 0xff
  0   0     0  
549             and
550             ( @{ $self->{mac} }[4] == 0xff or @{ $self->{mac} }[4] == 0xfe ) )
551             {
552              
553             # convert to eui-48
554 0         0 $self->{mac} = [ @{ $self->{mac} }[ 0 .. 2, 5 .. 7 ] ];
  0         0  
555             }
556             else {
557 0         0 my $e = 'eui-64 address is not derived from an eui-48 address';
558 0 0       0 croak "$e\n" if $self->{_die};
559 0         0 $self->{_errstr} = $e;
560             return
561 0         0 }
562             }
563              
564 0         0 return 1
565             }
566              
567              
568             sub to_eui64 {
569              
570 0     0 1 0 my $self = shift;
571              
572             # be slightly evil here so that hashrefs and objects work
573 0 0       0 if ( is_eui48($self) ) {
574              
575             # convert to EUI64
576             $self->{mac} = [
577 0         0 @{ $self->{mac} }[ 0 .. 2 ],
578             0xff,
579             0xfe,
580 0         0 @{ $self->{mac} }[ 3 .. 5 ]
  0         0  
581             ];
582              
583             }
584 0         0 else { return }
585              
586 0         0 return 1
587             }
588              
589              
590             sub mac_is_eui48 {
591              
592 31     31 1 248854 my $mac = shift;
593 31 50       124 croak 'please use is_eui48'
594             if ref $mac eq __PACKAGE__;
595 31 50       69 if ( ref $mac ) {
596 0         0 my $e = 'argument must be a string';
597 0 0       0 croak "$e\n" if $NetAddr::MAC::die_on_error;
598 0         0 $NetAddr::MAC::errstr = $e;
599             return
600 0         0 }
601              
602 31 50       128 $mac = _mac_to_integers($mac) or return;
603 21         79 return is_eui48( { mac => $mac } )
604              
605             }
606              
607              
608             sub mac_is_eui64 {
609              
610 31     31 1 30321 my $mac = shift;
611 31 50       116 croak 'please use is_eui64'
612             if ref $mac eq __PACKAGE__;
613 31 50       73 if ( ref $mac ) {
614 0         0 my $e = 'argument must be a string';
615 0 0       0 croak "$e\n" if $NetAddr::MAC::die_on_error;
616 0         0 $NetAddr::MAC::errstr = $e;
617             return
618 0         0 }
619              
620 31 50       72 $mac = _mac_to_integers($mac) or return;
621 21         117 return is_eui64( { mac => $mac } )
622              
623             }
624              
625              
626             sub mac_is_multicast {
627              
628 15     15 1 2544 my $mac = shift;
629 15 50       48 croak 'please use is_multicast'
630             if ref $mac eq __PACKAGE__;
631 15 50       31 if ( ref $mac ) {
632 0         0 my $e = 'argument must be a string';
633 0 0       0 croak "$e\n" if $NetAddr::MAC::die_on_error;
634 0         0 $NetAddr::MAC::errstr = $e;
635             return
636 0         0 }
637              
638 15 50       39 $mac = _mac_to_integers($mac) or return;
639 15         60 return is_multicast( { mac => $mac } )
640              
641             }
642              
643              
644              
645             sub mac_is_broadcast {
646              
647 15     15 1 498 my $mac = shift;
648 15 50       48 croak 'please use is_broadcast'
649             if ref $mac eq __PACKAGE__;
650 15 50       36 if ( ref $mac ) {
651 0         0 my $e = 'argument must be a string';
652 0 0       0 croak "$e\n" if $NetAddr::MAC::die_on_error;
653 0         0 $NetAddr::MAC::errstr = $e;
654             return
655 0         0 }
656              
657 15 50       36 $mac = _mac_to_integers($mac) or return;
658 15         61 return is_broadcast( { mac => $mac } )
659              
660             }
661              
662              
663             sub mac_is_unicast {
664              
665 15     15 1 3168 my $mac = shift;
666 15 50       47 croak 'please use is_unicast'
667             if ref $mac eq __PACKAGE__;
668 15 50       42 if ( ref $mac ) {
669 0         0 my $e = 'argument must be a string';
670 0 0       0 croak "$e\n" if $NetAddr::MAC::die_on_error;
671 0         0 $NetAddr::MAC::errstr = $e;
672             return
673 0         0 }
674              
675 15 50       41 $mac = _mac_to_integers($mac) or return;
676 15         59 return is_unicast( { mac => $mac } )
677              
678             }
679              
680              
681             sub mac_is_vrrp {
682              
683 39     39 1 7969 my $mac = shift;
684 39 50       147 croak 'please use is_vrrp'
685             if ref $mac eq __PACKAGE__;
686 39 50       94 if ( ref $mac ) {
687 0         0 my $e = 'argument must be a string';
688 0 0       0 croak "$e\n" if $NetAddr::MAC::die_on_error;
689 0         0 $NetAddr::MAC::errstr = $e;
690              
691             return
692 0         0 }
693              
694 39 50       96 $mac = _mac_to_integers($mac) or return;
695 39         155 return is_vrrp( { mac => $mac } )
696              
697             }
698              
699              
700             sub mac_is_vrrp4 {
701              
702 4     4 1 9 my $mac = shift;
703 4 50       16 croak 'please use is_vrrp4'
704             if ref $mac eq __PACKAGE__;
705 4 50       12 if ( ref $mac ) {
706 0         0 my $e = 'argument must be a string';
707 0 0       0 croak "$e\n" if $NetAddr::MAC::die_on_error;
708 0         0 $NetAddr::MAC::errstr = $e;
709              
710             return
711 0         0 }
712              
713 4 50       10 $mac = _mac_to_integers($mac) or return;
714 4         18 return is_vrrp4( { mac => $mac } )
715              
716             }
717              
718              
719             sub mac_is_vrrp6 {
720              
721 4     4 1 11 my $mac = shift;
722 4 50       14 croak 'please use is_vrrp6'
723             if ref $mac eq __PACKAGE__;
724 4 50       11 if ( ref $mac ) {
725 0         0 my $e = 'argument must be a string';
726 0 0       0 croak "$e\n" if $NetAddr::MAC::die_on_error;
727 0         0 $NetAddr::MAC::errstr = $e;
728              
729             return
730 0         0 }
731              
732 4 50       11 $mac = _mac_to_integers($mac) or return;
733 4         40 return is_vrrp6( { mac => $mac } )
734              
735             }
736              
737              
738             sub mac_is_hsrp {
739              
740 31     31 1 1720 my $mac = shift;
741 31 50       96 croak 'please use is_hsrp'
742             if ref $mac eq __PACKAGE__;
743 31 50       70 if ( ref $mac ) {
744 0         0 my $e = 'argument must be a string';
745 0 0       0 croak "$e\n" if $NetAddr::MAC::die_on_error;
746 0         0 $NetAddr::MAC::errstr = $e;
747              
748             return
749 0         0 }
750              
751 31 50       72 $mac = _mac_to_integers($mac) or return;
752 31         157 return is_hsrp( { mac => $mac } )
753              
754             }
755              
756              
757             sub mac_is_hsrp2 {
758              
759 31     31 1 2459 my $mac = shift;
760 31 50       100 croak 'please use is_hsrp2'
761             if ref $mac eq __PACKAGE__;
762 31 50       69 if ( ref $mac ) {
763 0         0 my $e = 'argument must be a string';
764 0 0       0 croak "$e\n" if $NetAddr::MAC::die_on_error;
765 0         0 $NetAddr::MAC::errstr = $e;
766              
767             return
768 0         0 }
769              
770 31 50       76 $mac = _mac_to_integers($mac) or return;
771 31         194 return is_hsrp2( { mac => $mac } )
772              
773             }
774              
775              
776             sub mac_is_msnlb {
777              
778 31     31 1 942 my $mac = shift;
779 31 50       98 croak 'please use is_msnlb'
780             if ref $mac eq __PACKAGE__;
781 31 50       68 if ( ref $mac ) {
782 0         0 my $e = 'argument must be a string';
783 0 0       0 croak "$e\n" if $NetAddr::MAC::die_on_error;
784 0         0 $NetAddr::MAC::errstr = $e;
785              
786             return
787 0         0 }
788              
789 31 50       78 $mac = _mac_to_integers($mac) or return;
790 31         124 return is_msnlb( { mac => $mac } )
791              
792             }
793              
794              
795             sub mac_is_local {
796              
797 28     28 1 3938 my $mac = shift;
798 28 50       101 croak 'please use is_local'
799             if ref $mac eq __PACKAGE__;
800 28 50       66 if ( ref $mac ) {
801 0         0 my $e = 'argument must be a string';
802 0 0       0 croak "$e\n" if $NetAddr::MAC::die_on_error;
803 0         0 $NetAddr::MAC::errstr = $e;
804             return
805 0         0 }
806              
807 28 50       67 $mac = _mac_to_integers($mac) or return;
808 28         113 return is_local( { mac => $mac } )
809              
810             }
811              
812              
813             sub mac_is_universal {
814              
815 28     28 1 7789 my $mac = shift;
816 28 50       96 croak 'please use is_universal'
817             if ref $mac eq __PACKAGE__;
818 28 50       65 if ( ref $mac ) {
819 0         0 my $e = 'argument must be a string';
820 0 0       0 croak "$e\n" if $NetAddr::MAC::die_on_error;
821 0         0 $NetAddr::MAC::errstr = $e;
822             return
823 0         0 }
824              
825 28 50       73 $mac = _mac_to_integers($mac) or return;
826 28         137 return is_universal( { mac => $mac } )
827              
828             }
829              
830              
831             sub mac_as_basic {
832              
833 1     1 1 285842 my $mac = shift;
834 1 50       6 croak 'please use as_basic'
835             if ref $mac eq __PACKAGE__;
836 1 50       5 if ( ref $mac ) {
837 0         0 my $e = 'argument must be a string';
838 0 0       0 croak "$e\n" if $NetAddr::MAC::die_on_error;
839 0         0 $NetAddr::MAC::errstr = $e;
840             return
841 0         0 }
842              
843 1 50       6 $mac = _mac_to_integers($mac) or return;
844 1         7 return as_basic( { mac => $mac } )
845              
846             }
847              
848              
849             sub mac_as_bpr {
850              
851 1     1 1 2 my $mac = shift;
852 1 50       7 croak 'please use as_basic'
853             if ref $mac eq __PACKAGE__;
854 1 50       4 if ( ref $mac ) {
855 0         0 my $e = 'argument must be a string';
856 0 0       0 croak "$e\n" if $NetAddr::MAC::die_on_error;
857 0         0 $NetAddr::MAC::errstr = $e;
858             return
859 0         0 }
860              
861 1 50       3 $mac = _mac_to_integers($mac) or return;
862 1         7 return as_bpr( { mac => $mac } )
863              
864             }
865              
866              
867             sub mac_as_cisco {
868              
869 1     1 1 4 my $mac = shift;
870 1 50       5 croak 'please use as_cisco'
871             if ref $mac eq __PACKAGE__;
872 1 50       4 if ( ref $mac ) {
873 0         0 my $e = 'argument must be a string';
874 0 0       0 croak "$e\n" if $NetAddr::MAC::die_on_error;
875 0         0 $NetAddr::MAC::errstr = $e;
876             return
877 0         0 }
878              
879 1 50       4 $mac = _mac_to_integers($mac) or return;
880 1         6 return as_cisco( { mac => $mac } )
881              
882             }
883              
884              
885             sub mac_as_ieee {
886              
887 1     1 1 4 my $mac = shift;
888 1 50       4 croak 'please use as_ieee'
889             if ref $mac eq __PACKAGE__;
890 1 50       4 if ( ref $mac ) {
891 0         0 my $e = 'argument must be a string';
892 0 0       0 croak "$e\n" if $NetAddr::MAC::die_on_error;
893 0         0 $NetAddr::MAC::errstr = $e;
894             return
895 0         0 }
896              
897 1 50       4 $mac = _mac_to_integers($mac) or return;
898 1         7 return as_ieee( { mac => $mac } )
899              
900             }
901              
902              
903             sub mac_as_ipv6_suffix {
904              
905 0     0 1 0 my $mac = shift;
906 0 0       0 croak 'please use as_ipv6_suffix'
907             if ref $mac eq __PACKAGE__;
908 0 0       0 if ( ref $mac ) {
909 0         0 my $e = 'argument must be a string';
910 0 0       0 croak "$e\n" if $NetAddr::MAC::die_on_error;
911 0         0 $NetAddr::MAC::errstr = $e;
912             return
913 0         0 }
914              
915 0 0       0 $mac = _mac_to_integers($mac) or return;
916 0         0 return as_ipv6_suffix( { mac => $mac } )
917              
918             }
919              
920              
921             sub mac_as_microsoft {
922              
923 1     1 1 4 my $mac = shift;
924              
925 1 50       5 croak 'please use as_microsoft'
926             if ref $mac eq __PACKAGE__;
927 1 50       4 if ( ref $mac ) {
928 0         0 my $e = 'argument must be a string';
929 0 0       0 croak "$e\n" if $NetAddr::MAC::die_on_error;
930 0         0 $NetAddr::MAC::errstr = $e;
931             return
932 0         0 }
933              
934 1 50       4 $mac = _mac_to_integers($mac) or return;
935 1         6 return as_microsoft( { mac => $mac } )
936              
937             }
938              
939              
940             sub mac_as_pgsql {
941              
942 1     1 1 3 my $mac = shift;
943              
944 1 50       5 croak 'please use as_pgsql'
945             if ref $mac eq __PACKAGE__;
946 1 50       4 if ( ref $mac ) {
947 0         0 my $e = 'argument must be a string';
948 0 0       0 croak "$e\n" if $NetAddr::MAC::die_on_error;
949 0         0 $NetAddr::MAC::errstr = $e;
950             return
951 0         0 }
952              
953 1 50       3 $mac = _mac_to_integers($mac) or return;
954 1         6 return as_pgsql( { mac => $mac } )
955              
956             }
957              
958              
959             sub mac_as_singledash {
960              
961 1     1 1 3 my $mac = shift;
962              
963 1 50       5 croak 'please use as_singledash'
964             if ref $mac eq __PACKAGE__;
965 1 50       6 if ( ref $mac ) {
966 0         0 my $e = 'argument must be a string';
967 0 0       0 croak "$e\n" if $NetAddr::MAC::die_on_error;
968 0         0 $NetAddr::MAC::errstr = $e;
969             return
970 0         0 }
971              
972 1 50       4 $mac = _mac_to_integers($mac) or return;
973 1         7 return as_singledash( { mac => $mac } )
974              
975             }
976              
977              
978             sub mac_as_sun {
979              
980 1     1 1 3 my $mac = shift;
981              
982 1 50       5 croak 'please use as_sun'
983             if ref $mac eq __PACKAGE__;
984 1 50       3 if ( ref $mac ) {
985 0         0 my $e = 'argument must be a string';
986 0 0       0 croak "$e\n" if $NetAddr::MAC::die_on_error;
987 0         0 $NetAddr::MAC::errstr = $e;
988             return
989 0         0 }
990              
991 1 50       4 $mac = _mac_to_integers($mac) or return;
992 1         8 return as_sun( { mac => $mac } )
993              
994             }
995              
996              
997             sub mac_as_tokenring {
998              
999 3     3 1 9 my $mac = shift;
1000              
1001 3 50       11 croak 'please use as_tokenring'
1002             if ref $mac eq __PACKAGE__;
1003 3 50       8 if ( ref $mac ) {
1004 0         0 my $e = 'argument must be a string';
1005 0 0       0 croak "$e\n" if $NetAddr::MAC::die_on_error;
1006 0         0 $NetAddr::MAC::errstr = $e;
1007             return
1008 0         0 }
1009              
1010 3 50       8 $mac = _mac_to_integers($mac) or return;
1011 3         14 return as_tokenring( { mac => $mac } )
1012              
1013             }
1014              
1015              
1016             1;
1017              
1018             __END__