Code Duplication    Length = 30-30 lines in 3 locations

v0x04/match_fields.py 3 locations

@@ 651-680 (lines=30) @@
648
        return cls(value)
649
650
651
class MatchEXTHDR(MatchField):
652
    """Match for IPV6 EXTHDR."""
653
654
    name = 'v6_hdr'
655
    oxm_field = OxmOfbMatchField.OFPXMT_OFB_IPV6_EXTHDR
656
657
    def as_of_tlv(self):
658
        """Return a pyof OXM TLV instance."""
659
        try:
660
            value = int(self.value)
661
            mask = None
662
            oxm_hasmask = False
663
        except ValueError:
664
            value, mask = map(int, self.value.split('/'))
665
            oxm_hasmask = True
666
        value_bytes = value.to_bytes(2, 'big')
667
        if mask:
668
            value_bytes += mask.to_bytes(2, 'big')
669
        return OxmTLV(oxm_field=self.oxm_field,
670
                      oxm_hasmask=oxm_hasmask,
671
                      oxm_value=value_bytes)
672
673
    @classmethod
674
    def from_of_tlv(cls, tlv):
675
        """Return an instance from a pyof OXM TLV."""
676
        value = int.from_bytes(tlv.oxm_value[:2], 'big')
677
        if tlv.oxm_hasmask:
678
            exhead_mask = int.from_bytes(tlv.oxm_value[2:], 'big')
679
            value = f'{value}/{exhead_mask}'
680
        return cls(value)
681
682
683
class MatchFieldFactory(ABC):
@@ 619-648 (lines=30) @@
616
        return cls(tll)
617
618
619
class MatchPBBISID(MatchField):
620
    """Match for PBB ISID."""
621
622
    name = 'pbb_isid'
623
    oxm_field = OxmOfbMatchField.OFPXMT_OFB_PBB_ISID
624
625
    def as_of_tlv(self):
626
        """Return a pyof OXM TLV instance."""
627
        try:
628
            value = int(self.value)
629
            mask = None
630
            oxm_hasmask = False
631
        except ValueError:
632
            value, mask = map(int, self.value.split('/'))
633
            oxm_hasmask = True
634
        value_bytes = value.to_bytes(3, 'big')
635
        if mask:
636
            value_bytes += mask.to_bytes(3, 'big')
637
        return OxmTLV(oxm_field=self.oxm_field,
638
                      oxm_hasmask=oxm_hasmask,
639
                      oxm_value=value_bytes)
640
641
    @classmethod
642
    def from_of_tlv(cls, tlv):
643
        """Return an instance from a pyof OXM TLV."""
644
        value = int.from_bytes(tlv.oxm_value[:3], 'big')
645
        if tlv.oxm_hasmask:
646
            pbb_isid_mask = int.from_bytes(tlv.oxm_value[3:], 'big')
647
            value = f'{value}/{pbb_isid_mask}'
648
        return cls(value)
649
650
651
class MatchEXTHDR(MatchField):
@@ 497-526 (lines=30) @@
494
        return cls(opcode)
495
496
497
class MatchIPV6FLabel(MatchField):
498
    """Match for IPV6 Flow Label."""
499
500
    name = 'ipv6_flabel'
501
    oxm_field = OxmOfbMatchField.OFPXMT_OFB_IPV6_FLABEL
502
503
    def as_of_tlv(self):
504
        """Return a pyof OXM TLV instance."""
505
        try:
506
            value = int(self.value)
507
            mask = None
508
            oxm_hasmask = False
509
        except ValueError:
510
            value, mask = map(int, self.value.split('/'))
511
            oxm_hasmask = True
512
        value_bytes = value.to_bytes(4, 'big')
513
        if mask:
514
            value_bytes += mask.to_bytes(4, 'big')
515
        return OxmTLV(oxm_field=self.oxm_field,
516
                      oxm_hasmask=oxm_hasmask,
517
                      oxm_value=value_bytes)
518
519
    @classmethod
520
    def from_of_tlv(cls, tlv):
521
        """Return an instance from a pyof OXM TLV."""
522
        value = int.from_bytes(tlv.oxm_value[:4], 'big')
523
        if tlv.oxm_hasmask:
524
            flabel_mask = int.from_bytes(tlv.oxm_value[4:], 'big')
525
            value = f'{value}/{flabel_mask}'
526
        return cls(value)
527
528
529
class MatchICMPV6Type(MatchField):