Code Duplication    Length = 40-40 lines in 4 locations

v0x04/match_fields.py 4 locations

@@ 487-526 (lines=40) @@
484
        return cls(value)
485
486
487
class MatchARPTHA(MatchField):
488
    """Match for ARP Target MAC Address."""
489
490
    name = 'arp_tha'
491
    oxm_field = OxmOfbMatchField.OFPXMT_OFB_ARP_THA
492
493
    def as_of_tlv(self):
494
        """Return a pyof OXM TLV instance."""
495
        if '/' in self.value:
496
            value, mask = self.value.split('/')
497
            if mask.upper() == 'FF:FF:FF:FF:FF:FF':
498
                mask = None
499
                oxm_hasmask = False
500
            else:
501
                mask = mask.upper()
502
                oxm_hasmask = True
503
        else:
504
            value = self.value
505
            mask = None
506
            oxm_hasmask = False
507
        value_bytes = HWAddress(value).pack()
508
        if mask:
509
            value_bytes += HWAddress(mask).pack()
510
        return OxmTLV(oxm_field=self.oxm_field,
511
                      oxm_hasmask=oxm_hasmask,
512
                      oxm_value=value_bytes)
513
514
    @classmethod
515
    def from_of_tlv(cls, tlv):
516
        """Return an instance from a pyof OXM TLV."""
517
        hw_address = HWAddress()
518
        hw_address.unpack(tlv.oxm_value)
519
        addr_str = str(hw_address)
520
        value = addr_str
521
        if tlv.oxm_hasmask:
522
            hw_mask = HWAddress()
523
            hw_mask.unpack(tlv.oxm_value[6:])
524
            mask_str = str(hw_mask)
525
            value = f'{addr_str}/{mask_str}'
526
        return cls(value)
527
528
529
class MatchIPV6Src(MatchField):
@@ 445-484 (lines=40) @@
442
        return cls(value)
443
444
445
class MatchARPSHA(MatchField):
446
    """Match for ARP Sender MAC Address."""
447
448
    name = 'arp_sha'
449
    oxm_field = OxmOfbMatchField.OFPXMT_OFB_ARP_SHA
450
451
    def as_of_tlv(self):
452
        """Return a pyof OXM TLV instance."""
453
        if '/' in self.value:
454
            value, mask = self.value.split('/')
455
            if mask.upper() == 'FF:FF:FF:FF:FF:FF':
456
                mask = None
457
                oxm_hasmask = False
458
            else:
459
                mask = mask.upper()
460
                oxm_hasmask = True
461
        else:
462
            value = self.value
463
            mask = None
464
            oxm_hasmask = False
465
        value_bytes = HWAddress(value).pack()
466
        if mask:
467
            value_bytes += HWAddress(mask).pack()
468
        return OxmTLV(oxm_field=self.oxm_field,
469
                      oxm_hasmask=oxm_hasmask,
470
                      oxm_value=value_bytes)
471
472
    @classmethod
473
    def from_of_tlv(cls, tlv):
474
        """Return an instance from a pyof OXM TLV."""
475
        hw_address = HWAddress()
476
        hw_address.unpack(tlv.oxm_value)
477
        addr_str = str(hw_address)
478
        value = addr_str
479
        if tlv.oxm_hasmask:
480
            hw_mask = HWAddress()
481
            hw_mask.unpack(tlv.oxm_value[6:])
482
            mask_str = str(hw_mask)
483
            value = f'{addr_str}/{mask_str}'
484
        return cls(value)
485
486
487
class MatchARPTHA(MatchField):
@@ 165-204 (lines=40) @@
162
        return cls(value)
163
164
165
class MatchDLDst(MatchField):
166
    """Match for datalink destination."""
167
168
    name = 'dl_dst'
169
    oxm_field = OxmOfbMatchField.OFPXMT_OFB_ETH_DST
170
171
    def as_of_tlv(self):
172
        """Return a pyof OXM TLV instance."""
173
        if '/' in self.value:
174
            value, mask = self.value.split('/')
175
            if mask.upper() == 'FF:FF:FF:FF:FF:FF':
176
                mask = None
177
                oxm_hasmask = False
178
            else:
179
                mask = mask.upper()
180
                oxm_hasmask = True
181
        else:
182
            value = self.value
183
            mask = None
184
            oxm_hasmask = False
185
        value_bytes = HWAddress(value).pack()
186
        if mask:
187
            value_bytes += HWAddress(mask).pack()
188
        return OxmTLV(oxm_field=self.oxm_field,
189
                      oxm_hasmask=oxm_hasmask,
190
                      oxm_value=value_bytes)
191
192
    @classmethod
193
    def from_of_tlv(cls, tlv):
194
        """Return an instance from a pyof OXM TLV."""
195
        hw_address = HWAddress()
196
        hw_address.unpack(tlv.oxm_value)
197
        addr_str = str(hw_address)
198
        value = addr_str
199
        if tlv.oxm_hasmask:
200
            hw_mask = HWAddress()
201
            hw_mask.unpack(tlv.oxm_value[6:])
202
            mask_str = str(hw_mask)
203
            value = f'{addr_str}/{mask_str}'
204
        return cls(value)
205
206
207
class MatchDLType(MatchField):
@@ 123-162 (lines=40) @@
120
        return cls(priority)
121
122
123
class MatchDLSrc(MatchField):
124
    """Match for datalink source."""
125
126
    name = 'dl_src'
127
    oxm_field = OxmOfbMatchField.OFPXMT_OFB_ETH_SRC
128
129
    def as_of_tlv(self):
130
        """Return a pyof OXM TLV instance."""
131
        if '/' in self.value:
132
            value, mask = self.value.split('/')
133
            if mask.upper() == 'FF:FF:FF:FF:FF:FF':
134
                mask = None
135
                oxm_hasmask = False
136
            else:
137
                mask = mask.upper()
138
                oxm_hasmask = True
139
        else:
140
            value = self.value
141
            mask = None
142
            oxm_hasmask = False
143
        value_bytes = HWAddress(value).pack()
144
        if mask:
145
            value_bytes += HWAddress(mask).pack()
146
        return OxmTLV(oxm_field=self.oxm_field,
147
                      oxm_hasmask=oxm_hasmask,
148
                      oxm_value=value_bytes)
149
150
    @classmethod
151
    def from_of_tlv(cls, tlv):
152
        """Return an instance from a pyof OXM TLV."""
153
        hw_address = HWAddress()
154
        hw_address.unpack(tlv.oxm_value)
155
        addr_str = str(hw_address)
156
        value = addr_str
157
        if tlv.oxm_hasmask:
158
            hw_mask = HWAddress()
159
            hw_mask.unpack(tlv.oxm_value[6:])
160
            mask_str = str(hw_mask)
161
            value = f'{addr_str}/{mask_str}'
162
        return cls(value)
163
164
165
class MatchDLDst(MatchField):