| @@ 164-202 (lines=39) @@ | ||
| 161 | return cls(value) |
|
| 162 | ||
| 163 | ||
| 164 | class MatchDLDst(MatchField): |
|
| 165 | """Match for datalink destination.""" |
|
| 166 | ||
| 167 | name = 'dl_dst' |
|
| 168 | oxm_field = OxmOfbMatchField.OFPXMT_OFB_ETH_DST |
|
| 169 | ||
| 170 | def as_of_tlv(self): |
|
| 171 | """Return a pyof OXM TLV instance.""" |
|
| 172 | if '/' in self.value: |
|
| 173 | value, mask = self.value.split('/') |
|
| 174 | if mask.upper() == 'FF:FF:FF:FF:FF:FF': |
|
| 175 | mask = None |
|
| 176 | oxm_hasmask = False |
|
| 177 | else: |
|
| 178 | mask = mask.upper() |
|
| 179 | oxm_hasmask = True |
|
| 180 | else: |
|
| 181 | value = self.value |
|
| 182 | mask = None |
|
| 183 | oxm_hasmask = False |
|
| 184 | value_bytes = HWAddress(value).pack() |
|
| 185 | if mask: |
|
| 186 | value_bytes += HWAddress(mask).pack() |
|
| 187 | return OxmTLV(oxm_field=self.oxm_field, |
|
| 188 | oxm_hasmask=oxm_hasmask, |
|
| 189 | oxm_value=value_bytes) |
|
| 190 | ||
| 191 | @classmethod |
|
| 192 | def from_of_tlv(cls, tlv): |
|
| 193 | """Return an instance from a pyof OXM TLV.""" |
|
| 194 | hw_address = HWAddress() |
|
| 195 | hw_address.unpack(tlv.oxm_value) |
|
| 196 | addr_str = str(hw_address) |
|
| 197 | value = addr_str |
|
| 198 | if tlv.oxm_hasmask: |
|
| 199 | hw_mask = HWAddress() |
|
| 200 | hw_mask.unpack(tlv.oxm_value[6:]) |
|
| 201 | mask_str = str(hw_mask) |
|
| 202 | value = f'{addr_str}/{mask_str}' |
|
| 203 | return cls(value) |
|
| 204 | ||
| 205 | ||
| @@ 122-160 (lines=39) @@ | ||
| 119 | return cls(priority) |
|
| 120 | ||
| 121 | ||
| 122 | class MatchDLSrc(MatchField): |
|
| 123 | """Match for datalink source.""" |
|
| 124 | ||
| 125 | name = 'dl_src' |
|
| 126 | oxm_field = OxmOfbMatchField.OFPXMT_OFB_ETH_SRC |
|
| 127 | ||
| 128 | def as_of_tlv(self): |
|
| 129 | """Return a pyof OXM TLV instance.""" |
|
| 130 | if '/' in self.value: |
|
| 131 | value, mask = self.value.split('/') |
|
| 132 | if mask.upper() == 'FF:FF:FF:FF:FF:FF': |
|
| 133 | mask = None |
|
| 134 | oxm_hasmask = False |
|
| 135 | else: |
|
| 136 | mask = mask.upper() |
|
| 137 | oxm_hasmask = True |
|
| 138 | else: |
|
| 139 | value = self.value |
|
| 140 | mask = None |
|
| 141 | oxm_hasmask = False |
|
| 142 | value_bytes = HWAddress(value).pack() |
|
| 143 | if mask: |
|
| 144 | value_bytes += HWAddress(mask).pack() |
|
| 145 | return OxmTLV(oxm_field=self.oxm_field, |
|
| 146 | oxm_hasmask=oxm_hasmask, |
|
| 147 | oxm_value=value_bytes) |
|
| 148 | ||
| 149 | @classmethod |
|
| 150 | def from_of_tlv(cls, tlv): |
|
| 151 | """Return an instance from a pyof OXM TLV.""" |
|
| 152 | hw_address = HWAddress() |
|
| 153 | hw_address.unpack(tlv.oxm_value) |
|
| 154 | addr_str = str(hw_address) |
|
| 155 | value = addr_str |
|
| 156 | if tlv.oxm_hasmask: |
|
| 157 | hw_mask = HWAddress() |
|
| 158 | hw_mask.unpack(tlv.oxm_value[6:]) |
|
| 159 | mask_str = str(hw_mask) |
|
| 160 | value = f'{addr_str}/{mask_str}' |
|
| 161 | return cls(value) |
|
| 162 | ||
| 163 | ||