| @@ 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): |
|