| @@ 187-225 (lines=39) @@ | ||
| 184 | return cls(value) |
|
| 185 | ||
| 186 | ||
| 187 | class MatchDLDst(MatchField): |
|
| 188 | """Match for datalink destination.""" |
|
| 189 | ||
| 190 | name = 'dl_dst' |
|
| 191 | oxm_field = OxmOfbMatchField.OFPXMT_OFB_ETH_DST |
|
| 192 | ||
| 193 | def as_of_tlv(self): |
|
| 194 | """Return a pyof OXM TLV instance.""" |
|
| 195 | if '/' in self.value: |
|
| 196 | value, mask = self.value.split('/') |
|
| 197 | if mask.upper() == 'FF:FF:FF:FF:FF:FF': |
|
| 198 | mask = None |
|
| 199 | oxm_hasmask = False |
|
| 200 | else: |
|
| 201 | mask = mask.upper() |
|
| 202 | oxm_hasmask = True |
|
| 203 | else: |
|
| 204 | value = self.value |
|
| 205 | mask = None |
|
| 206 | oxm_hasmask = False |
|
| 207 | value_bytes = HWAddress(value).pack() |
|
| 208 | if mask: |
|
| 209 | value_bytes += HWAddress(mask).pack() |
|
| 210 | return OxmTLV(oxm_field=self.oxm_field, |
|
| 211 | oxm_hasmask=oxm_hasmask, |
|
| 212 | oxm_value=value_bytes) |
|
| 213 | ||
| 214 | @classmethod |
|
| 215 | def from_of_tlv(cls, tlv): |
|
| 216 | """Return an instance from a pyof OXM TLV.""" |
|
| 217 | hw_address = HWAddress() |
|
| 218 | hw_address.unpack(tlv.oxm_value) |
|
| 219 | addr_str = str(hw_address) |
|
| 220 | value = addr_str |
|
| 221 | if tlv.oxm_hasmask: |
|
| 222 | hw_mask = HWAddress() |
|
| 223 | hw_mask.unpack(tlv.oxm_value[6:]) |
|
| 224 | mask_str = str(hw_mask) |
|
| 225 | value = f'{addr_str}/{mask_str}' |
|
| 226 | return cls(value) |
|
| 227 | ||
| 228 | ||
| @@ 145-183 (lines=39) @@ | ||
| 142 | return cls(priority) |
|
| 143 | ||
| 144 | ||
| 145 | class MatchDLSrc(MatchField): |
|
| 146 | """Match for datalink source.""" |
|
| 147 | ||
| 148 | name = 'dl_src' |
|
| 149 | oxm_field = OxmOfbMatchField.OFPXMT_OFB_ETH_SRC |
|
| 150 | ||
| 151 | def as_of_tlv(self): |
|
| 152 | """Return a pyof OXM TLV instance.""" |
|
| 153 | if '/' in self.value: |
|
| 154 | value, mask = self.value.split('/') |
|
| 155 | if mask.upper() == 'FF:FF:FF:FF:FF:FF': |
|
| 156 | mask = None |
|
| 157 | oxm_hasmask = False |
|
| 158 | else: |
|
| 159 | mask = mask.upper() |
|
| 160 | oxm_hasmask = True |
|
| 161 | else: |
|
| 162 | value = self.value |
|
| 163 | mask = None |
|
| 164 | oxm_hasmask = False |
|
| 165 | value_bytes = HWAddress(value).pack() |
|
| 166 | if mask: |
|
| 167 | value_bytes += HWAddress(mask).pack() |
|
| 168 | return OxmTLV(oxm_field=self.oxm_field, |
|
| 169 | oxm_hasmask=oxm_hasmask, |
|
| 170 | oxm_value=value_bytes) |
|
| 171 | ||
| 172 | @classmethod |
|
| 173 | def from_of_tlv(cls, tlv): |
|
| 174 | """Return an instance from a pyof OXM TLV.""" |
|
| 175 | hw_address = HWAddress() |
|
| 176 | hw_address.unpack(tlv.oxm_value) |
|
| 177 | addr_str = str(hw_address) |
|
| 178 | value = addr_str |
|
| 179 | if tlv.oxm_hasmask: |
|
| 180 | hw_mask = HWAddress() |
|
| 181 | hw_mask.unpack(tlv.oxm_value[6:]) |
|
| 182 | mask_str = str(hw_mask) |
|
| 183 | value = f'{addr_str}/{mask_str}' |
|
| 184 | return cls(value) |
|
| 185 | ||
| 186 | ||