| @@ 165-203 (lines=39) @@ | ||
| 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 | ||
| @@ 123-161 (lines=39) @@ | ||
| 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 | ||