6
6
# cli params/rrd storage/sampling mods Steve Colam <[email protected] >
7
7
8
8
use strict;
9
+ use 5.010;
9
10
use IO::Select;
10
11
use IO::Socket;
11
12
use RRDs;
@@ -259,7 +260,7 @@ sub parse_netflow_v9_data_flowset {
259
260
my $datalen = length ($flowsetdata );
260
261
while (($ofs + $len ) <= $datalen ) {
261
262
# Interpret values according to template
262
- my ($inoctets , $outoctets , $srcas , $dstas , $snmpin , $snmpout , $ipversion );
263
+ my ($inoctets , $outoctets , $srcas , $dstas , $snmpin , $snmpout , $ipversion , $vlanin , $vlanout );
263
264
264
265
$inoctets = 0;
265
266
$outoctets = 0;
@@ -312,11 +313,15 @@ sub parse_netflow_v9_data_flowset {
312
313
$ipversion = unpack (" C" , $cur_fldval );
313
314
} elsif ($cur_fldtype == 27 || $cur_fldtype == 28) { # IPV6_SRC_ADDR/IPV6_DST_ADDR
314
315
$ipversion = 6;
316
+ } elsif ($cur_fldtype == 58) { # SRC_VLAN
317
+ $vlanin = unpack (" n" , $cur_fldval );
318
+ } elsif ($cur_fldtype == 59) { # SRC_VLAN
319
+ $vlanout = unpack (" n" , $cur_fldval );
315
320
}
316
321
}
317
322
318
323
if (defined ($srcas ) && defined ($dstas ) && defined ($snmpin ) && defined ($snmpout )) {
319
- handleflow($ipaddr , $inoctets + $outoctets , $srcas , $dstas , $snmpin , $snmpout , $ipversion , ' netflow' );
324
+ handleflow($ipaddr , $inoctets + $outoctets , $srcas , $dstas , $snmpin , $snmpout , $ipversion , ' netflow' , $vlanin , $vlanout );
320
325
}
321
326
}
322
327
}
@@ -400,7 +405,7 @@ sub parse_netflow_v10_data_flowset {
400
405
my $datalen = length ($flowsetdata );
401
406
while (($ofs + $len ) <= $datalen ) {
402
407
# Interpret values according to template
403
- my ($inoctets , $outoctets , $srcas , $dstas , $snmpin , $snmpout , $ipversion );
408
+ my ($inoctets , $outoctets , $srcas , $dstas , $snmpin , $snmpout , $ipversion , $vlanin , $vlanout );
404
409
405
410
$inoctets = 0;
406
411
$outoctets = 0;
@@ -453,11 +458,15 @@ sub parse_netflow_v10_data_flowset {
453
458
$ipversion = unpack (" C" , $cur_fldval );
454
459
} elsif ($cur_fldtype == 27 || $cur_fldtype == 28) { # IPV6_SRC_ADDR/IPV6_DST_ADDR
455
460
$ipversion = 6;
461
+ } elsif ($cur_fldtype == 58) { # SRC_VLAN
462
+ $vlanin = unpack (" n" , $cur_fldval );
463
+ } elsif ($cur_fldtype == 59) { # SRC_VLAN
464
+ $vlanout = unpack (" n" , $cur_fldval );
456
465
}
457
466
}
458
467
459
468
if (defined ($srcas ) && defined ($dstas ) && defined ($snmpin ) && defined ($snmpout )) {
460
- handleflow($ipaddr , $inoctets + $outoctets , $srcas , $dstas , $snmpin , $snmpout , $ipversion , ' netflow' );
469
+ handleflow($ipaddr , $inoctets + $outoctets , $srcas , $dstas , $snmpin , $snmpout , $ipversion , ' netflow' , $vlanin , $vlanout );
461
470
}
462
471
}
463
472
}
@@ -541,13 +550,22 @@ sub parse_sflow {
541
550
if ($dstas == $myas ) {
542
551
$dstas = 0;
543
552
}
553
+
554
+ # Extract VLAN information
555
+ my ($vlanin , $vlanout );
556
+ if ($sFlowSample -> {' SwitchSrcVlan' }) {
557
+ $vlanin = $sFlowSample -> {' SwitchSrcVlan' };
558
+ }
559
+ if ($sFlowSample -> {' SwitchDestVlan' }) {
560
+ $vlanout = $sFlowSample -> {' SwitchDestVlan' };
561
+ }
544
562
545
- handleflow($ipaddr , $noctets , $srcas , $dstas , $snmpin , $snmpout , $ipversion , ' sflow' );
563
+ handleflow($ipaddr , $noctets , $srcas , $dstas , $snmpin , $snmpout , $ipversion , ' sflow' , $vlanin , $vlanout );
546
564
}
547
565
}
548
566
549
567
sub handleflow {
550
- my ($routerip , $noctets , $srcas , $dstas , $snmpin , $snmpout , $ipversion ) = @_ ;
568
+ my ($routerip , $noctets , $srcas , $dstas , $snmpin , $snmpout , $ipversion , $vlanin , $vlanout ) = @_ ;
551
569
552
570
if ($srcas == 0 && $dstas == 0) {
553
571
# don't care about internal traffic
@@ -564,14 +582,16 @@ sub handleflow {
564
582
if ($srcas == 0) {
565
583
$as = $dstas ;
566
584
$direction = " out" ;
567
- $ifalias = $knownlinks {inet_ntoa($routerip ) . ' _' . $snmpout };
585
+ $ifalias = $knownlinks {inet_ntoa($routerip ) . ' _' . $snmpout . ' /' . $vlanout };
586
+ $ifalias //= $knownlinks {inet_ntoa($routerip ) . ' _' . $snmpout };
568
587
} elsif ($dstas == 0) {
569
588
$as = $srcas ;
570
589
$direction = " in" ;
571
- $ifalias = $knownlinks {inet_ntoa($routerip ) . ' _' . $snmpin };
590
+ $ifalias = $knownlinks {inet_ntoa($routerip ) . ' _' . $snmpin . ' /' . $vlanin };
591
+ $ifalias //= $knownlinks {inet_ntoa($routerip ) . ' _' . $snmpin };
572
592
} else {
573
- handleflow($routerip , $noctets , $srcas , 0, $snmpin , $snmpout , $ipversion );
574
- handleflow($routerip , $noctets , 0, $dstas , $snmpin , $snmpout , $ipversion );
593
+ handleflow($routerip , $noctets , $srcas , 0, $snmpin , $snmpout , $ipversion , $vlanin , $vlanout );
594
+ handleflow($routerip , $noctets , 0, $dstas , $snmpin , $snmpout , $ipversion , $vlanin , $vlanout );
575
595
return ;
576
596
}
577
597
0 commit comments