@@ -30,6 +30,10 @@ func (p *Parser) parseMatch(ms *[]Match) (state, error) {
30
30
s , err = p .parseStatistic (& m .Flags )
31
31
case "multiport" :
32
32
s , err = p .parseMultiport (& m .Flags )
33
+ case "icmp" :
34
+ s , err = p .parseIcmp (& m .Flags )
35
+ case "icmp6" :
36
+ s , err = p .parseIcmp6 (& m .Flags )
33
37
default :
34
38
if _ , ok := matchModules [lit ]; ok {
35
39
return sError , fmt .Errorf ("match modules %q is not implemented" , lit )
@@ -529,3 +533,105 @@ func (p *Parser) parseComment(f *map[string]Flag) (state, error) {
529
533
}
530
534
return sStart , nil
531
535
}
536
+
537
+ func (p * Parser ) parseIcmp (f * map [string ]Flag ) (state , error ) {
538
+ s := sStart
539
+ for tok , lit := p .scanIgnoreWhitespace (); tok != EOF ; tok , lit = p .scanIgnoreWhitespace () {
540
+ for nextValue := false ; ! nextValue ; {
541
+ nextValue = true
542
+ switch s {
543
+ case sStart :
544
+ switch tok {
545
+ case NOT :
546
+ s = sINotF
547
+ case FLAG :
548
+ s = sIF
549
+ nextValue = false
550
+ default :
551
+ return sError , fmt .Errorf ("unexpected token %q, expected flag, or \" !\" " , lit )
552
+ }
553
+ case sINotF :
554
+ switch {
555
+ case lit == "--icmp-type" :
556
+ _ , lit := p .scanIgnoreWhitespace ()
557
+ (* f )["icmp-type" ] = Flag {
558
+ Not : true ,
559
+ Values : []string {lit },
560
+ }
561
+ s = sStart
562
+ default :
563
+ p .unscan (1 )
564
+ return sNot , nil
565
+ }
566
+ case sIF :
567
+ switch {
568
+ case lit == "--icmp-type" :
569
+ _ , lit := p .scanIgnoreWhitespace ()
570
+ (* f )["icmp-type" ] = Flag {
571
+ Values : []string {lit },
572
+ }
573
+ s = sStart
574
+ default :
575
+ // The end of the match statement is reached.
576
+ p .unscan (1 )
577
+ return sStart , nil
578
+ }
579
+
580
+ default :
581
+ return sStart , errors .New ("unexpected error parsing match extension" )
582
+ }
583
+ }
584
+ }
585
+ return sStart , nil
586
+ }
587
+
588
+ func (p * Parser ) parseIcmp6 (f * map [string ]Flag ) (state , error ) {
589
+ s := sStart
590
+ for tok , lit := p .scanIgnoreWhitespace (); tok != EOF ; tok , lit = p .scanIgnoreWhitespace () {
591
+ for nextValue := false ; ! nextValue ; {
592
+ nextValue = true
593
+ switch s {
594
+ case sStart :
595
+ switch tok {
596
+ case NOT :
597
+ s = sINotF
598
+ case FLAG :
599
+ s = sIF
600
+ nextValue = false
601
+ default :
602
+ return sError , fmt .Errorf ("unexpected token %q, expected flag, or \" !\" " , lit )
603
+ }
604
+ case sINotF :
605
+ switch {
606
+ case lit == "--icmpv6-type" :
607
+ _ , lit := p .scanIgnoreWhitespace ()
608
+ (* f )["icmpv6-type" ] = Flag {
609
+ Not : true ,
610
+ Values : []string {lit },
611
+ }
612
+ s = sStart
613
+ default :
614
+ p .unscan (1 )
615
+ return sNot , nil
616
+ }
617
+ case sIF :
618
+ switch {
619
+ case lit == "--icmpv6-type" :
620
+ _ , lit := p .scanIgnoreWhitespace ()
621
+ (* f )["icmpv6-type" ] = Flag {
622
+ Values : []string {lit },
623
+ }
624
+ s = sStart
625
+ default :
626
+ // The end of the match statement is reached.
627
+ p .unscan (1 )
628
+ return sStart , nil
629
+ }
630
+
631
+ default :
632
+ return sStart , errors .New ("unexpected error parsing match extension" )
633
+ }
634
+ }
635
+ }
636
+ return sStart , nil
637
+ }
0 commit comments