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  }