github.com/contiv/libOpenflow@v0.0.0-20210609050114-d967b14cc688/openflow13/match.go (about) 1 package openflow13 2 3 import ( 4 "encoding/binary" 5 "errors" 6 "fmt" 7 "log" 8 "net" 9 10 "github.com/contiv/libOpenflow/util" 11 ) 12 13 // ofp_match 1.3 14 type Match struct { 15 Type uint16 16 Length uint16 17 Fields []MatchField 18 } 19 20 // One match field TLV 21 type MatchField struct { 22 Class uint16 23 Field uint8 24 HasMask bool 25 Length uint8 26 ExperimenterID uint32 27 Value util.Message 28 Mask util.Message 29 } 30 31 func NewMatch() *Match { 32 m := new(Match) 33 34 m.Type = MatchType_OXM 35 m.Length = 4 36 m.Fields = make([]MatchField, 0) 37 38 return m 39 } 40 41 func (m *Match) Len() (n uint16) { 42 n = 4 43 for _, a := range m.Fields { 44 n += a.Len() 45 } 46 47 // Round it to closest multiple of 8 48 n = ((n + 7) / 8) * 8 49 50 return 51 } 52 53 func (m *Match) MarshalBinary() (data []byte, err error) { 54 data = make([]byte, int(m.Len())) 55 56 n := 0 57 binary.BigEndian.PutUint16(data[n:], m.Type) 58 n += 2 59 binary.BigEndian.PutUint16(data[n:], m.Length) 60 n += 2 61 62 for _, a := range m.Fields { 63 b, err := a.MarshalBinary() 64 if err != nil { 65 return nil, err 66 } 67 copy(data[n:], b) 68 n += len(b) 69 } 70 71 /* See if we need to pad it to make it align to 64bit boundary 72 if ((n % 8) != 0) { 73 toPad := 8 - (n % 8) 74 b := make([]byte, toPad) 75 data = append(data, b...) 76 } 77 */ 78 79 return 80 } 81 82 func (m *Match) UnmarshalBinary(data []byte) error { 83 84 n := 0 85 m.Type = binary.BigEndian.Uint16(data[n:]) 86 n += 2 87 m.Length = binary.BigEndian.Uint16(data[n:]) 88 n += 2 89 90 for n < int(m.Length) { 91 field := new(MatchField) 92 if err := field.UnmarshalBinary(data[n:]); err != nil { 93 return err 94 } 95 m.Fields = append(m.Fields, *field) 96 n += int(field.Len()) 97 } 98 return nil 99 } 100 101 func (m *Match) AddField(f MatchField) { 102 m.Fields = append(m.Fields, f) 103 m.Length += f.Len() 104 } 105 106 func (m *MatchField) Len() (n uint16) { 107 n = 4 108 if m.ExperimenterID != 0 { 109 n += 4 110 } 111 n += m.Value.Len() 112 if m.HasMask { 113 n += m.Mask.Len() 114 } 115 116 return 117 } 118 119 func (m *MatchField) MarshalBinary() (data []byte, err error) { 120 data = make([]byte, int(m.Len())) 121 122 n := 0 123 binary.BigEndian.PutUint16(data[n:], m.Class) 124 n += 2 125 126 var fld uint8 127 if m.HasMask { 128 fld = (m.Field << 1) | 0x1 129 } else { 130 fld = (m.Field << 1) | 0x0 131 } 132 data[n] = fld 133 n += 1 134 135 data[n] = m.Length 136 n += 1 137 138 b, err := m.Value.MarshalBinary() 139 copy(data[n:], b) 140 n += len(b) 141 142 if m.HasMask { 143 b, err = m.Mask.MarshalBinary() 144 copy(data[n:], b) 145 n += len(b) 146 } 147 return 148 } 149 150 func (m *MatchField) UnmarshalBinary(data []byte) error { 151 var n uint16 152 var err error 153 m.Class = binary.BigEndian.Uint16(data[n:]) 154 n += 2 155 156 fld := data[n] 157 n += 1 158 if (fld & 0x1) == 1 { 159 m.HasMask = true 160 } else { 161 m.HasMask = false 162 } 163 m.Field = fld >> 1 164 165 m.Length = data[n] 166 n += 1 167 168 if m.Class == OXM_CLASS_EXPERIMENTER { 169 experimenterID := binary.BigEndian.Uint32(data[n:]) 170 if experimenterID == ONF_EXPERIMENTER_ID { 171 n += 4 172 m.ExperimenterID = experimenterID 173 } else { 174 return fmt.Errorf("Unsupported experimenter id: %d in class: %d ", experimenterID, m.Class) 175 } 176 } 177 178 if m.Value, err = DecodeMatchField(m.Class, m.Field, m.Length, m.HasMask, data[n:]); err != nil { 179 return err 180 } 181 n += m.Value.Len() 182 183 if m.HasMask { 184 if m.Mask, err = DecodeMatchField(m.Class, m.Field, m.Length, m.HasMask, data[n:]); err != nil { 185 return err 186 } 187 n += m.Mask.Len() 188 } 189 return err 190 } 191 192 func (m *MatchField) MarshalHeader() uint32 { 193 var maskData uint32 194 if m.HasMask { 195 maskData = 1 << 8 196 } else { 197 maskData = 0 << 8 198 } 199 return uint32(m.Class)<<16 | uint32(m.Field)<<9 | maskData | uint32(m.Length) 200 } 201 202 func (m *MatchField) UnmarshalHeader(data []byte) error { 203 var err error 204 if len(data) < int(4) { 205 err = fmt.Errorf("the []byte is too short to unmarshal MatchField header") 206 return err 207 } 208 n := 0 209 m.Class = binary.BigEndian.Uint16(data[n:]) 210 n += 2 211 fieldWithMask := data[n] 212 m.HasMask = fieldWithMask&1 == 1 213 m.Field = fieldWithMask >> 1 214 n += 1 215 m.Length = data[n] & 0xff 216 return err 217 } 218 219 func DecodeMatchField(class uint16, field uint8, length uint8, hasMask bool, data []byte) (util.Message, error) { 220 if class == OXM_CLASS_OPENFLOW_BASIC { 221 var val util.Message 222 val = nil 223 switch field { 224 case OXM_FIELD_IN_PORT: 225 val = new(InPortField) 226 case OXM_FIELD_IN_PHY_PORT: 227 case OXM_FIELD_METADATA: 228 val = new(MetadataField) 229 case OXM_FIELD_ETH_DST: 230 val = new(EthDstField) 231 case OXM_FIELD_ETH_SRC: 232 val = new(EthSrcField) 233 case OXM_FIELD_ETH_TYPE: 234 val = new(EthTypeField) 235 case OXM_FIELD_VLAN_VID: 236 val = new(VlanIdField) 237 case OXM_FIELD_VLAN_PCP: 238 case OXM_FIELD_IP_DSCP: 239 val = new(IpDscpField) 240 case OXM_FIELD_IP_ECN: 241 case OXM_FIELD_IP_PROTO: 242 val = new(IpProtoField) 243 case OXM_FIELD_IPV4_SRC: 244 val = new(Ipv4SrcField) 245 case OXM_FIELD_IPV4_DST: 246 val = new(Ipv4DstField) 247 case OXM_FIELD_TCP_SRC: 248 val = new(PortField) 249 case OXM_FIELD_TCP_DST: 250 val = new(PortField) 251 case OXM_FIELD_UDP_SRC: 252 val = new(PortField) 253 case OXM_FIELD_UDP_DST: 254 val = new(PortField) 255 case OXM_FIELD_SCTP_SRC: 256 val = new(PortField) 257 case OXM_FIELD_SCTP_DST: 258 val = new(PortField) 259 case OXM_FIELD_ICMPV4_TYPE: 260 val = new(IcmpTypeField) 261 case OXM_FIELD_ICMPV4_CODE: 262 val = new(IcmpCodeField) 263 case OXM_FIELD_ARP_OP: 264 val = new(ArpOperField) 265 case OXM_FIELD_ARP_SPA: 266 val = new(ArpXPaField) 267 case OXM_FIELD_ARP_TPA: 268 val = new(ArpXPaField) 269 case OXM_FIELD_ARP_SHA: 270 val = new(ArpXHaField) 271 case OXM_FIELD_ARP_THA: 272 val = new(ArpXHaField) 273 case OXM_FIELD_IPV6_SRC: 274 val = new(Ipv6SrcField) 275 case OXM_FIELD_IPV6_DST: 276 val = new(Ipv6DstField) 277 case OXM_FIELD_IPV6_FLABEL: 278 case OXM_FIELD_ICMPV6_TYPE: 279 val = new(IcmpTypeField) 280 case OXM_FIELD_ICMPV6_CODE: 281 val = new(IcmpCodeField) 282 case OXM_FIELD_IPV6_ND_TARGET: 283 val = new(Ipv6DstField) 284 case OXM_FIELD_IPV6_ND_SLL: 285 val = new(EthSrcField) 286 case OXM_FIELD_IPV6_ND_TLL: 287 val = new(EthDstField) 288 case OXM_FIELD_MPLS_LABEL: 289 val = new(MplsLabelField) 290 case OXM_FIELD_MPLS_TC: 291 case OXM_FIELD_MPLS_BOS: 292 val = new(MplsBosField) 293 case OXM_FIELD_PBB_ISID: 294 case OXM_FIELD_TUNNEL_ID: 295 val = new(TunnelIdField) 296 case OXM_FIELD_IPV6_EXTHDR: 297 case OXM_FIELD_TCP_FLAGS: 298 val = new(TcpFlagsField) 299 default: 300 log.Printf("Unhandled Field: %d in Class: %d", field, class) 301 } 302 303 if val == nil { 304 log.Printf("Bad pkt class: %v field: %v data: %v", class, field, data) 305 return nil, fmt.Errorf("Bad pkt class: %v field: %v data: %v", class, field, data) 306 } 307 308 err := val.UnmarshalBinary(data) 309 if err != nil { 310 return nil, err 311 } 312 return val, nil 313 } else if class == OXM_CLASS_NXM_1 { 314 var val util.Message 315 switch field { 316 case NXM_NX_REG0: 317 val = new(Uint32Message) 318 case NXM_NX_REG1: 319 val = new(Uint32Message) 320 case NXM_NX_REG2: 321 val = new(Uint32Message) 322 case NXM_NX_REG3: 323 val = new(Uint32Message) 324 case NXM_NX_REG4: 325 val = new(Uint32Message) 326 case NXM_NX_REG5: 327 val = new(Uint32Message) 328 case NXM_NX_REG6: 329 val = new(Uint32Message) 330 case NXM_NX_REG7: 331 val = new(Uint32Message) 332 case NXM_NX_REG8: 333 val = new(Uint32Message) 334 case NXM_NX_REG9: 335 val = new(Uint32Message) 336 case NXM_NX_REG10: 337 val = new(Uint32Message) 338 case NXM_NX_REG11: 339 val = new(Uint32Message) 340 case NXM_NX_REG12: 341 val = new(Uint32Message) 342 case NXM_NX_REG13: 343 val = new(Uint32Message) 344 case NXM_NX_REG14: 345 val = new(Uint32Message) 346 case NXM_NX_REG15: 347 val = new(Uint32Message) 348 case NXM_NX_TUN_ID: 349 case NXM_NX_ARP_SHA: 350 val = new(ArpXHaField) 351 case NXM_NX_ARP_THA: 352 val = new(ArpXHaField) 353 case NXM_NX_IPV6_SRC: 354 val = new(Ipv6SrcField) 355 case NXM_NX_IPV6_DST: 356 val = new(Ipv6DstField) 357 case NXM_NX_ICMPV6_TYPE: 358 val = new(IcmpTypeField) 359 case NXM_NX_ICMPV6_CODE: 360 val = new(IcmpCodeField) 361 case NXM_NX_ND_TARGET: 362 val = new(Ipv6DstField) 363 case NXM_NX_ND_SLL: 364 val = new(EthDstField) 365 case NXM_NX_ND_TLL: 366 val = new(EthSrcField) 367 case NXM_NX_IP_FRAG: 368 case NXM_NX_IPV6_LABEL: 369 case NXM_NX_IP_ECN: 370 case NXM_NX_IP_TTL: 371 case NXM_NX_MPLS_TTL: 372 case NXM_NX_TUN_IPV4_SRC: 373 val = new(TunnelIpv4SrcField) 374 case NXM_NX_TUN_IPV4_DST: 375 val = new(TunnelIpv4DstField) 376 case NXM_NX_PKT_MARK: 377 val = new(Uint32Message) 378 case NXM_NX_TCP_FLAGS: 379 case NXM_NX_DP_HASH: 380 case NXM_NX_RECIRC_ID: 381 case NXM_NX_CONJ_ID: 382 val = new(Uint32Message) 383 case NXM_NX_TUN_GBP_ID: 384 case NXM_NX_TUN_GBP_FLAGS: 385 case NXM_NX_TUN_METADATA0: 386 fallthrough 387 case NXM_NX_TUN_METADATA1: 388 fallthrough 389 case NXM_NX_TUN_METADATA2: 390 fallthrough 391 case NXM_NX_TUN_METADATA3: 392 fallthrough 393 case NXM_NX_TUN_METADATA4: 394 fallthrough 395 case NXM_NX_TUN_METADATA5: 396 fallthrough 397 case NXM_NX_TUN_METADATA6: 398 fallthrough 399 case NXM_NX_TUN_METADATA7: 400 msg := new(ByteArrayField) 401 if !hasMask { 402 msg.Length = length 403 } else { 404 msg.Length = length / 2 405 } 406 val = msg 407 case NXM_NX_TUN_FLAGS: 408 case NXM_NX_CT_STATE: 409 val = new(Uint32Message) 410 case NXM_NX_CT_ZONE: 411 val = new(Uint16Message) 412 case NXM_NX_CT_MARK: 413 val = new(Uint32Message) 414 case NXM_NX_CT_LABEL: 415 val = new(CTLabel) 416 case NXM_NX_TUN_IPV6_SRC: 417 val = new(Ipv6SrcField) 418 case NXM_NX_TUN_IPV6_DST: 419 val = new(Ipv6DstField) 420 case NXM_NX_CT_NW_PROTO: 421 val = new(IpProtoField) 422 case NXM_NX_CT_NW_SRC: 423 val = new(Ipv4SrcField) 424 case NXM_NX_CT_NW_DST: 425 val = new(Ipv4DstField) 426 case NXM_NX_CT_IPV6_SRC: 427 val = new(Ipv6SrcField) 428 case NXM_NX_CT_IPV6_DST: 429 val = new(Ipv6DstField) 430 case NXM_NX_CT_TP_DST: 431 val = new(PortField) 432 case NXM_NX_CT_TP_SRC: 433 val = new(PortField) 434 case NXM_NX_XXREG0: 435 fallthrough 436 case NXM_NX_XXREG1: 437 fallthrough 438 case NXM_NX_XXREG2: 439 fallthrough 440 case NXM_NX_XXREG3: 441 msg := new(ByteArrayField) 442 if !hasMask { 443 msg.Length = length 444 } else { 445 msg.Length = length / 2 446 } 447 val = msg 448 default: 449 log.Printf("Unhandled Field: %d in Class: %d", field, class) 450 return nil, fmt.Errorf("Bad pkt class: %v field: %v data: %v", class, field, data) 451 } 452 453 err := val.UnmarshalBinary(data) 454 if err != nil { 455 return nil, err 456 } 457 return val, nil 458 } else if class == OXM_CLASS_EXPERIMENTER { 459 var val util.Message 460 switch field { 461 case OXM_FIELD_TCP_FLAGS: 462 val = new(TcpFlagsField) 463 case OXM_FIELD_ACTSET_OUTPUT: 464 val = new(ActsetOutputField) 465 } 466 err := val.UnmarshalBinary(data) 467 if err != nil { 468 return nil, err 469 } 470 return val, nil 471 } else { 472 log.Panicf("Unsupported match field: %d in class: %d", field, class) 473 } 474 475 return nil, nil 476 } 477 478 // ofp_match_type 1.3 479 const ( 480 MatchType_Standard = iota /* Deprecated. */ 481 MatchType_OXM 482 ) 483 484 // ofp_oxm_class 1.3 485 const ( 486 OXM_CLASS_NXM_0 = 0x0000 /* Backward compatibility with NXM */ 487 OXM_CLASS_NXM_1 = 0x0001 /* Backward compatibility with NXM */ 488 OXM_CLASS_OPENFLOW_BASIC = 0x8000 /* Basic class for OpenFlow */ 489 OXM_CLASS_EXPERIMENTER = 0xFFFF /* Experimenter class */ 490 491 ONF_EXPERIMENTER_ID = 0x4f4e4600 /* ONF Experimenter ID */ 492 ) 493 494 const ( 495 OXM_FIELD_IN_PORT = 0 /* Switch input port. */ 496 OXM_FIELD_IN_PHY_PORT = 1 /* Switch physical input port. */ 497 OXM_FIELD_METADATA = 2 /* Metadata passed between tables. */ 498 OXM_FIELD_ETH_DST = 3 /* Ethernet destination address. */ 499 OXM_FIELD_ETH_SRC = 4 /* Ethernet source address. */ 500 OXM_FIELD_ETH_TYPE = 5 /* Ethernet frame type. */ 501 OXM_FIELD_VLAN_VID = 6 /* VLAN id. */ 502 OXM_FIELD_VLAN_PCP = 7 /* VLAN priority. */ 503 OXM_FIELD_IP_DSCP = 8 /* IP DSCP (6 bits in ToS field). */ 504 OXM_FIELD_IP_ECN = 9 /* IP ECN (2 bits in ToS field). */ 505 OXM_FIELD_IP_PROTO = 10 /* IP protocol. */ 506 OXM_FIELD_IPV4_SRC = 11 /* IPv4 source address. */ 507 OXM_FIELD_IPV4_DST = 12 /* IPv4 destination address. */ 508 OXM_FIELD_TCP_SRC = 13 /* TCP source port. */ 509 OXM_FIELD_TCP_DST = 14 /* TCP destination port. */ 510 OXM_FIELD_UDP_SRC = 15 /* UDP source port. */ 511 OXM_FIELD_UDP_DST = 16 /* UDP destination port. */ 512 OXM_FIELD_SCTP_SRC = 17 /* SCTP source port. */ 513 OXM_FIELD_SCTP_DST = 18 /* SCTP destination port. */ 514 OXM_FIELD_ICMPV4_TYPE = 19 /* ICMP type. */ 515 OXM_FIELD_ICMPV4_CODE = 20 /* ICMP code. */ 516 OXM_FIELD_ARP_OP = 21 /* ARP opcode. */ 517 OXM_FIELD_ARP_SPA = 22 /* ARP source IPv4 address. */ 518 OXM_FIELD_ARP_TPA = 23 /* ARP target IPv4 address. */ 519 OXM_FIELD_ARP_SHA = 24 /* ARP source hardware address. */ 520 OXM_FIELD_ARP_THA = 25 /* ARP target hardware address. */ 521 OXM_FIELD_IPV6_SRC = 26 /* IPv6 source address. */ 522 OXM_FIELD_IPV6_DST = 27 /* IPv6 destination address. */ 523 OXM_FIELD_IPV6_FLABEL = 28 /* IPv6 Flow Label */ 524 OXM_FIELD_ICMPV6_TYPE = 29 /* ICMPv6 type. */ 525 OXM_FIELD_ICMPV6_CODE = 30 /* ICMPv6 code. */ 526 OXM_FIELD_IPV6_ND_TARGET = 31 /* Target address for ND. */ 527 OXM_FIELD_IPV6_ND_SLL = 32 /* Source link-layer for ND. */ 528 OXM_FIELD_IPV6_ND_TLL = 33 /* Target link-layer for ND. */ 529 OXM_FIELD_MPLS_LABEL = 34 /* MPLS label. */ 530 OXM_FIELD_MPLS_TC = 35 /* MPLS TC. */ 531 OXM_FIELD_MPLS_BOS = 36 /* MPLS BoS bit. */ 532 OXM_FIELD_PBB_ISID = 37 /* PBB I-SID. */ 533 OXM_FIELD_TUNNEL_ID = 38 /* Logical Port Metadata. */ 534 OXM_FIELD_IPV6_EXTHDR = 39 /* IPv6 Extension Header pseudo-field */ 535 OXM_FIELD_PBB_UCA = 41 /* PBB UCA header field (from OpenFlow 1.4) */ 536 OXM_FIELD_TCP_FLAGS = 42 /* TCP flags (from OpenFlow 1.5) */ 537 OXM_FIELD_ACTSET_OUTPUT = 43 /* actset output port number (from OpenFlow 1.5) */ 538 ) 539 540 const ( 541 NXM_NX_REG0 = 0 /* nicira extension: reg0 */ 542 NXM_NX_REG1 = 1 /* nicira extension: reg1 */ 543 NXM_NX_REG2 = 2 /* nicira extension: reg2 */ 544 NXM_NX_REG3 = 3 /* nicira extension: reg3 */ 545 NXM_NX_REG4 = 4 /* nicira extension: reg4 */ 546 NXM_NX_REG5 = 5 /* nicira extension: reg5 */ 547 NXM_NX_REG6 = 6 /* nicira extension: reg6 */ 548 NXM_NX_REG7 = 7 /* nicira extension: reg7 */ 549 NXM_NX_REG8 = 8 /* nicira extension: reg8 */ 550 NXM_NX_REG9 = 9 /* nicira extension: reg9 */ 551 NXM_NX_REG10 = 10 /* nicira extension: reg10 */ 552 NXM_NX_REG11 = 11 /* nicira extension: reg11 */ 553 NXM_NX_REG12 = 12 /* nicira extension: reg12 */ 554 NXM_NX_REG13 = 13 /* nicira extension: reg13 */ 555 NXM_NX_REG14 = 14 /* nicira extension: reg14 */ 556 NXM_NX_REG15 = 15 /* nicira extension: reg15 */ 557 NXM_NX_TUN_ID = 16 /* nicira extension: tun_id, VNI */ 558 NXM_NX_ARP_SHA = 17 /* nicira extension: arp_sha, ARP Source Ethernet Address */ 559 NXM_NX_ARP_THA = 18 /* nicira extension: arp_tha, ARP Target Ethernet Address */ 560 NXM_NX_IPV6_SRC = 19 /* nicira extension: tun_ipv6_src, IPv6 source address */ 561 NXM_NX_IPV6_DST = 20 /* nicira extension: tun_ipv6_src, IPv6 destination address */ 562 NXM_NX_ICMPV6_TYPE = 21 /* nicira extension: icmpv6_type, ICMPv6 type */ 563 NXM_NX_ICMPV6_CODE = 22 /* nicira extension: icmpv6_code, ICMPv6 code */ 564 NXM_NX_ND_TARGET = 23 /* nicira extension: nd_target, ICMPv6 neighbor discovery source ethernet address*/ 565 NXM_NX_ND_SLL = 24 /* nicira extension: nd_sll, ICMPv6 neighbor discovery source ethernet address*/ 566 NXM_NX_ND_TLL = 25 /* nicira extension: nd_tll, ICMPv6 neighbor discovery target ethernet address */ 567 NXM_NX_IP_FRAG = 26 /* nicira extension: ip_frag, IP fragments */ 568 NXM_NX_IPV6_LABEL = 27 /* nicira extension: ipv6_label, least 20 bits hold flow label from IPv6 header, others are zero*/ 569 NXM_NX_IP_ECN = 28 /* nicira extension: nw_ecn, TOS byte with DSCP bits cleared to 0 */ 570 NXM_NX_IP_TTL = 29 /* nicira extension: nw_ttl, time-to-live field */ 571 NXM_NX_MPLS_TTL = 30 /* nicira extension: mpls_ttl, time-to-live field from MPLS label */ 572 NXM_NX_TUN_IPV4_SRC = 31 /* nicira extension: tun_src, src IPv4 address of tunnel */ 573 NXM_NX_TUN_IPV4_DST = 32 /* nicira extension: tun_dst, dst IPv4 address of tunnel */ 574 NXM_NX_PKT_MARK = 33 /* nicira extension: pkg_mark, packet mark from Linux kernal */ 575 NXM_NX_TCP_FLAGS = 34 /* nicira extension: tcp_flags */ 576 NXM_NX_DP_HASH = 35 577 NXM_NX_RECIRC_ID = 36 /* nicira extension: recirc_id, used with ct */ 578 NXM_NX_CONJ_ID = 37 /* nicira extension: conj_id, conjunction ID for conjunctive match */ 579 NXM_NX_TUN_GBP_ID = 38 /* nicira extension: tun_gbp_id, GBP policy ID */ 580 NXM_NX_TUN_GBP_FLAGS = 39 /* nicira extension: tun_gbp_flags, GBP policy Flags*/ 581 NXM_NX_TUN_METADATA0 = 40 /* nicira extension: tun_metadata, for Geneve header variable data */ 582 NXM_NX_TUN_METADATA1 = 41 /* nicira extension: tun_metadata, for Geneve header variable data */ 583 NXM_NX_TUN_METADATA2 = 42 /* nicira extension: tun_metadata, for Geneve header variable data */ 584 NXM_NX_TUN_METADATA3 = 43 /* nicira extension: tun_metadata, for Geneve header variable data */ 585 NXM_NX_TUN_METADATA4 = 44 /* nicira extension: tun_metadata, for Geneve header variable data */ 586 NXM_NX_TUN_METADATA5 = 45 /* nicira extension: tun_metadata, for Geneve header variable data */ 587 NXM_NX_TUN_METADATA6 = 46 /* nicira extension: tun_metadata, for Geneve header variable data */ 588 NXM_NX_TUN_METADATA7 = 47 /* nicira extension: tun_metadata, for Geneve header variable data */ 589 NXM_NX_TUN_FLAGS = 104 /* nicira extension: tunnel Flags */ 590 NXM_NX_CT_STATE = 105 /* nicira extension: ct_state for conn_track */ 591 NXM_NX_CT_ZONE = 106 /* nicira extension: ct_zone for conn_track */ 592 NXM_NX_CT_MARK = 107 /* nicira extension: ct_mark for conn_track */ 593 NXM_NX_CT_LABEL = 108 /* nicira extension: ct_label for conn_track */ 594 NXM_NX_TUN_IPV6_SRC = 109 /* nicira extension: tun_dst_ipv6, dst IPv6 address of tunnel */ 595 NXM_NX_TUN_IPV6_DST = 110 /* nicira extension: tun_dst_ipv6, src IPv6 address of tunnel */ 596 NXM_NX_XXREG0 = 111 /* nicira extension: xxreg0 */ 597 NXM_NX_XXREG1 = 112 /* nicira extension: xxreg0 */ 598 NXM_NX_XXREG2 = 113 /* nicira extension: xxreg0 */ 599 NXM_NX_XXREG3 = 114 /* nicira extension: xxreg0 */ 600 NXM_NX_CT_NW_PROTO = 119 /* nicira extension: ct_nw_proto, the protocol byte in the IPv4 or IPv6 header forthe original direction tuple of the conntrack entry */ 601 NXM_NX_CT_NW_SRC = 120 /* nicira extension: ct_nw_src, source IPv4 address of the original direction tuple of the conntrack entry */ 602 NXM_NX_CT_NW_DST = 121 /* nicira extension: ct_nw_dst, destination IPv4 address of the original direction tuple of the conntrack entry */ 603 NXM_NX_CT_IPV6_SRC = 122 /* nicira extension: ct_ipv6_src, source IPv6 address of the original direction tuple of the conntrack entry */ 604 NXM_NX_CT_IPV6_DST = 123 /* nicira extension: ct_ipv6_dst, destination IPv6 address of the original direction tuple of the conntrack entry */ 605 NXM_NX_CT_TP_SRC = 124 /* nicira extension: ct_tp_src, transport layer source port of the original direction tuple of the conntrack entry */ 606 NXM_NX_CT_TP_DST = 125 /* nicira extension: ct_tp_dst, transport layer destination port of the original direction tuple of the conntrack entry */ 607 ) 608 609 // IN_PORT field 610 type InPortField struct { 611 InPort uint32 612 } 613 614 func (m *InPortField) Len() uint16 { 615 return 4 616 } 617 func (m *InPortField) MarshalBinary() (data []byte, err error) { 618 data = make([]byte, 4) 619 620 binary.BigEndian.PutUint32(data, m.InPort) 621 return 622 } 623 func (m *InPortField) UnmarshalBinary(data []byte) error { 624 m.InPort = binary.BigEndian.Uint32(data) 625 return nil 626 } 627 628 // Return a MatchField for Input port matching 629 func NewInPortField(inPort uint32) *MatchField { 630 f := new(MatchField) 631 f.Class = OXM_CLASS_OPENFLOW_BASIC 632 f.Field = OXM_FIELD_IN_PORT 633 f.HasMask = false 634 635 inPortField := new(InPortField) 636 inPortField.InPort = inPort 637 f.Value = inPortField 638 f.Length = uint8(inPortField.Len()) 639 640 return f 641 } 642 643 // ETH_DST field 644 type EthDstField struct { 645 EthDst net.HardwareAddr 646 } 647 648 func (m *EthDstField) Len() uint16 { 649 return 6 650 } 651 func (m *EthDstField) MarshalBinary() (data []byte, err error) { 652 data = make([]byte, 6) 653 copy(data, m.EthDst) 654 return 655 } 656 657 func (m *EthDstField) UnmarshalBinary(data []byte) error { 658 copy(m.EthDst, data) 659 return nil 660 } 661 662 // Return a MatchField for ethernet dest addr 663 func NewEthDstField(ethDst net.HardwareAddr, ethDstMask *net.HardwareAddr) *MatchField { 664 f := new(MatchField) 665 f.Class = OXM_CLASS_OPENFLOW_BASIC 666 f.Field = OXM_FIELD_ETH_DST 667 f.HasMask = false 668 669 ethDstField := new(EthDstField) 670 ethDstField.EthDst = ethDst 671 f.Value = ethDstField 672 f.Length = uint8(ethDstField.Len()) 673 674 // Add the mask 675 if ethDstMask != nil { 676 mask := new(EthDstField) 677 mask.EthDst = *ethDstMask 678 f.Mask = mask 679 f.HasMask = true 680 f.Length += uint8(mask.Len()) 681 } 682 683 return f 684 } 685 686 // ETH_SRC field 687 type EthSrcField struct { 688 EthSrc net.HardwareAddr 689 } 690 691 func (m *EthSrcField) Len() uint16 { 692 return 6 693 } 694 func (m *EthSrcField) MarshalBinary() (data []byte, err error) { 695 data = make([]byte, 6) 696 copy(data, m.EthSrc) 697 return 698 } 699 700 func (m *EthSrcField) UnmarshalBinary(data []byte) error { 701 copy(m.EthSrc, data) 702 return nil 703 } 704 705 // Return a MatchField for ethernet src addr 706 func NewEthSrcField(ethSrc net.HardwareAddr, ethSrcMask *net.HardwareAddr) *MatchField { 707 f := new(MatchField) 708 f.Class = OXM_CLASS_OPENFLOW_BASIC 709 f.Field = OXM_FIELD_ETH_SRC 710 f.HasMask = false 711 712 ethSrcField := new(EthSrcField) 713 ethSrcField.EthSrc = ethSrc 714 f.Value = ethSrcField 715 f.Length = uint8(ethSrcField.Len()) 716 717 // Add the mask 718 if ethSrcMask != nil { 719 mask := new(EthSrcField) 720 mask.EthSrc = *ethSrcMask 721 f.Mask = mask 722 f.HasMask = true 723 f.Length += uint8(mask.Len()) 724 } 725 726 return f 727 } 728 729 // ETH_TYPE field 730 type EthTypeField struct { 731 EthType uint16 732 } 733 734 func (m *EthTypeField) Len() uint16 { 735 return 2 736 } 737 func (m *EthTypeField) MarshalBinary() (data []byte, err error) { 738 data = make([]byte, 2) 739 740 binary.BigEndian.PutUint16(data, m.EthType) 741 return 742 } 743 func (m *EthTypeField) UnmarshalBinary(data []byte) error { 744 m.EthType = binary.BigEndian.Uint16(data) 745 return nil 746 } 747 748 // Return a MatchField for ethertype matching 749 func NewEthTypeField(ethType uint16) *MatchField { 750 f := new(MatchField) 751 f.Class = OXM_CLASS_OPENFLOW_BASIC 752 f.Field = OXM_FIELD_ETH_TYPE 753 f.HasMask = false 754 755 ethTypeField := new(EthTypeField) 756 ethTypeField.EthType = ethType 757 f.Value = ethTypeField 758 f.Length = uint8(ethTypeField.Len()) 759 760 return f 761 } 762 763 const OFPVID_PRESENT = 0x1000 /* Bit that indicate that a VLAN id is set */ 764 const OFPVID_NONE = 0x0000 /* No VLAN id was set. */ 765 766 // VLAN_ID field 767 type VlanIdField struct { 768 VlanId uint16 769 } 770 771 func (m *VlanIdField) Len() uint16 { 772 return 2 773 } 774 func (m *VlanIdField) MarshalBinary() (data []byte, err error) { 775 data = make([]byte, 2) 776 777 binary.BigEndian.PutUint16(data, m.VlanId) 778 return 779 } 780 func (m *VlanIdField) UnmarshalBinary(data []byte) error { 781 m.VlanId = binary.BigEndian.Uint16(data) 782 return nil 783 } 784 785 // Return a MatchField for vlan id matching 786 func NewVlanIdField(vlanId uint16, vlanMask *uint16) *MatchField { 787 f := new(MatchField) 788 f.Class = OXM_CLASS_OPENFLOW_BASIC 789 f.Field = OXM_FIELD_VLAN_VID 790 f.HasMask = false 791 792 vlanIdField := new(VlanIdField) 793 vlanIdField.VlanId = vlanId | OFPVID_PRESENT 794 f.Value = vlanIdField 795 f.Length = uint8(vlanIdField.Len()) 796 797 if vlanMask != nil { 798 mask := new(VlanIdField) 799 mask.VlanId = *vlanMask 800 f.Mask = mask 801 f.HasMask = true 802 f.Length += uint8(mask.Len()) 803 } 804 return f 805 } 806 807 // MplsLabel field 808 type MplsLabelField struct { 809 MplsLabel uint32 810 } 811 812 func (m *MplsLabelField) Len() uint16 { 813 return 4 814 } 815 816 func (m *MplsLabelField) MarshalBinary() (data []byte, err error) { 817 data = make([]byte, 4) 818 819 binary.BigEndian.PutUint32(data, m.MplsLabel) 820 return 821 } 822 func (m *MplsLabelField) UnmarshalBinary(data []byte) error { 823 m.MplsLabel = binary.BigEndian.Uint32(data) 824 return nil 825 } 826 827 // Return a MatchField for mpls Label matching 828 func NewMplsLabelField(mplsLabel uint32) *MatchField { 829 f := new(MatchField) 830 f.Class = OXM_CLASS_OPENFLOW_BASIC 831 f.Field = OXM_FIELD_MPLS_LABEL 832 f.HasMask = false 833 834 mplsLabelField := new(MplsLabelField) 835 mplsLabelField.MplsLabel = mplsLabel 836 f.Value = mplsLabelField 837 f.Length = uint8(mplsLabelField.Len()) 838 839 return f 840 } 841 842 // MplsBos field 843 type MplsBosField struct { 844 MplsBos uint8 845 } 846 847 func (m *MplsBosField) Len() uint16 { 848 return 1 849 } 850 851 func (m *MplsBosField) MarshalBinary() (data []byte, err error) { 852 data = make([]byte, 1) 853 data[0] = m.MplsBos 854 return 855 } 856 func (m *MplsBosField) UnmarshalBinary(data []byte) error { 857 m.MplsBos = data[0] 858 return nil 859 } 860 861 // Return a MatchField for mpls Bos matching 862 func NewMplsBosField(mplsBos uint8) *MatchField { 863 f := new(MatchField) 864 f.Class = OXM_CLASS_OPENFLOW_BASIC 865 f.Field = OXM_FIELD_MPLS_BOS 866 f.HasMask = false 867 868 mplsBosField := new(MplsBosField) 869 mplsBosField.MplsBos = mplsBos 870 f.Value = mplsBosField 871 f.Length = uint8(mplsBosField.Len()) 872 return f 873 } 874 875 // IPV4_SRC field 876 type Ipv4SrcField struct { 877 Ipv4Src net.IP 878 } 879 880 func (m *Ipv4SrcField) Len() uint16 { 881 return 4 882 } 883 func (m *Ipv4SrcField) MarshalBinary() (data []byte, err error) { 884 data = make([]byte, 4) 885 copy(data, m.Ipv4Src.To4()) 886 return 887 } 888 889 func (m *Ipv4SrcField) UnmarshalBinary(data []byte) error { 890 m.Ipv4Src = net.IPv4(data[0], data[1], data[2], data[3]) 891 return nil 892 } 893 894 // Return a MatchField for ipv4 src addr 895 func NewIpv4SrcField(ipSrc net.IP, ipSrcMask *net.IP) *MatchField { 896 f := new(MatchField) 897 f.Class = OXM_CLASS_OPENFLOW_BASIC 898 f.Field = OXM_FIELD_IPV4_SRC 899 f.HasMask = false 900 901 ipSrcField := new(Ipv4SrcField) 902 ipSrcField.Ipv4Src = ipSrc 903 f.Value = ipSrcField 904 f.Length = uint8(ipSrcField.Len()) 905 906 // Add the mask 907 if ipSrcMask != nil { 908 mask := new(Ipv4SrcField) 909 mask.Ipv4Src = *ipSrcMask 910 f.Mask = mask 911 f.HasMask = true 912 f.Length += uint8(mask.Len()) 913 } 914 915 return f 916 } 917 918 // IPV4_DST field 919 type Ipv4DstField struct { 920 Ipv4Dst net.IP 921 } 922 923 func (m *Ipv4DstField) Len() uint16 { 924 return 4 925 } 926 func (m *Ipv4DstField) MarshalBinary() (data []byte, err error) { 927 data = make([]byte, 4) 928 copy(data, m.Ipv4Dst.To4()) 929 return 930 } 931 932 func (m *Ipv4DstField) UnmarshalBinary(data []byte) error { 933 m.Ipv4Dst = net.IPv4(data[0], data[1], data[2], data[3]) 934 return nil 935 } 936 937 // Return a MatchField for ipv4 dest addr 938 func NewIpv4DstField(ipDst net.IP, ipDstMask *net.IP) *MatchField { 939 f := new(MatchField) 940 f.Class = OXM_CLASS_OPENFLOW_BASIC 941 f.Field = OXM_FIELD_IPV4_DST 942 f.HasMask = false 943 944 ipDstField := new(Ipv4DstField) 945 ipDstField.Ipv4Dst = ipDst 946 f.Value = ipDstField 947 f.Length = uint8(ipDstField.Len()) 948 949 // Add the mask 950 if ipDstMask != nil { 951 mask := new(Ipv4DstField) 952 mask.Ipv4Dst = *ipDstMask 953 f.Mask = mask 954 f.HasMask = true 955 f.Length += uint8(mask.Len()) 956 } 957 958 return f 959 } 960 961 // IPV6_SRC field 962 type Ipv6SrcField struct { 963 Ipv6Src net.IP 964 } 965 966 func (m *Ipv6SrcField) Len() uint16 { 967 return 16 968 } 969 func (m *Ipv6SrcField) MarshalBinary() (data []byte, err error) { 970 data = make([]byte, 16) 971 copy(data, m.Ipv6Src) 972 return 973 } 974 975 func (m *Ipv6SrcField) UnmarshalBinary(data []byte) error { 976 m.Ipv6Src = make([]byte, 16) 977 copy(m.Ipv6Src, data) 978 return nil 979 } 980 981 // Return a MatchField for ipv6 src addr 982 func NewIpv6SrcField(ipSrc net.IP, ipSrcMask *net.IP) *MatchField { 983 f := new(MatchField) 984 f.Class = OXM_CLASS_OPENFLOW_BASIC 985 f.Field = OXM_FIELD_IPV6_SRC 986 f.HasMask = false 987 988 ipSrcField := new(Ipv6SrcField) 989 ipSrcField.Ipv6Src = ipSrc 990 f.Value = ipSrcField 991 f.Length = uint8(ipSrcField.Len()) 992 993 // Add the mask 994 if ipSrcMask != nil { 995 mask := new(Ipv6SrcField) 996 mask.Ipv6Src = *ipSrcMask 997 f.Mask = mask 998 f.HasMask = true 999 f.Length += uint8(mask.Len()) 1000 } 1001 1002 return f 1003 } 1004 1005 // IPV6_DST field 1006 type Ipv6DstField struct { 1007 Ipv6Dst net.IP 1008 } 1009 1010 func (m *Ipv6DstField) Len() uint16 { 1011 return 16 1012 } 1013 func (m *Ipv6DstField) MarshalBinary() (data []byte, err error) { 1014 data = make([]byte, 16) 1015 copy(data, m.Ipv6Dst) 1016 return 1017 } 1018 1019 func (m *Ipv6DstField) UnmarshalBinary(data []byte) error { 1020 m.Ipv6Dst = make([]byte, 16) 1021 copy(m.Ipv6Dst, data) 1022 return nil 1023 } 1024 1025 // Return a MatchField for ipv6 dest addr 1026 func NewIpv6DstField(ipDst net.IP, ipDstMask *net.IP) *MatchField { 1027 f := new(MatchField) 1028 f.Class = OXM_CLASS_OPENFLOW_BASIC 1029 f.Field = OXM_FIELD_IPV6_DST 1030 f.HasMask = false 1031 1032 ipDstField := new(Ipv6DstField) 1033 ipDstField.Ipv6Dst = ipDst 1034 f.Value = ipDstField 1035 f.Length = uint8(ipDstField.Len()) 1036 1037 // Add the mask 1038 if ipDstMask != nil { 1039 mask := new(Ipv6DstField) 1040 mask.Ipv6Dst = *ipDstMask 1041 f.Mask = mask 1042 f.HasMask = true 1043 f.Length += uint8(mask.Len()) 1044 } 1045 1046 return f 1047 } 1048 1049 // IP_PROTO field 1050 type IpProtoField struct { 1051 protocol uint8 1052 } 1053 1054 func (m *IpProtoField) Len() uint16 { 1055 return 1 1056 } 1057 func (m *IpProtoField) MarshalBinary() (data []byte, err error) { 1058 data = make([]byte, 1) 1059 data[0] = m.protocol 1060 return 1061 } 1062 1063 func (m *IpProtoField) UnmarshalBinary(data []byte) error { 1064 m.protocol = data[0] 1065 return nil 1066 } 1067 1068 // Return a MatchField for ipv4 protocol 1069 func NewIpProtoField(protocol uint8) *MatchField { 1070 f := new(MatchField) 1071 f.Class = OXM_CLASS_OPENFLOW_BASIC 1072 f.Field = OXM_FIELD_IP_PROTO 1073 f.HasMask = false 1074 1075 ipProtoField := new(IpProtoField) 1076 ipProtoField.protocol = protocol 1077 f.Value = ipProtoField 1078 f.Length = uint8(ipProtoField.Len()) 1079 1080 return f 1081 } 1082 1083 // IP_DSCP field 1084 type IpDscpField struct { 1085 dscp uint8 1086 } 1087 1088 func (m *IpDscpField) Len() uint16 { 1089 return 1 1090 } 1091 func (m *IpDscpField) MarshalBinary() (data []byte, err error) { 1092 data = make([]byte, 1) 1093 data[0] = m.dscp 1094 return 1095 } 1096 1097 func (m *IpDscpField) UnmarshalBinary(data []byte) error { 1098 m.dscp = data[0] 1099 return nil 1100 } 1101 1102 // Return a MatchField for ipv4/ipv6 dscp 1103 func NewIpDscpField(dscp uint8) *MatchField { 1104 f := new(MatchField) 1105 f.Class = OXM_CLASS_OPENFLOW_BASIC 1106 f.Field = OXM_FIELD_IP_DSCP 1107 f.HasMask = false 1108 1109 ipDscpField := new(IpDscpField) 1110 ipDscpField.dscp = dscp 1111 f.Value = ipDscpField 1112 f.Length = uint8(ipDscpField.Len()) 1113 1114 return f 1115 } 1116 1117 // TUNNEL_ID field 1118 type TunnelIdField struct { 1119 TunnelId uint64 1120 } 1121 1122 func (m *TunnelIdField) Len() uint16 { 1123 return 8 1124 } 1125 func (m *TunnelIdField) MarshalBinary() (data []byte, err error) { 1126 data = make([]byte, m.Len()) 1127 1128 binary.BigEndian.PutUint64(data, m.TunnelId) 1129 return 1130 } 1131 func (m *TunnelIdField) UnmarshalBinary(data []byte) error { 1132 m.TunnelId = binary.BigEndian.Uint64(data) 1133 return nil 1134 } 1135 1136 // Return a MatchField for tunel id matching 1137 func NewTunnelIdField(tunnelId uint64) *MatchField { 1138 f := new(MatchField) 1139 f.Class = OXM_CLASS_OPENFLOW_BASIC 1140 f.Field = OXM_FIELD_TUNNEL_ID 1141 f.HasMask = false 1142 1143 tunnelIdField := new(TunnelIdField) 1144 tunnelIdField.TunnelId = tunnelId 1145 f.Value = tunnelIdField 1146 f.Length = uint8(tunnelIdField.Len()) 1147 1148 return f 1149 } 1150 1151 // METADATA field 1152 type MetadataField struct { 1153 Metadata uint64 1154 } 1155 1156 func (m *MetadataField) Len() uint16 { 1157 return 8 1158 } 1159 func (m *MetadataField) MarshalBinary() (data []byte, err error) { 1160 data = make([]byte, m.Len()) 1161 1162 binary.BigEndian.PutUint64(data, m.Metadata) 1163 return 1164 } 1165 func (m *MetadataField) UnmarshalBinary(data []byte) error { 1166 m.Metadata = binary.BigEndian.Uint64(data) 1167 return nil 1168 } 1169 1170 // Return a MatchField for tunnel id matching 1171 func NewMetadataField(metadata uint64, metadataMask *uint64) *MatchField { 1172 f := new(MatchField) 1173 f.Class = OXM_CLASS_OPENFLOW_BASIC 1174 f.Field = OXM_FIELD_METADATA 1175 f.HasMask = false 1176 1177 metadataField := new(MetadataField) 1178 metadataField.Metadata = metadata 1179 f.Value = metadataField 1180 f.Length = uint8(metadataField.Len()) 1181 1182 // Add the mask 1183 if metadataMask != nil { 1184 mask := new(MetadataField) 1185 mask.Metadata = *metadataMask 1186 f.Mask = mask 1187 f.HasMask = true 1188 f.Length += uint8(mask.Len()) 1189 } 1190 1191 return f 1192 } 1193 1194 // Common struct for all port fields 1195 type PortField struct { 1196 port uint16 1197 } 1198 1199 func (m *PortField) Len() uint16 { 1200 return 2 1201 } 1202 func (m *PortField) MarshalBinary() (data []byte, err error) { 1203 data = make([]byte, m.Len()) 1204 binary.BigEndian.PutUint16(data, m.port) 1205 return 1206 } 1207 1208 func (m *PortField) UnmarshalBinary(data []byte) error { 1209 m.port = binary.BigEndian.Uint16(data) 1210 return nil 1211 } 1212 1213 func NewPortField(port uint16) *PortField { 1214 f := new(PortField) 1215 f.port = port 1216 return f 1217 } 1218 1219 // TCP_SRC field 1220 func NewTcpSrcField(port uint16) *MatchField { 1221 f := new(MatchField) 1222 f.Class = OXM_CLASS_OPENFLOW_BASIC 1223 f.Field = OXM_FIELD_TCP_SRC 1224 f.HasMask = false 1225 1226 tcpSrcField := NewPortField(port) 1227 f.Value = tcpSrcField 1228 f.Length = uint8(tcpSrcField.Len()) 1229 1230 return f 1231 } 1232 1233 // TCP_DST field 1234 func NewTcpDstField(port uint16) *MatchField { 1235 f := new(MatchField) 1236 f.Class = OXM_CLASS_OPENFLOW_BASIC 1237 f.Field = OXM_FIELD_TCP_DST 1238 f.HasMask = false 1239 1240 tcpSrcField := NewPortField(port) 1241 f.Value = tcpSrcField 1242 f.Length = uint8(tcpSrcField.Len()) 1243 1244 return f 1245 } 1246 1247 // UDP_SRC field 1248 func NewUdpSrcField(port uint16) *MatchField { 1249 f := new(MatchField) 1250 f.Class = OXM_CLASS_OPENFLOW_BASIC 1251 f.Field = OXM_FIELD_UDP_SRC 1252 f.HasMask = false 1253 1254 tcpSrcField := NewPortField(port) 1255 f.Value = tcpSrcField 1256 f.Length = uint8(tcpSrcField.Len()) 1257 1258 return f 1259 } 1260 1261 // UDP_DST field 1262 func NewUdpDstField(port uint16) *MatchField { 1263 f := new(MatchField) 1264 f.Class = OXM_CLASS_OPENFLOW_BASIC 1265 f.Field = OXM_FIELD_UDP_DST 1266 f.HasMask = false 1267 1268 tcpSrcField := NewPortField(port) 1269 f.Value = tcpSrcField 1270 f.Length = uint8(tcpSrcField.Len()) 1271 1272 return f 1273 } 1274 1275 // Tcp flags field 1276 type TcpFlagsField struct { 1277 TcpFlags uint16 1278 } 1279 1280 func (m *TcpFlagsField) Len() uint16 { 1281 return 2 1282 } 1283 func (m *TcpFlagsField) MarshalBinary() (data []byte, err error) { 1284 data = make([]byte, m.Len()) 1285 binary.BigEndian.PutUint16(data, m.TcpFlags) 1286 return 1287 } 1288 func (m *TcpFlagsField) UnmarshalBinary(data []byte) error { 1289 m.TcpFlags = binary.BigEndian.Uint16(data) 1290 return nil 1291 } 1292 1293 // Return a tcp flags field 1294 func NewTcpFlagsField(tcpFlag uint16, tcpFlagMask *uint16) *MatchField { 1295 f := new(MatchField) 1296 f.Class = OXM_CLASS_OPENFLOW_BASIC 1297 f.Field = OXM_FIELD_TCP_FLAGS 1298 f.HasMask = false 1299 1300 tcpFlagField := new(TcpFlagsField) 1301 tcpFlagField.TcpFlags = tcpFlag 1302 f.Value = tcpFlagField 1303 f.Length = uint8(tcpFlagField.Len()) 1304 1305 // Add the mask 1306 if tcpFlagMask != nil { 1307 mask := new(TcpFlagsField) 1308 mask.TcpFlags = *tcpFlagMask 1309 f.Mask = mask 1310 f.HasMask = true 1311 f.Length += uint8(mask.Len()) 1312 } 1313 1314 return f 1315 } 1316 1317 // ARP Oper type field 1318 type ArpOperField struct { 1319 ArpOper uint16 1320 } 1321 1322 func (m *ArpOperField) Len() uint16 { 1323 return 2 1324 } 1325 func (m *ArpOperField) MarshalBinary() (data []byte, err error) { 1326 data = make([]byte, 2) 1327 1328 binary.BigEndian.PutUint16(data, m.ArpOper) 1329 return 1330 } 1331 func (m *ArpOperField) UnmarshalBinary(data []byte) error { 1332 m.ArpOper = binary.BigEndian.Uint16(data) 1333 return nil 1334 } 1335 1336 // Return a MatchField for arp operation type matching 1337 func NewArpOperField(arpOper uint16) *MatchField { 1338 f := new(MatchField) 1339 f.Class = OXM_CLASS_OPENFLOW_BASIC 1340 f.Field = OXM_FIELD_ARP_OP 1341 f.HasMask = false 1342 1343 arpOperField := new(ArpOperField) 1344 arpOperField.ArpOper = arpOper 1345 f.Value = arpOperField 1346 f.Length = uint8(arpOperField.Len()) 1347 1348 return f 1349 } 1350 1351 // Tunnel IPv4 Src field 1352 type TunnelIpv4SrcField struct { 1353 TunnelIpv4Src net.IP 1354 } 1355 1356 func (m *TunnelIpv4SrcField) Len() uint16 { 1357 return 4 1358 } 1359 func (m *TunnelIpv4SrcField) MarshalBinary() (data []byte, err error) { 1360 data = make([]byte, 4) 1361 copy(data, m.TunnelIpv4Src.To4()) 1362 return 1363 } 1364 1365 func (m *TunnelIpv4SrcField) UnmarshalBinary(data []byte) error { 1366 m.TunnelIpv4Src = net.IPv4(data[0], data[1], data[2], data[3]) 1367 return nil 1368 } 1369 1370 // Return a MatchField for tunnel ipv4 src addr 1371 func NewTunnelIpv4SrcField(tunnelIpSrc net.IP, tunnelIpSrcMask *net.IP) *MatchField { 1372 f := new(MatchField) 1373 f.Class = OXM_CLASS_NXM_1 1374 f.Field = NXM_NX_TUN_IPV4_SRC 1375 f.HasMask = false 1376 1377 tunnelIpSrcField := new(TunnelIpv4SrcField) 1378 tunnelIpSrcField.TunnelIpv4Src = tunnelIpSrc 1379 f.Value = tunnelIpSrcField 1380 f.Length = uint8(tunnelIpSrcField.Len()) 1381 1382 // Add the mask 1383 if tunnelIpSrcMask != nil { 1384 mask := new(TunnelIpv4SrcField) 1385 mask.TunnelIpv4Src = *tunnelIpSrcMask 1386 f.Mask = mask 1387 f.HasMask = true 1388 f.Length += uint8(mask.Len()) 1389 } 1390 1391 return f 1392 } 1393 1394 // Tunnel IPv4 Dst field 1395 type TunnelIpv4DstField struct { 1396 TunnelIpv4Dst net.IP 1397 } 1398 1399 func (m *TunnelIpv4DstField) Len() uint16 { 1400 return 4 1401 } 1402 func (m *TunnelIpv4DstField) MarshalBinary() (data []byte, err error) { 1403 data = make([]byte, 4) 1404 copy(data, m.TunnelIpv4Dst.To4()) 1405 return 1406 } 1407 1408 func (m *TunnelIpv4DstField) UnmarshalBinary(data []byte) error { 1409 m.TunnelIpv4Dst = net.IPv4(data[0], data[1], data[2], data[3]) 1410 return nil 1411 } 1412 1413 // Return a MatchField for tunnel ipv4 dst addr 1414 func NewTunnelIpv4DstField(tunnelIpDst net.IP, tunnelIpDstMask *net.IP) *MatchField { 1415 f := new(MatchField) 1416 f.Class = OXM_CLASS_NXM_1 1417 f.Field = NXM_NX_TUN_IPV4_DST 1418 f.HasMask = false 1419 1420 tunnelIpDstField := new(TunnelIpv4DstField) 1421 tunnelIpDstField.TunnelIpv4Dst = tunnelIpDst 1422 f.Value = tunnelIpDstField 1423 f.Length = uint8(tunnelIpDstField.Len()) 1424 1425 // Add the mask 1426 if tunnelIpDstMask != nil { 1427 mask := new(TunnelIpv4DstField) 1428 mask.TunnelIpv4Dst = *tunnelIpDstMask 1429 f.Mask = mask 1430 f.HasMask = true 1431 f.Length += uint8(mask.Len()) 1432 } 1433 1434 return f 1435 } 1436 1437 // Return a MatchField for tunnel ipv6 src addr 1438 func NewTunnelIpv6SrcField(tunnelIpv6Src net.IP, tunnelIpv6SrcMask *net.IP) *MatchField { 1439 f := new(MatchField) 1440 f.Class = OXM_CLASS_NXM_1 1441 f.Field = NXM_NX_TUN_IPV6_SRC 1442 f.HasMask = false 1443 1444 tunnelIpv6SrcField := new(Ipv6SrcField) 1445 tunnelIpv6SrcField.Ipv6Src = tunnelIpv6Src 1446 f.Value = tunnelIpv6SrcField 1447 f.Length = uint8(tunnelIpv6SrcField.Len()) 1448 1449 // Add the mask 1450 if tunnelIpv6SrcMask != nil { 1451 mask := new(Ipv6SrcField) 1452 mask.Ipv6Src = *tunnelIpv6SrcMask 1453 f.Mask = mask 1454 f.HasMask = true 1455 f.Length += uint8(mask.Len()) 1456 } 1457 1458 return f 1459 } 1460 1461 // Return a MatchField for tunnel ipv6 dst addr 1462 func NewTunnelIpv6DstField(tunnelIpv6Dst net.IP, tunnelIpv6DstMask *net.IP) *MatchField { 1463 f := new(MatchField) 1464 f.Class = OXM_CLASS_NXM_1 1465 f.Field = NXM_NX_TUN_IPV6_DST 1466 f.HasMask = false 1467 1468 tunnelIpv6DstField := new(Ipv6DstField) 1469 tunnelIpv6DstField.Ipv6Dst = tunnelIpv6Dst 1470 f.Value = tunnelIpv6DstField 1471 f.Length = uint8(tunnelIpv6DstField.Len()) 1472 1473 // Add the mask 1474 if tunnelIpv6DstMask != nil { 1475 mask := new(Ipv6DstField) 1476 mask.Ipv6Dst = *tunnelIpv6DstMask 1477 f.Mask = mask 1478 f.HasMask = true 1479 f.Length += uint8(mask.Len()) 1480 } 1481 1482 return f 1483 } 1484 1485 // SCTP_DST field 1486 func NewSctpDstField(port uint16) *MatchField { 1487 f := new(MatchField) 1488 f.Class = OXM_CLASS_OPENFLOW_BASIC 1489 f.Field = OXM_FIELD_SCTP_DST 1490 f.HasMask = false 1491 1492 sctpDstField := new(PortField) 1493 sctpDstField.port = port 1494 f.Value = sctpDstField 1495 f.Length = uint8(sctpDstField.Len()) 1496 1497 return f 1498 } 1499 1500 // SCTP_DST field 1501 func NewSctpSrcField(port uint16) *MatchField { 1502 f := new(MatchField) 1503 f.Class = OXM_CLASS_OPENFLOW_BASIC 1504 f.Field = OXM_FIELD_SCTP_SRC 1505 f.HasMask = false 1506 1507 sctpSrcField := new(PortField) 1508 sctpSrcField.port = port 1509 f.Value = sctpSrcField 1510 f.Length = uint8(sctpSrcField.Len()) 1511 1512 return f 1513 } 1514 1515 // ARP Host Address field message, used by arp_sha and arp_tha match 1516 type ArpXHaField struct { 1517 ArpHa net.HardwareAddr 1518 } 1519 1520 func (m *ArpXHaField) Len() uint16 { 1521 return 6 1522 } 1523 func (m *ArpXHaField) MarshalBinary() (data []byte, err error) { 1524 data = make([]byte, m.Len()) 1525 copy(data, m.ArpHa) 1526 return 1527 } 1528 1529 func (m *ArpXHaField) UnmarshalBinary(data []byte) error { 1530 if len(data) < int(m.Len()) { 1531 return errors.New("The byte array has wrong size to unmarshal ArpXHaField message") 1532 } 1533 copy(m.ArpHa, data[:6]) 1534 return nil 1535 } 1536 1537 func NewArpThaField(arpTha net.HardwareAddr) *MatchField { 1538 f := new(MatchField) 1539 f.Class = OXM_CLASS_OPENFLOW_BASIC 1540 f.Field = OXM_FIELD_ARP_THA 1541 f.HasMask = false 1542 1543 arpThaField := new(ArpXHaField) 1544 arpThaField.ArpHa = arpTha 1545 f.Value = arpThaField 1546 f.Length = uint8(arpThaField.Len()) 1547 return f 1548 } 1549 1550 func NewArpShaField(arpSha net.HardwareAddr) *MatchField { 1551 f := new(MatchField) 1552 f.Class = OXM_CLASS_OPENFLOW_BASIC 1553 f.Field = OXM_FIELD_ARP_SHA 1554 f.HasMask = false 1555 1556 arpXHAField := new(ArpXHaField) 1557 arpXHAField.ArpHa = arpSha 1558 f.Value = arpXHAField 1559 f.Length = uint8(arpXHAField.Len()) 1560 return f 1561 } 1562 1563 // ARP Protocol Address field message, used by arp_spa and arp_tpa match 1564 type ArpXPaField struct { 1565 ArpPa net.IP 1566 } 1567 1568 func (m *ArpXPaField) Len() uint16 { 1569 return 4 1570 } 1571 1572 func (m *ArpXPaField) MarshalBinary() (data []byte, err error) { 1573 data = make([]byte, m.Len()) 1574 copy(data, m.ArpPa.To4()) 1575 return 1576 } 1577 1578 func (m *ArpXPaField) UnmarshalBinary(data []byte) error { 1579 if len(data) < int(m.Len()) { 1580 return errors.New("The byte array has wrong size to unmarshal ArpXPaField message") 1581 } 1582 m.ArpPa = net.IPv4(data[0], data[1], data[2], data[3]) 1583 return nil 1584 } 1585 1586 func NewArpTpaField(arpTpa net.IP) *MatchField { 1587 f := new(MatchField) 1588 f.Class = OXM_CLASS_OPENFLOW_BASIC 1589 f.Field = OXM_FIELD_ARP_TPA 1590 f.HasMask = false 1591 1592 arpTpaField := new(ArpXPaField) 1593 arpTpaField.ArpPa = arpTpa 1594 f.Value = arpTpaField 1595 f.Length = uint8(arpTpaField.Len()) 1596 return f 1597 } 1598 1599 func NewArpSpaField(arpSpa net.IP) *MatchField { 1600 f := new(MatchField) 1601 f.Class = OXM_CLASS_OPENFLOW_BASIC 1602 f.Field = OXM_FIELD_ARP_SPA 1603 f.HasMask = false 1604 1605 arpXPAField := new(ArpXPaField) 1606 arpXPAField.ArpPa = arpSpa 1607 f.Value = arpXPAField 1608 f.Length = uint8(arpXPAField.Len()) 1609 return f 1610 } 1611 1612 // ACTSET_OUTPUT field 1613 type ActsetOutputField struct { 1614 OutputPort uint32 1615 } 1616 1617 func (m *ActsetOutputField) Len() uint16 { 1618 return 4 1619 } 1620 func (m *ActsetOutputField) MarshalBinary() (data []byte, err error) { 1621 data = make([]byte, 4) 1622 1623 binary.BigEndian.PutUint32(data, m.OutputPort) 1624 return 1625 } 1626 func (m *ActsetOutputField) UnmarshalBinary(data []byte) error { 1627 m.OutputPort = binary.BigEndian.Uint32(data) 1628 return nil 1629 } 1630 1631 // Return a MatchField for actset_output port matching 1632 func NewActsetOutputField(actsetOutputPort uint32) *MatchField { 1633 f := new(MatchField) 1634 f.Class = OXM_CLASS_OPENFLOW_BASIC 1635 f.Field = OXM_FIELD_ACTSET_OUTPUT 1636 f.HasMask = false 1637 1638 actsetOutputField := new(ActsetOutputField) 1639 actsetOutputField.OutputPort = actsetOutputPort 1640 f.Value = actsetOutputField 1641 f.Length = uint8(actsetOutputField.Len()) 1642 1643 return f 1644 } 1645 1646 type IcmpTypeField struct { 1647 Type uint8 1648 } 1649 1650 func (f *IcmpTypeField) Len() uint16 { 1651 return 1 1652 } 1653 1654 func (f *IcmpTypeField) MarshalBinary() (data []byte, err error) { 1655 data = make([]byte, 1) 1656 data[0] = f.Type 1657 return 1658 } 1659 1660 func (f *IcmpTypeField) UnmarshalBinary(data []byte) error { 1661 if len(data) < int(f.Len()) { 1662 return errors.New("The byte array has wrong size to unmarshal IcmpTypeField message") 1663 } 1664 f.Type = data[0] 1665 return nil 1666 } 1667 1668 type IcmpCodeField struct { 1669 Code uint8 1670 } 1671 1672 func (f *IcmpCodeField) Len() uint16 { 1673 return 1 1674 } 1675 1676 func (f *IcmpCodeField) MarshalBinary() (data []byte, err error) { 1677 data = make([]byte, 1) 1678 data[0] = f.Code 1679 return 1680 } 1681 1682 func (f *IcmpCodeField) UnmarshalBinary(data []byte) error { 1683 if len(data) < int(f.Len()) { 1684 return errors.New("The byte array has wrong size to unmarshal IcmpCodeField message") 1685 } 1686 f.Code = data[0] 1687 return nil 1688 }