Code Duplication    Length = 40-40 lines in 4 locations

v0x04/match_fields.py 4 locations

@@ 586-625 (lines=40) @@
583
        return cls(value)
584
585
586
class MatchARPTHA(MatchField):
587
    """Match for ARP Target MAC Address."""
588
589
    name = 'arp_tha'
590
    oxm_field = OxmOfbMatchField.OFPXMT_OFB_ARP_THA
591
592
    def as_of_tlv(self):
593
        """Return a pyof OXM TLV instance."""
594
        if '/' in self.value:
595
            value, mask = self.value.split('/')
596
            mask = mask.upper()
597
            if mask == 'FF:FF:FF:FF:FF:FF':
598
                mask = None
599
                oxm_hasmask = False
600
            else:
601
                oxm_hasmask = True
602
        else:
603
            value = self.value
604
            mask = None
605
            oxm_hasmask = False
606
        value_bytes = HWAddress(value).pack()
607
        if mask:
608
            value_bytes += HWAddress(mask).pack()
609
        return OxmTLV(oxm_field=self.oxm_field,
610
                      oxm_hasmask=oxm_hasmask,
611
                      oxm_value=value_bytes)
612
613
    @classmethod
614
    def from_of_tlv(cls, tlv):
615
        """Return an instance from a pyof OXM TLV."""
616
        hw_address = HWAddress()
617
        hw_address.unpack(tlv.oxm_value)
618
        addr_str = str(hw_address)
619
        value = addr_str
620
        if tlv.oxm_hasmask:
621
            hw_mask = HWAddress()
622
            hw_mask.unpack(tlv.oxm_value[6:])
623
            mask_str = str(hw_mask)
624
            value = f'{addr_str}/{mask_str}'
625
        return cls(value)
626
627
628
class MatchMPLSLabel(MatchField):
@@ 544-583 (lines=40) @@
541
        return cls(value)
542
543
544
class MatchARPSHA(MatchField):
545
    """Match for ARP Sender MAC Address."""
546
547
    name = 'arp_sha'
548
    oxm_field = OxmOfbMatchField.OFPXMT_OFB_ARP_SHA
549
550
    def as_of_tlv(self):
551
        """Return a pyof OXM TLV instance."""
552
        if '/' in self.value:
553
            value, mask = self.value.split('/')
554
            mask = mask.upper()
555
            if mask == 'FF:FF:FF:FF:FF:FF':
556
                mask = None
557
                oxm_hasmask = False
558
            else:
559
                oxm_hasmask = True
560
        else:
561
            value = self.value
562
            mask = None
563
            oxm_hasmask = False
564
        value_bytes = HWAddress(value).pack()
565
        if mask:
566
            value_bytes += HWAddress(mask).pack()
567
        return OxmTLV(oxm_field=self.oxm_field,
568
                      oxm_hasmask=oxm_hasmask,
569
                      oxm_value=value_bytes)
570
571
    @classmethod
572
    def from_of_tlv(cls, tlv):
573
        """Return an instance from a pyof OXM TLV."""
574
        hw_address = HWAddress()
575
        hw_address.unpack(tlv.oxm_value)
576
        addr_str = str(hw_address)
577
        value = addr_str
578
        if tlv.oxm_hasmask:
579
            hw_mask = HWAddress()
580
            hw_mask.unpack(tlv.oxm_value[6:])
581
            mask_str = str(hw_mask)
582
            value = f'{addr_str}/{mask_str}'
583
        return cls(value)
584
585
586
class MatchARPTHA(MatchField):
@@ 120-159 (lines=40) @@
117
        return cls(value)
118
119
120
class MatchDLDst(MatchField):
121
    """Match for datalink destination."""
122
123
    name = 'dl_dst'
124
    oxm_field = OxmOfbMatchField.OFPXMT_OFB_ETH_DST
125
126
    def as_of_tlv(self):
127
        """Return a pyof OXM TLV instance."""
128
        if '/' in self.value:
129
            value, mask = self.value.split('/')
130
            mask = mask.upper()
131
            if mask == 'FF:FF:FF:FF:FF:FF':
132
                mask = None
133
                oxm_hasmask = False
134
            else:
135
                oxm_hasmask = True
136
        else:
137
            value = self.value
138
            mask = None
139
            oxm_hasmask = False
140
        value_bytes = HWAddress(value).pack()
141
        if mask:
142
            value_bytes += HWAddress(mask).pack()
143
        return OxmTLV(oxm_field=self.oxm_field,
144
                      oxm_hasmask=oxm_hasmask,
145
                      oxm_value=value_bytes)
146
147
    @classmethod
148
    def from_of_tlv(cls, tlv):
149
        """Return an instance from a pyof OXM TLV."""
150
        hw_address = HWAddress()
151
        hw_address.unpack(tlv.oxm_value)
152
        addr_str = str(hw_address)
153
        value = addr_str
154
        if tlv.oxm_hasmask:
155
            hw_mask = HWAddress()
156
            hw_mask.unpack(tlv.oxm_value[6:])
157
            mask_str = str(hw_mask)
158
            value = f'{addr_str}/{mask_str}'
159
        return cls(value)
160
161
162
class MatchDLType(MatchField):
@@ 78-117 (lines=40) @@
75
        return cls(priority)
76
77
78
class MatchDLSrc(MatchField):
79
    """Match for datalink source."""
80
81
    name = 'dl_src'
82
    oxm_field = OxmOfbMatchField.OFPXMT_OFB_ETH_SRC
83
84
    def as_of_tlv(self):
85
        """Return a pyof OXM TLV instance."""
86
        if '/' in self.value:
87
            value, mask = self.value.split('/')
88
            mask = mask.upper()
89
            if mask == 'FF:FF:FF:FF:FF:FF':
90
                mask = None
91
                oxm_hasmask = False
92
            else:
93
                oxm_hasmask = True
94
        else:
95
            value = self.value
96
            mask = None
97
            oxm_hasmask = False
98
        value_bytes = HWAddress(value).pack()
99
        if mask:
100
            value_bytes += HWAddress(mask).pack()
101
        return OxmTLV(oxm_field=self.oxm_field,
102
                      oxm_hasmask=oxm_hasmask,
103
                      oxm_value=value_bytes)
104
105
    @classmethod
106
    def from_of_tlv(cls, tlv):
107
        """Return an instance from a pyof OXM TLV."""
108
        hw_address = HWAddress()
109
        hw_address.unpack(tlv.oxm_value)
110
        addr_str = str(hw_address)
111
        value = addr_str
112
        if tlv.oxm_hasmask:
113
            hw_mask = HWAddress()
114
            hw_mask.unpack(tlv.oxm_value[6:])
115
            mask_str = str(hw_mask)
116
            value = f'{addr_str}/{mask_str}'
117
        return cls(value)
118
119
120
class MatchDLDst(MatchField):