/*
 * Copyright (c) 2008 The Board of Trustees of The Leland Stanford Junior University
 * Copyright (c) 2011, 2012 Open Networking Foundation
 * Copyright 2013, Big Switch Networks, Inc. This library was generated by the LoxiGen Compiler.
 * Copyright 2018, Red Hat, Inc.
 */
// Automatically generated by LOXI from template module.go
// Do not modify

package of15

import (
	"bytes"
	"encoding/binary"
	"fmt"
	"net"

	"github.com/opencord/goloxi"
)

type Header struct {
	Version uint8
	Type    uint8
	Length  uint16
	Xid     uint32
}

type IHeader interface {
	goloxi.Serializable
	GetVersion() uint8
	GetType() uint8
	GetLength() uint16
	GetXid() uint32
}

func (self *Header) GetVersion() uint8 {
	return self.Version
}

func (self *Header) SetVersion(v uint8) {
	self.Version = v
}

func (self *Header) GetType() uint8 {
	return self.Type
}

func (self *Header) SetType(v uint8) {
	self.Type = v
}

func (self *Header) GetLength() uint16 {
	return self.Length
}

func (self *Header) SetLength(v uint16) {
	self.Length = v
}

func (self *Header) GetXid() uint32 {
	return self.Xid
}

func (self *Header) SetXid(v uint32) {
	self.Xid = v
}

func (self *Header) Serialize(encoder *goloxi.Encoder) error {

	encoder.PutUint8(uint8(6))
	encoder.PutUint8(uint8(self.Type))
	encoder.PutUint16(uint16(self.Length))
	encoder.PutUint32(uint32(self.Xid))

	return nil
}
func (self *Header) Decode(decoder *goloxi.Decoder) error {
	if decoder.Length() < 8 {
		return fmt.Errorf("Header packet too short: %d < 8", decoder.Length())
	}

	self.Version = uint8(decoder.ReadByte())
	self.Type = uint8(decoder.ReadByte())
	self.Length = uint16(decoder.ReadUint16())
	oldDecoder := decoder
	defer func() { decoder = oldDecoder }()
	decoder = decoder.SliceDecoder(int(self.Length), 2+2)
	self.Xid = uint32(decoder.ReadUint32())

	return nil
}
func DecodeHeader(decoder *goloxi.Decoder) (IHeader, error) {
	_header := &Header{}
	if decoder.Length() < 8 {
		return nil, fmt.Errorf("Header packet too short: %d < 8", decoder.Length())
	}
	_header.Version = uint8(decoder.ReadByte())
	_header.Type = uint8(decoder.ReadByte())
	_header.Length = uint16(decoder.ReadUint16())
	oldDecoder := decoder
	defer func() { decoder = oldDecoder }()
	decoder = decoder.SliceDecoder(int(_header.Length), 2+2)
	_header.Xid = uint32(decoder.ReadUint32())

	switch _header.Type {
	case 0:
		return DecodeHello(_header, decoder)
	case 1:
		return DecodeErrorMsg(_header, decoder)
	case 2:
		return DecodeEchoRequest(_header, decoder)
	case 3:
		return DecodeEchoReply(_header, decoder)
	case 4:
		return DecodeExperimenter(_header, decoder)
	case 5:
		return DecodeFeaturesRequest(_header, decoder)
	case 6:
		return DecodeFeaturesReply(_header, decoder)
	case 7:
		return DecodeGetConfigRequest(_header, decoder)
	case 8:
		return DecodeGetConfigReply(_header, decoder)
	case 9:
		return DecodeSetConfig(_header, decoder)
	case 10:
		return DecodePacketIn(_header, decoder)
	case 11:
		return DecodeFlowRemoved(_header, decoder)
	case 12:
		return DecodePortStatus(_header, decoder)
	case 13:
		return DecodePacketOut(_header, decoder)
	case 14:
		return DecodeFlowMod(_header, decoder)
	case 15:
		return DecodeGroupMod(_header, decoder)
	case 16:
		return DecodePortMod(_header, decoder)
	case 17:
		return DecodeTableMod(_header, decoder)
	case 18:
		return DecodeStatsRequest(_header, decoder)
	case 19:
		return DecodeStatsReply(_header, decoder)
	case 20:
		return DecodeBarrierRequest(_header, decoder)
	case 21:
		return DecodeBarrierReply(_header, decoder)
	case 24:
		return DecodeRoleRequest(_header, decoder)
	case 25:
		return DecodeRoleReply(_header, decoder)
	case 26:
		return DecodeAsyncGetRequest(_header, decoder)
	case 27:
		return DecodeAsyncGetReply(_header, decoder)
	case 28:
		return DecodeAsyncSet(_header, decoder)
	case 29:
		return DecodeMeterMod(_header, decoder)
	case 30:
		return DecodeRoleStatus(_header, decoder)
	case 31:
		return DecodeTableStatus(_header, decoder)
	case 32:
		return DecodeRequestforward(_header, decoder)
	case 33:
		return DecodeBundleCtrlMsg(_header, decoder)
	case 34:
		return DecodeBundleAddMsg(_header, decoder)
	case 35:
		return DecodeControllerStatus(_header, decoder)
	default:
		return nil, fmt.Errorf("Invalid type '%d' for 'Header'", _header.Type)
	}
}

func NewHeader(_type uint8) *Header {
	obj := &Header{}
	obj.Type = _type
	return obj
}

type StatsReply struct {
	*Header
	StatsType uint16
	Flags     StatsReplyFlags
}

type IStatsReply interface {
	IHeader
	GetStatsType() uint16
	GetFlags() StatsReplyFlags
}

func (self *StatsReply) GetStatsType() uint16 {
	return self.StatsType
}

func (self *StatsReply) SetStatsType(v uint16) {
	self.StatsType = v
}

func (self *StatsReply) GetFlags() StatsReplyFlags {
	return self.Flags
}

func (self *StatsReply) SetFlags(v StatsReplyFlags) {
	self.Flags = v
}

func (self *StatsReply) Serialize(encoder *goloxi.Encoder) error {
	if err := self.Header.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint16(uint16(self.StatsType))
	encoder.PutUint16(uint16(self.Flags))

	return nil
}

func DecodeStatsReply(parent *Header, decoder *goloxi.Decoder) (IStatsReply, error) {
	_statsreply := &StatsReply{Header: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("StatsReply packet too short: %d < 4", decoder.Length())
	}
	_statsreply.StatsType = uint16(decoder.ReadUint16())
	_statsreply.Flags = StatsReplyFlags(decoder.ReadUint16())

	switch _statsreply.StatsType {
	case 0:
		return DecodeDescStatsReply(_statsreply, decoder)
	case 1:
		return DecodeFlowStatsReply(_statsreply, decoder)
	case 2:
		return DecodeAggregateStatsReply(_statsreply, decoder)
	case 3:
		return DecodeTableStatsReply(_statsreply, decoder)
	case 4:
		return DecodePortStatsReply(_statsreply, decoder)
	case 5:
		return DecodeQueueStatsReply(_statsreply, decoder)
	case 6:
		return DecodeGroupStatsReply(_statsreply, decoder)
	case 7:
		return DecodeGroupDescStatsReply(_statsreply, decoder)
	case 8:
		return DecodeGroupFeaturesStatsReply(_statsreply, decoder)
	case 9:
		return DecodeMeterStatsReply(_statsreply, decoder)
	case 10:
		return DecodeMeterConfigStatsReply(_statsreply, decoder)
	case 11:
		return DecodeMeterFeaturesStatsReply(_statsreply, decoder)
	case 12:
		return DecodeTableFeaturesStatsReply(_statsreply, decoder)
	case 13:
		return DecodePortDescStatsReply(_statsreply, decoder)
	case 14:
		return DecodeTableDescStatsReply(_statsreply, decoder)
	case 15:
		return DecodeQueueDescStatsReply(_statsreply, decoder)
	case 16:
		return DecodeFlowMonitorReply(_statsreply, decoder)
	case 17:
		return DecodeFlowLightweightStatsReply(_statsreply, decoder)
	case 18:
		return DecodeControllerStatusStatsReply(_statsreply, decoder)
	case 19:
		return DecodeBundleFeaturesStatsReply(_statsreply, decoder)
	case 65535:
		return DecodeExperimenterStatsReply(_statsreply, decoder)
	default:
		return nil, fmt.Errorf("Invalid type '%d' for 'StatsReply'", _statsreply.StatsType)
	}
}

func NewStatsReply(_stats_type uint16) *StatsReply {
	obj := &StatsReply{
		Header: NewHeader(19),
	}
	obj.StatsType = _stats_type
	return obj
}

type AggregateStatsReply struct {
	*StatsReply
	Stats Stat
}

type IAggregateStatsReply interface {
	IStatsReply
	GetStats() Stat
}

func (self *AggregateStatsReply) GetStats() Stat {
	return self.Stats
}

func (self *AggregateStatsReply) SetStats(v Stat) {
	self.Stats = v
}

func (self *AggregateStatsReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsReply.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	if err := self.Stats.Serialize(encoder); err != nil {
		return err
	}

	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeAggregateStatsReply(parent *StatsReply, decoder *goloxi.Decoder) (*AggregateStatsReply, error) {
	_aggregatestatsreply := &AggregateStatsReply{StatsReply: parent}
	if decoder.Length() < 12 {
		return nil, fmt.Errorf("AggregateStatsReply packet too short: %d < 12", decoder.Length())
	}
	decoder.Skip(4)
	if err := _aggregatestatsreply.Stats.Decode(decoder); err != nil {
		return nil, err
	}

	decoder.SkipAlign()
	return _aggregatestatsreply, nil
}

func NewAggregateStatsReply() *AggregateStatsReply {
	obj := &AggregateStatsReply{
		StatsReply: NewStatsReply(2),
	}
	return obj
}

type StatsRequest struct {
	*Header
	StatsType uint16
	Flags     StatsRequestFlags
}

type IStatsRequest interface {
	IHeader
	GetStatsType() uint16
	GetFlags() StatsRequestFlags
}

func (self *StatsRequest) GetStatsType() uint16 {
	return self.StatsType
}

func (self *StatsRequest) SetStatsType(v uint16) {
	self.StatsType = v
}

func (self *StatsRequest) GetFlags() StatsRequestFlags {
	return self.Flags
}

func (self *StatsRequest) SetFlags(v StatsRequestFlags) {
	self.Flags = v
}

func (self *StatsRequest) Serialize(encoder *goloxi.Encoder) error {
	if err := self.Header.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint16(uint16(self.StatsType))
	encoder.PutUint16(uint16(self.Flags))

	return nil
}

func DecodeStatsRequest(parent *Header, decoder *goloxi.Decoder) (IStatsRequest, error) {
	_statsrequest := &StatsRequest{Header: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("StatsRequest packet too short: %d < 4", decoder.Length())
	}
	_statsrequest.StatsType = uint16(decoder.ReadUint16())
	_statsrequest.Flags = StatsRequestFlags(decoder.ReadUint16())

	switch _statsrequest.StatsType {
	case 0:
		return DecodeDescStatsRequest(_statsrequest, decoder)
	case 1:
		return DecodeFlowStatsRequest(_statsrequest, decoder)
	case 2:
		return DecodeAggregateStatsRequest(_statsrequest, decoder)
	case 3:
		return DecodeTableStatsRequest(_statsrequest, decoder)
	case 4:
		return DecodePortStatsRequest(_statsrequest, decoder)
	case 5:
		return DecodeQueueStatsRequest(_statsrequest, decoder)
	case 6:
		return DecodeGroupStatsRequest(_statsrequest, decoder)
	case 7:
		return DecodeGroupDescStatsRequest(_statsrequest, decoder)
	case 8:
		return DecodeGroupFeaturesStatsRequest(_statsrequest, decoder)
	case 9:
		return DecodeMeterStatsRequest(_statsrequest, decoder)
	case 10:
		return DecodeMeterConfigStatsRequest(_statsrequest, decoder)
	case 11:
		return DecodeMeterFeaturesStatsRequest(_statsrequest, decoder)
	case 12:
		return DecodeTableFeaturesStatsRequest(_statsrequest, decoder)
	case 13:
		return DecodePortDescStatsRequest(_statsrequest, decoder)
	case 14:
		return DecodeTableDescStatsRequest(_statsrequest, decoder)
	case 15:
		return DecodeQueueDescStatsRequest(_statsrequest, decoder)
	case 16:
		return DecodeFlowMonitorRequest(_statsrequest, decoder)
	case 17:
		return DecodeFlowLightweightStatsRequest(_statsrequest, decoder)
	case 18:
		return DecodeControllerStatusStatsRequest(_statsrequest, decoder)
	case 19:
		return DecodeBundleFeaturesStatsRequest(_statsrequest, decoder)
	case 65535:
		return DecodeExperimenterStatsRequest(_statsrequest, decoder)
	default:
		return nil, fmt.Errorf("Invalid type '%d' for 'StatsRequest'", _statsrequest.StatsType)
	}
}

func NewStatsRequest(_stats_type uint16) *StatsRequest {
	obj := &StatsRequest{
		Header: NewHeader(18),
	}
	obj.StatsType = _stats_type
	return obj
}

type AggregateStatsRequest struct {
	*StatsRequest
	TableId    uint8
	OutPort    Port
	OutGroup   uint32
	Cookie     uint64
	CookieMask uint64
	Match      Match
}

type IAggregateStatsRequest interface {
	IStatsRequest
	GetTableId() uint8
	GetOutPort() Port
	GetOutGroup() uint32
	GetCookie() uint64
	GetCookieMask() uint64
	GetMatch() Match
}

func (self *AggregateStatsRequest) GetTableId() uint8 {
	return self.TableId
}

func (self *AggregateStatsRequest) SetTableId(v uint8) {
	self.TableId = v
}

func (self *AggregateStatsRequest) GetOutPort() Port {
	return self.OutPort
}

func (self *AggregateStatsRequest) SetOutPort(v Port) {
	self.OutPort = v
}

func (self *AggregateStatsRequest) GetOutGroup() uint32 {
	return self.OutGroup
}

func (self *AggregateStatsRequest) SetOutGroup(v uint32) {
	self.OutGroup = v
}

func (self *AggregateStatsRequest) GetCookie() uint64 {
	return self.Cookie
}

func (self *AggregateStatsRequest) SetCookie(v uint64) {
	self.Cookie = v
}

func (self *AggregateStatsRequest) GetCookieMask() uint64 {
	return self.CookieMask
}

func (self *AggregateStatsRequest) SetCookieMask(v uint64) {
	self.CookieMask = v
}

func (self *AggregateStatsRequest) GetMatch() Match {
	return self.Match
}

func (self *AggregateStatsRequest) SetMatch(v Match) {
	self.Match = v
}

func (self *AggregateStatsRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsRequest.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	encoder.PutUint8(uint8(self.TableId))
	encoder.Write(bytes.Repeat([]byte{0}, 3))
	self.OutPort.Serialize(encoder)
	encoder.PutUint32(uint32(self.OutGroup))
	encoder.Write(bytes.Repeat([]byte{0}, 4))
	encoder.PutUint64(uint64(self.Cookie))
	encoder.PutUint64(uint64(self.CookieMask))
	if err := self.Match.Serialize(encoder); err != nil {
		return err
	}

	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeAggregateStatsRequest(parent *StatsRequest, decoder *goloxi.Decoder) (*AggregateStatsRequest, error) {
	_aggregatestatsrequest := &AggregateStatsRequest{StatsRequest: parent}
	if decoder.Length() < 28 {
		return nil, fmt.Errorf("AggregateStatsRequest packet too short: %d < 28", decoder.Length())
	}
	decoder.Skip(4)
	_aggregatestatsrequest.TableId = uint8(decoder.ReadByte())
	decoder.Skip(3)
	_aggregatestatsrequest.OutPort.Decode(decoder)
	_aggregatestatsrequest.OutGroup = uint32(decoder.ReadUint32())
	decoder.Skip(4)
	_aggregatestatsrequest.Cookie = uint64(decoder.ReadUint64())
	_aggregatestatsrequest.CookieMask = uint64(decoder.ReadUint64())
	if err := _aggregatestatsrequest.Match.Decode(decoder); err != nil {
		return nil, err
	}

	decoder.SkipAlign()
	return _aggregatestatsrequest, nil
}

func NewAggregateStatsRequest() *AggregateStatsRequest {
	obj := &AggregateStatsRequest{
		StatsRequest: NewStatsRequest(2),
	}
	return obj
}

type ErrorMsg struct {
	*Header
	ErrType uint16
}

type IErrorMsg interface {
	IHeader
	GetErrType() uint16
}

func (self *ErrorMsg) GetErrType() uint16 {
	return self.ErrType
}

func (self *ErrorMsg) SetErrType(v uint16) {
	self.ErrType = v
}

func (self *ErrorMsg) Serialize(encoder *goloxi.Encoder) error {
	if err := self.Header.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint16(uint16(self.ErrType))

	return nil
}

func DecodeErrorMsg(parent *Header, decoder *goloxi.Decoder) (IErrorMsg, error) {
	_errormsg := &ErrorMsg{Header: parent}
	if decoder.Length() < 2 {
		return nil, fmt.Errorf("ErrorMsg packet too short: %d < 2", decoder.Length())
	}
	_errormsg.ErrType = uint16(decoder.ReadUint16())

	switch _errormsg.ErrType {
	case 0:
		return DecodeHelloFailedErrorMsg(_errormsg, decoder)
	case 1:
		return DecodeBadRequestErrorMsg(_errormsg, decoder)
	case 2:
		return DecodeBadActionErrorMsg(_errormsg, decoder)
	case 3:
		return DecodeBadInstructionErrorMsg(_errormsg, decoder)
	case 4:
		return DecodeBadMatchErrorMsg(_errormsg, decoder)
	case 5:
		return DecodeFlowModFailedErrorMsg(_errormsg, decoder)
	case 6:
		return DecodeGroupModFailedErrorMsg(_errormsg, decoder)
	case 7:
		return DecodePortModFailedErrorMsg(_errormsg, decoder)
	case 8:
		return DecodeTableModFailedErrorMsg(_errormsg, decoder)
	case 9:
		return DecodeQueueOpFailedErrorMsg(_errormsg, decoder)
	case 10:
		return DecodeSwitchConfigFailedErrorMsg(_errormsg, decoder)
	case 11:
		return DecodeRoleRequestFailedErrorMsg(_errormsg, decoder)
	case 12:
		return DecodeMeterModFailedErrorMsg(_errormsg, decoder)
	case 13:
		return DecodeTableFeaturesFailedErrorMsg(_errormsg, decoder)
	case 14:
		return DecodeBadPropertyErrorMsg(_errormsg, decoder)
	case 15:
		return DecodeAsyncConfigFailedErrorMsg(_errormsg, decoder)
	case 16:
		return DecodeFlowMonitorFailedErrorMsg(_errormsg, decoder)
	case 17:
		return DecodeBundleFailedErrorMsg(_errormsg, decoder)
	case 65535:
		return DecodeExperimenterErrorMsg(_errormsg, decoder)
	default:
		return nil, fmt.Errorf("Invalid type '%d' for 'ErrorMsg'", _errormsg.ErrType)
	}
}

func NewErrorMsg(_err_type uint16) *ErrorMsg {
	obj := &ErrorMsg{
		Header: NewHeader(1),
	}
	obj.ErrType = _err_type
	return obj
}

type AsyncConfigFailedErrorMsg struct {
	*ErrorMsg
	Code AsyncConfigFailedCode
	Data []byte
}

type IAsyncConfigFailedErrorMsg interface {
	IErrorMsg
	GetCode() AsyncConfigFailedCode
	GetData() []byte
}

func (self *AsyncConfigFailedErrorMsg) GetCode() AsyncConfigFailedCode {
	return self.Code
}

func (self *AsyncConfigFailedErrorMsg) SetCode(v AsyncConfigFailedCode) {
	self.Code = v
}

func (self *AsyncConfigFailedErrorMsg) GetData() []byte {
	return self.Data
}

func (self *AsyncConfigFailedErrorMsg) SetData(v []byte) {
	self.Data = v
}

func (self *AsyncConfigFailedErrorMsg) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.ErrorMsg.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint16(uint16(self.Code))
	encoder.Write(self.Data)
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeAsyncConfigFailedErrorMsg(parent *ErrorMsg, decoder *goloxi.Decoder) (*AsyncConfigFailedErrorMsg, error) {
	_asyncconfigfailederrormsg := &AsyncConfigFailedErrorMsg{ErrorMsg: parent}
	if decoder.Length() < 2 {
		return nil, fmt.Errorf("AsyncConfigFailedErrorMsg packet too short: %d < 2", decoder.Length())
	}
	_asyncconfigfailederrormsg.Code = AsyncConfigFailedCode(decoder.ReadUint16())
	_asyncconfigfailederrormsg.Data = decoder.Read(int(decoder.Length()))
	return _asyncconfigfailederrormsg, nil
}

func NewAsyncConfigFailedErrorMsg() *AsyncConfigFailedErrorMsg {
	obj := &AsyncConfigFailedErrorMsg{
		ErrorMsg: NewErrorMsg(15),
	}
	return obj
}

type AsyncGetReply struct {
	*Header
	Properties []IAsyncConfigProp
}

type IAsyncGetReply interface {
	IHeader
	GetProperties() []IAsyncConfigProp
}

func (self *AsyncGetReply) GetProperties() []IAsyncConfigProp {
	return self.Properties
}

func (self *AsyncGetReply) SetProperties(v []IAsyncConfigProp) {
	self.Properties = v
}

func (self *AsyncGetReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.Header.Serialize(encoder); err != nil {
		return err
	}

	for _, obj := range self.Properties {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeAsyncGetReply(parent *Header, decoder *goloxi.Decoder) (*AsyncGetReply, error) {
	_asyncgetreply := &AsyncGetReply{Header: parent}

	for decoder.Length() >= 4 {
		item, err := DecodeAsyncConfigProp(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_asyncgetreply.Properties = append(_asyncgetreply.Properties, item)
		}
	}
	return _asyncgetreply, nil
}

func NewAsyncGetReply() *AsyncGetReply {
	obj := &AsyncGetReply{
		Header: NewHeader(27),
	}
	return obj
}

type AsyncGetRequest struct {
	*Header
	Properties []IAsyncConfigProp
}

type IAsyncGetRequest interface {
	IHeader
	GetProperties() []IAsyncConfigProp
}

func (self *AsyncGetRequest) GetProperties() []IAsyncConfigProp {
	return self.Properties
}

func (self *AsyncGetRequest) SetProperties(v []IAsyncConfigProp) {
	self.Properties = v
}

func (self *AsyncGetRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.Header.Serialize(encoder); err != nil {
		return err
	}

	for _, obj := range self.Properties {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeAsyncGetRequest(parent *Header, decoder *goloxi.Decoder) (*AsyncGetRequest, error) {
	_asyncgetrequest := &AsyncGetRequest{Header: parent}

	for decoder.Length() >= 4 {
		item, err := DecodeAsyncConfigProp(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_asyncgetrequest.Properties = append(_asyncgetrequest.Properties, item)
		}
	}
	return _asyncgetrequest, nil
}

func NewAsyncGetRequest() *AsyncGetRequest {
	obj := &AsyncGetRequest{
		Header: NewHeader(26),
	}
	return obj
}

type AsyncSet struct {
	*Header
	Properties []IAsyncConfigProp
}

type IAsyncSet interface {
	IHeader
	GetProperties() []IAsyncConfigProp
}

func (self *AsyncSet) GetProperties() []IAsyncConfigProp {
	return self.Properties
}

func (self *AsyncSet) SetProperties(v []IAsyncConfigProp) {
	self.Properties = v
}

func (self *AsyncSet) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.Header.Serialize(encoder); err != nil {
		return err
	}

	for _, obj := range self.Properties {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeAsyncSet(parent *Header, decoder *goloxi.Decoder) (*AsyncSet, error) {
	_asyncset := &AsyncSet{Header: parent}

	for decoder.Length() >= 4 {
		item, err := DecodeAsyncConfigProp(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_asyncset.Properties = append(_asyncset.Properties, item)
		}
	}
	return _asyncset, nil
}

func NewAsyncSet() *AsyncSet {
	obj := &AsyncSet{
		Header: NewHeader(28),
	}
	return obj
}

type BadActionErrorMsg struct {
	*ErrorMsg
	Code BadActionCode
	Data []byte
}

type IBadActionErrorMsg interface {
	IErrorMsg
	GetCode() BadActionCode
	GetData() []byte
}

func (self *BadActionErrorMsg) GetCode() BadActionCode {
	return self.Code
}

func (self *BadActionErrorMsg) SetCode(v BadActionCode) {
	self.Code = v
}

func (self *BadActionErrorMsg) GetData() []byte {
	return self.Data
}

func (self *BadActionErrorMsg) SetData(v []byte) {
	self.Data = v
}

func (self *BadActionErrorMsg) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.ErrorMsg.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint16(uint16(self.Code))
	encoder.Write(self.Data)
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBadActionErrorMsg(parent *ErrorMsg, decoder *goloxi.Decoder) (*BadActionErrorMsg, error) {
	_badactionerrormsg := &BadActionErrorMsg{ErrorMsg: parent}
	if decoder.Length() < 2 {
		return nil, fmt.Errorf("BadActionErrorMsg packet too short: %d < 2", decoder.Length())
	}
	_badactionerrormsg.Code = BadActionCode(decoder.ReadUint16())
	_badactionerrormsg.Data = decoder.Read(int(decoder.Length()))
	return _badactionerrormsg, nil
}

func NewBadActionErrorMsg() *BadActionErrorMsg {
	obj := &BadActionErrorMsg{
		ErrorMsg: NewErrorMsg(2),
	}
	return obj
}

type BadInstructionErrorMsg struct {
	*ErrorMsg
	Code BadInstructionCode
	Data []byte
}

type IBadInstructionErrorMsg interface {
	IErrorMsg
	GetCode() BadInstructionCode
	GetData() []byte
}

func (self *BadInstructionErrorMsg) GetCode() BadInstructionCode {
	return self.Code
}

func (self *BadInstructionErrorMsg) SetCode(v BadInstructionCode) {
	self.Code = v
}

func (self *BadInstructionErrorMsg) GetData() []byte {
	return self.Data
}

func (self *BadInstructionErrorMsg) SetData(v []byte) {
	self.Data = v
}

func (self *BadInstructionErrorMsg) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.ErrorMsg.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint16(uint16(self.Code))
	encoder.Write(self.Data)
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBadInstructionErrorMsg(parent *ErrorMsg, decoder *goloxi.Decoder) (*BadInstructionErrorMsg, error) {
	_badinstructionerrormsg := &BadInstructionErrorMsg{ErrorMsg: parent}
	if decoder.Length() < 2 {
		return nil, fmt.Errorf("BadInstructionErrorMsg packet too short: %d < 2", decoder.Length())
	}
	_badinstructionerrormsg.Code = BadInstructionCode(decoder.ReadUint16())
	_badinstructionerrormsg.Data = decoder.Read(int(decoder.Length()))
	return _badinstructionerrormsg, nil
}

func NewBadInstructionErrorMsg() *BadInstructionErrorMsg {
	obj := &BadInstructionErrorMsg{
		ErrorMsg: NewErrorMsg(3),
	}
	return obj
}

type BadMatchErrorMsg struct {
	*ErrorMsg
	Code BadMatchCode
	Data []byte
}

type IBadMatchErrorMsg interface {
	IErrorMsg
	GetCode() BadMatchCode
	GetData() []byte
}

func (self *BadMatchErrorMsg) GetCode() BadMatchCode {
	return self.Code
}

func (self *BadMatchErrorMsg) SetCode(v BadMatchCode) {
	self.Code = v
}

func (self *BadMatchErrorMsg) GetData() []byte {
	return self.Data
}

func (self *BadMatchErrorMsg) SetData(v []byte) {
	self.Data = v
}

func (self *BadMatchErrorMsg) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.ErrorMsg.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint16(uint16(self.Code))
	encoder.Write(self.Data)
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBadMatchErrorMsg(parent *ErrorMsg, decoder *goloxi.Decoder) (*BadMatchErrorMsg, error) {
	_badmatcherrormsg := &BadMatchErrorMsg{ErrorMsg: parent}
	if decoder.Length() < 2 {
		return nil, fmt.Errorf("BadMatchErrorMsg packet too short: %d < 2", decoder.Length())
	}
	_badmatcherrormsg.Code = BadMatchCode(decoder.ReadUint16())
	_badmatcherrormsg.Data = decoder.Read(int(decoder.Length()))
	return _badmatcherrormsg, nil
}

func NewBadMatchErrorMsg() *BadMatchErrorMsg {
	obj := &BadMatchErrorMsg{
		ErrorMsg: NewErrorMsg(4),
	}
	return obj
}

type BadPropertyErrorMsg struct {
	*ErrorMsg
	Code BadPropertyCode
	Data []byte
}

type IBadPropertyErrorMsg interface {
	IErrorMsg
	GetCode() BadPropertyCode
	GetData() []byte
}

func (self *BadPropertyErrorMsg) GetCode() BadPropertyCode {
	return self.Code
}

func (self *BadPropertyErrorMsg) SetCode(v BadPropertyCode) {
	self.Code = v
}

func (self *BadPropertyErrorMsg) GetData() []byte {
	return self.Data
}

func (self *BadPropertyErrorMsg) SetData(v []byte) {
	self.Data = v
}

func (self *BadPropertyErrorMsg) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.ErrorMsg.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint16(uint16(self.Code))
	encoder.Write(self.Data)
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBadPropertyErrorMsg(parent *ErrorMsg, decoder *goloxi.Decoder) (*BadPropertyErrorMsg, error) {
	_badpropertyerrormsg := &BadPropertyErrorMsg{ErrorMsg: parent}
	if decoder.Length() < 2 {
		return nil, fmt.Errorf("BadPropertyErrorMsg packet too short: %d < 2", decoder.Length())
	}
	_badpropertyerrormsg.Code = BadPropertyCode(decoder.ReadUint16())
	_badpropertyerrormsg.Data = decoder.Read(int(decoder.Length()))
	return _badpropertyerrormsg, nil
}

func NewBadPropertyErrorMsg() *BadPropertyErrorMsg {
	obj := &BadPropertyErrorMsg{
		ErrorMsg: NewErrorMsg(14),
	}
	return obj
}

type BadRequestErrorMsg struct {
	*ErrorMsg
	Code BadRequestCode
	Data []byte
}

type IBadRequestErrorMsg interface {
	IErrorMsg
	GetCode() BadRequestCode
	GetData() []byte
}

func (self *BadRequestErrorMsg) GetCode() BadRequestCode {
	return self.Code
}

func (self *BadRequestErrorMsg) SetCode(v BadRequestCode) {
	self.Code = v
}

func (self *BadRequestErrorMsg) GetData() []byte {
	return self.Data
}

func (self *BadRequestErrorMsg) SetData(v []byte) {
	self.Data = v
}

func (self *BadRequestErrorMsg) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.ErrorMsg.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint16(uint16(self.Code))
	encoder.Write(self.Data)
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBadRequestErrorMsg(parent *ErrorMsg, decoder *goloxi.Decoder) (*BadRequestErrorMsg, error) {
	_badrequesterrormsg := &BadRequestErrorMsg{ErrorMsg: parent}
	if decoder.Length() < 2 {
		return nil, fmt.Errorf("BadRequestErrorMsg packet too short: %d < 2", decoder.Length())
	}
	_badrequesterrormsg.Code = BadRequestCode(decoder.ReadUint16())
	_badrequesterrormsg.Data = decoder.Read(int(decoder.Length()))
	return _badrequesterrormsg, nil
}

func NewBadRequestErrorMsg() *BadRequestErrorMsg {
	obj := &BadRequestErrorMsg{
		ErrorMsg: NewErrorMsg(1),
	}
	return obj
}

type BarrierReply struct {
	*Header
}

type IBarrierReply interface {
	IHeader
}

func (self *BarrierReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.Header.Serialize(encoder); err != nil {
		return err
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBarrierReply(parent *Header, decoder *goloxi.Decoder) (*BarrierReply, error) {
	_barrierreply := &BarrierReply{Header: parent}
	return _barrierreply, nil
}

func NewBarrierReply() *BarrierReply {
	obj := &BarrierReply{
		Header: NewHeader(21),
	}
	return obj
}

type BarrierRequest struct {
	*Header
}

type IBarrierRequest interface {
	IHeader
}

func (self *BarrierRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.Header.Serialize(encoder); err != nil {
		return err
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBarrierRequest(parent *Header, decoder *goloxi.Decoder) (*BarrierRequest, error) {
	_barrierrequest := &BarrierRequest{Header: parent}
	return _barrierrequest, nil
}

func NewBarrierRequest() *BarrierRequest {
	obj := &BarrierRequest{
		Header: NewHeader(20),
	}
	return obj
}

type Experimenter struct {
	*Header
	Experimenter uint32
	Subtype      uint32
}

type IExperimenter interface {
	IHeader
	GetExperimenter() uint32
	GetSubtype() uint32
}

func (self *Experimenter) GetExperimenter() uint32 {
	return self.Experimenter
}

func (self *Experimenter) SetExperimenter(v uint32) {
	self.Experimenter = v
}

func (self *Experimenter) GetSubtype() uint32 {
	return self.Subtype
}

func (self *Experimenter) SetSubtype(v uint32) {
	self.Subtype = v
}

func (self *Experimenter) Serialize(encoder *goloxi.Encoder) error {
	if err := self.Header.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint32(uint32(self.Experimenter))
	encoder.PutUint32(uint32(self.Subtype))

	return nil
}

func DecodeExperimenter(parent *Header, decoder *goloxi.Decoder) (IExperimenter, error) {
	_experimenter := &Experimenter{Header: parent}
	if decoder.Length() < 8 {
		return nil, fmt.Errorf("Experimenter packet too short: %d < 8", decoder.Length())
	}
	_experimenter.Experimenter = uint32(decoder.ReadUint32())
	_experimenter.Subtype = uint32(decoder.ReadUint32())

	switch _experimenter.Experimenter {
	case 8992:
		return DecodeNiciraHeader(_experimenter, decoder)
	case 6035143:
		return DecodeBsnHeader(_experimenter, decoder)
	default:
		return nil, fmt.Errorf("Invalid type '%d' for 'Experimenter'", _experimenter.Experimenter)
	}
}

func NewExperimenter(_experimenter uint32) *Experimenter {
	obj := &Experimenter{
		Header: NewHeader(4),
	}
	obj.Experimenter = _experimenter
	return obj
}

type BsnHeader struct {
	*Experimenter
}

type IBsnHeader interface {
	IExperimenter
}

func (self *BsnHeader) Serialize(encoder *goloxi.Encoder) error {
	if err := self.Experimenter.Serialize(encoder); err != nil {
		return err
	}

	return nil
}

func DecodeBsnHeader(parent *Experimenter, decoder *goloxi.Decoder) (IBsnHeader, error) {
	_bsnheader := &BsnHeader{Experimenter: parent}

	switch _bsnheader.Subtype {
	case 3:
		return DecodeBsnSetMirroring(_bsnheader, decoder)
	case 4:
		return DecodeBsnGetMirroringRequest(_bsnheader, decoder)
	case 5:
		return DecodeBsnGetMirroringReply(_bsnheader, decoder)
	case 9:
		return DecodeBsnGetInterfacesRequest(_bsnheader, decoder)
	case 10:
		return DecodeBsnGetInterfacesReply(_bsnheader, decoder)
	case 11:
		return DecodeBsnSetPktinSuppressionRequest(_bsnheader, decoder)
	case 15:
		return DecodeBsnVirtualPortCreateRequest(_bsnheader, decoder)
	case 16:
		return DecodeBsnVirtualPortCreateReply(_bsnheader, decoder)
	case 17:
		return DecodeBsnVirtualPortRemoveRequest(_bsnheader, decoder)
	case 18:
		return DecodeBsnBwEnableSetRequest(_bsnheader, decoder)
	case 19:
		return DecodeBsnBwEnableGetRequest(_bsnheader, decoder)
	case 20:
		return DecodeBsnBwEnableGetReply(_bsnheader, decoder)
	case 21:
		return DecodeBsnBwClearDataRequest(_bsnheader, decoder)
	case 22:
		return DecodeBsnBwClearDataReply(_bsnheader, decoder)
	case 23:
		return DecodeBsnBwEnableSetReply(_bsnheader, decoder)
	case 25:
		return DecodeBsnSetPktinSuppressionReply(_bsnheader, decoder)
	case 26:
		return DecodeBsnVirtualPortRemoveReply(_bsnheader, decoder)
	case 31:
		return DecodeBsnPduTxRequest(_bsnheader, decoder)
	case 32:
		return DecodeBsnPduTxReply(_bsnheader, decoder)
	case 33:
		return DecodeBsnPduRxRequest(_bsnheader, decoder)
	case 34:
		return DecodeBsnPduRxReply(_bsnheader, decoder)
	case 35:
		return DecodeBsnPduRxTimeout(_bsnheader, decoder)
	case 36:
		return DecodeBsnFlowIdleEnableSetRequest(_bsnheader, decoder)
	case 37:
		return DecodeBsnFlowIdleEnableSetReply(_bsnheader, decoder)
	case 38:
		return DecodeBsnFlowIdleEnableGetRequest(_bsnheader, decoder)
	case 39:
		return DecodeBsnFlowIdleEnableGetReply(_bsnheader, decoder)
	case 40:
		return DecodeBsnFlowIdle(_bsnheader, decoder)
	case 41:
		return DecodeBsnSetLacpRequest(_bsnheader, decoder)
	case 42:
		return DecodeBsnSetLacpReply(_bsnheader, decoder)
	case 43:
		return DecodeBsnLacpConvergenceNotif(_bsnheader, decoder)
	case 44:
		return DecodeBsnTimeRequest(_bsnheader, decoder)
	case 45:
		return DecodeBsnTimeReply(_bsnheader, decoder)
	case 46:
		return DecodeBsnGentableEntryAdd(_bsnheader, decoder)
	case 47:
		return DecodeBsnGentableEntryDelete(_bsnheader, decoder)
	case 48:
		return DecodeBsnGentableClearRequest(_bsnheader, decoder)
	case 49:
		return DecodeBsnGentableClearReply(_bsnheader, decoder)
	case 50:
		return DecodeBsnGentableSetBucketsSize(_bsnheader, decoder)
	case 51:
		return DecodeBsnGetSwitchPipelineRequest(_bsnheader, decoder)
	case 52:
		return DecodeBsnGetSwitchPipelineReply(_bsnheader, decoder)
	case 53:
		return DecodeBsnSetSwitchPipelineRequest(_bsnheader, decoder)
	case 54:
		return DecodeBsnSetSwitchPipelineReply(_bsnheader, decoder)
	case 56:
		return DecodeBsnControllerConnectionsRequest(_bsnheader, decoder)
	case 57:
		return DecodeBsnControllerConnectionsReply(_bsnheader, decoder)
	case 58:
		return DecodeBsnSetAuxCxnsRequest(_bsnheader, decoder)
	case 59:
		return DecodeBsnSetAuxCxnsReply(_bsnheader, decoder)
	case 60:
		return DecodeBsnArpIdle(_bsnheader, decoder)
	case 61:
		return DecodeBsnTableSetBucketsSize(_bsnheader, decoder)
	case 63:
		return DecodeBsnLog(_bsnheader, decoder)
	case 64:
		return DecodeBsnLuaUpload(_bsnheader, decoder)
	case 65:
		return DecodeBsnLuaCommandRequest(_bsnheader, decoder)
	case 66:
		return DecodeBsnLuaCommandReply(_bsnheader, decoder)
	case 67:
		return DecodeBsnLuaNotification(_bsnheader, decoder)
	case 68:
		return DecodeBsnGenericAsync(_bsnheader, decoder)
	case 69:
		return DecodeBsnTakeover(_bsnheader, decoder)
	case 70:
		return DecodeBsnVlanCounterClear(_bsnheader, decoder)
	case 71:
		return DecodeBsnGenericCommand(_bsnheader, decoder)
	default:
		return nil, fmt.Errorf("Invalid type '%d' for 'BsnHeader'", _bsnheader.Subtype)
	}
}

func NewBsnHeader(_subtype uint32) *BsnHeader {
	obj := &BsnHeader{
		Experimenter: NewExperimenter(6035143),
	}
	obj.Subtype = _subtype
	return obj
}

type BsnArpIdle struct {
	*BsnHeader
	VlanVid  uint16
	Ipv4Addr net.IP
}

type IBsnArpIdle interface {
	IBsnHeader
	GetVlanVid() uint16
	GetIpv4Addr() net.IP
}

func (self *BsnArpIdle) GetVlanVid() uint16 {
	return self.VlanVid
}

func (self *BsnArpIdle) SetVlanVid(v uint16) {
	self.VlanVid = v
}

func (self *BsnArpIdle) GetIpv4Addr() net.IP {
	return self.Ipv4Addr
}

func (self *BsnArpIdle) SetIpv4Addr(v net.IP) {
	self.Ipv4Addr = v
}

func (self *BsnArpIdle) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint16(uint16(self.VlanVid))
	encoder.Write(bytes.Repeat([]byte{0}, 2))
	encoder.Write(self.Ipv4Addr.To4())
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnArpIdle(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnArpIdle, error) {
	_bsnarpidle := &BsnArpIdle{BsnHeader: parent}
	if decoder.Length() < 8 {
		return nil, fmt.Errorf("BsnArpIdle packet too short: %d < 8", decoder.Length())
	}
	_bsnarpidle.VlanVid = uint16(decoder.ReadUint16())
	decoder.Skip(2)
	_bsnarpidle.Ipv4Addr = net.IP(decoder.Read(4))
	return _bsnarpidle, nil
}

func NewBsnArpIdle() *BsnArpIdle {
	obj := &BsnArpIdle{
		BsnHeader: NewBsnHeader(60),
	}
	return obj
}

type ExperimenterErrorMsg struct {
	*ErrorMsg
	Subtype      uint16
	Experimenter uint32
}

type IExperimenterErrorMsg interface {
	IErrorMsg
	GetSubtype() uint16
	GetExperimenter() uint32
}

func (self *ExperimenterErrorMsg) GetSubtype() uint16 {
	return self.Subtype
}

func (self *ExperimenterErrorMsg) SetSubtype(v uint16) {
	self.Subtype = v
}

func (self *ExperimenterErrorMsg) GetExperimenter() uint32 {
	return self.Experimenter
}

func (self *ExperimenterErrorMsg) SetExperimenter(v uint32) {
	self.Experimenter = v
}

func (self *ExperimenterErrorMsg) Serialize(encoder *goloxi.Encoder) error {
	if err := self.ErrorMsg.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint16(uint16(self.Subtype))
	encoder.PutUint32(uint32(self.Experimenter))

	return nil
}

func DecodeExperimenterErrorMsg(parent *ErrorMsg, decoder *goloxi.Decoder) (IExperimenterErrorMsg, error) {
	_experimentererrormsg := &ExperimenterErrorMsg{ErrorMsg: parent}
	if decoder.Length() < 6 {
		return nil, fmt.Errorf("ExperimenterErrorMsg packet too short: %d < 6", decoder.Length())
	}
	_experimentererrormsg.Subtype = uint16(decoder.ReadUint16())
	_experimentererrormsg.Experimenter = uint32(decoder.ReadUint32())

	switch _experimentererrormsg.Experimenter {
	case 6035143:
		return DecodeBsnBaseError(_experimentererrormsg, decoder)
	default:
		return nil, fmt.Errorf("Invalid type '%d' for 'ExperimenterErrorMsg'", _experimentererrormsg.Experimenter)
	}
}

func NewExperimenterErrorMsg(_experimenter uint32) *ExperimenterErrorMsg {
	obj := &ExperimenterErrorMsg{
		ErrorMsg: NewErrorMsg(65535),
	}
	obj.Experimenter = _experimenter
	return obj
}

type BsnBaseError struct {
	*ExperimenterErrorMsg
	ErrMsg string
}

type IBsnBaseError interface {
	IExperimenterErrorMsg
	GetErrMsg() string
}

func (self *BsnBaseError) GetErrMsg() string {
	return self.ErrMsg
}

func (self *BsnBaseError) SetErrMsg(v string) {
	self.ErrMsg = v
}

func (self *BsnBaseError) Serialize(encoder *goloxi.Encoder) error {
	if err := self.ExperimenterErrorMsg.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write([]byte(self.ErrMsg))

	return nil
}

func DecodeBsnBaseError(parent *ExperimenterErrorMsg, decoder *goloxi.Decoder) (IBsnBaseError, error) {
	_bsnbaseerror := &BsnBaseError{ExperimenterErrorMsg: parent}
	if decoder.Length() < 256 {
		return nil, fmt.Errorf("BsnBaseError packet too short: %d < 256", decoder.Length())
	}
	_bsnbaseerror.ErrMsg = string(bytes.Trim(decoder.Read(256), "\x00"))

	switch _bsnbaseerror.Subtype {
	case 1:
		return DecodeBsnError(_bsnbaseerror, decoder)
	case 2:
		return DecodeBsnGentableError(_bsnbaseerror, decoder)
	default:
		return nil, fmt.Errorf("Invalid type '%d' for 'BsnBaseError'", _bsnbaseerror.Subtype)
	}
}

func NewBsnBaseError(_subtype uint16) *BsnBaseError {
	obj := &BsnBaseError{
		ExperimenterErrorMsg: NewExperimenterErrorMsg(6035143),
	}
	obj.Subtype = _subtype
	return obj
}

type BsnBwClearDataReply struct {
	*BsnHeader
	Status uint32
}

type IBsnBwClearDataReply interface {
	IBsnHeader
	GetStatus() uint32
}

func (self *BsnBwClearDataReply) GetStatus() uint32 {
	return self.Status
}

func (self *BsnBwClearDataReply) SetStatus(v uint32) {
	self.Status = v
}

func (self *BsnBwClearDataReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint32(uint32(self.Status))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnBwClearDataReply(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnBwClearDataReply, error) {
	_bsnbwcleardatareply := &BsnBwClearDataReply{BsnHeader: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("BsnBwClearDataReply packet too short: %d < 4", decoder.Length())
	}
	_bsnbwcleardatareply.Status = uint32(decoder.ReadUint32())
	return _bsnbwcleardatareply, nil
}

func NewBsnBwClearDataReply() *BsnBwClearDataReply {
	obj := &BsnBwClearDataReply{
		BsnHeader: NewBsnHeader(22),
	}
	return obj
}

type BsnBwClearDataRequest struct {
	*BsnHeader
}

type IBsnBwClearDataRequest interface {
	IBsnHeader
}

func (self *BsnBwClearDataRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnBwClearDataRequest(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnBwClearDataRequest, error) {
	_bsnbwcleardatarequest := &BsnBwClearDataRequest{BsnHeader: parent}
	return _bsnbwcleardatarequest, nil
}

func NewBsnBwClearDataRequest() *BsnBwClearDataRequest {
	obj := &BsnBwClearDataRequest{
		BsnHeader: NewBsnHeader(21),
	}
	return obj
}

type BsnBwEnableGetReply struct {
	*BsnHeader
	Enabled uint32
}

type IBsnBwEnableGetReply interface {
	IBsnHeader
	GetEnabled() uint32
}

func (self *BsnBwEnableGetReply) GetEnabled() uint32 {
	return self.Enabled
}

func (self *BsnBwEnableGetReply) SetEnabled(v uint32) {
	self.Enabled = v
}

func (self *BsnBwEnableGetReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint32(uint32(self.Enabled))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnBwEnableGetReply(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnBwEnableGetReply, error) {
	_bsnbwenablegetreply := &BsnBwEnableGetReply{BsnHeader: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("BsnBwEnableGetReply packet too short: %d < 4", decoder.Length())
	}
	_bsnbwenablegetreply.Enabled = uint32(decoder.ReadUint32())
	return _bsnbwenablegetreply, nil
}

func NewBsnBwEnableGetReply() *BsnBwEnableGetReply {
	obj := &BsnBwEnableGetReply{
		BsnHeader: NewBsnHeader(20),
	}
	return obj
}

type BsnBwEnableGetRequest struct {
	*BsnHeader
}

type IBsnBwEnableGetRequest interface {
	IBsnHeader
}

func (self *BsnBwEnableGetRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnBwEnableGetRequest(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnBwEnableGetRequest, error) {
	_bsnbwenablegetrequest := &BsnBwEnableGetRequest{BsnHeader: parent}
	return _bsnbwenablegetrequest, nil
}

func NewBsnBwEnableGetRequest() *BsnBwEnableGetRequest {
	obj := &BsnBwEnableGetRequest{
		BsnHeader: NewBsnHeader(19),
	}
	return obj
}

type BsnBwEnableSetReply struct {
	*BsnHeader
	Enable uint32
	Status uint32
}

type IBsnBwEnableSetReply interface {
	IBsnHeader
	GetEnable() uint32
	GetStatus() uint32
}

func (self *BsnBwEnableSetReply) GetEnable() uint32 {
	return self.Enable
}

func (self *BsnBwEnableSetReply) SetEnable(v uint32) {
	self.Enable = v
}

func (self *BsnBwEnableSetReply) GetStatus() uint32 {
	return self.Status
}

func (self *BsnBwEnableSetReply) SetStatus(v uint32) {
	self.Status = v
}

func (self *BsnBwEnableSetReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint32(uint32(self.Enable))
	encoder.PutUint32(uint32(self.Status))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnBwEnableSetReply(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnBwEnableSetReply, error) {
	_bsnbwenablesetreply := &BsnBwEnableSetReply{BsnHeader: parent}
	if decoder.Length() < 8 {
		return nil, fmt.Errorf("BsnBwEnableSetReply packet too short: %d < 8", decoder.Length())
	}
	_bsnbwenablesetreply.Enable = uint32(decoder.ReadUint32())
	_bsnbwenablesetreply.Status = uint32(decoder.ReadUint32())
	return _bsnbwenablesetreply, nil
}

func NewBsnBwEnableSetReply() *BsnBwEnableSetReply {
	obj := &BsnBwEnableSetReply{
		BsnHeader: NewBsnHeader(23),
	}
	return obj
}

type BsnBwEnableSetRequest struct {
	*BsnHeader
	Enable uint32
}

type IBsnBwEnableSetRequest interface {
	IBsnHeader
	GetEnable() uint32
}

func (self *BsnBwEnableSetRequest) GetEnable() uint32 {
	return self.Enable
}

func (self *BsnBwEnableSetRequest) SetEnable(v uint32) {
	self.Enable = v
}

func (self *BsnBwEnableSetRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint32(uint32(self.Enable))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnBwEnableSetRequest(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnBwEnableSetRequest, error) {
	_bsnbwenablesetrequest := &BsnBwEnableSetRequest{BsnHeader: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("BsnBwEnableSetRequest packet too short: %d < 4", decoder.Length())
	}
	_bsnbwenablesetrequest.Enable = uint32(decoder.ReadUint32())
	return _bsnbwenablesetrequest, nil
}

func NewBsnBwEnableSetRequest() *BsnBwEnableSetRequest {
	obj := &BsnBwEnableSetRequest{
		BsnHeader: NewBsnHeader(18),
	}
	return obj
}

type BsnControllerConnectionsReply struct {
	*BsnHeader
	Connections []*BsnControllerConnection
}

type IBsnControllerConnectionsReply interface {
	IBsnHeader
	GetConnections() []*BsnControllerConnection
}

func (self *BsnControllerConnectionsReply) GetConnections() []*BsnControllerConnection {
	return self.Connections
}

func (self *BsnControllerConnectionsReply) SetConnections(v []*BsnControllerConnection) {
	self.Connections = v
}

func (self *BsnControllerConnectionsReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	for _, obj := range self.Connections {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnControllerConnectionsReply(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnControllerConnectionsReply, error) {
	_bsncontrollerconnectionsreply := &BsnControllerConnectionsReply{BsnHeader: parent}

	for decoder.Length() >= 264 {
		item, err := DecodeBsnControllerConnection(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_bsncontrollerconnectionsreply.Connections = append(_bsncontrollerconnectionsreply.Connections, item)
		}
	}
	return _bsncontrollerconnectionsreply, nil
}

func NewBsnControllerConnectionsReply() *BsnControllerConnectionsReply {
	obj := &BsnControllerConnectionsReply{
		BsnHeader: NewBsnHeader(57),
	}
	return obj
}

type BsnControllerConnectionsRequest struct {
	*BsnHeader
}

type IBsnControllerConnectionsRequest interface {
	IBsnHeader
}

func (self *BsnControllerConnectionsRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnControllerConnectionsRequest(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnControllerConnectionsRequest, error) {
	_bsncontrollerconnectionsrequest := &BsnControllerConnectionsRequest{BsnHeader: parent}
	return _bsncontrollerconnectionsrequest, nil
}

func NewBsnControllerConnectionsRequest() *BsnControllerConnectionsRequest {
	obj := &BsnControllerConnectionsRequest{
		BsnHeader: NewBsnHeader(56),
	}
	return obj
}

type ExperimenterStatsReply struct {
	*StatsReply
	Experimenter uint32
	Subtype      uint32
}

type IExperimenterStatsReply interface {
	IStatsReply
	GetExperimenter() uint32
	GetSubtype() uint32
}

func (self *ExperimenterStatsReply) GetExperimenter() uint32 {
	return self.Experimenter
}

func (self *ExperimenterStatsReply) SetExperimenter(v uint32) {
	self.Experimenter = v
}

func (self *ExperimenterStatsReply) GetSubtype() uint32 {
	return self.Subtype
}

func (self *ExperimenterStatsReply) SetSubtype(v uint32) {
	self.Subtype = v
}

func (self *ExperimenterStatsReply) Serialize(encoder *goloxi.Encoder) error {
	if err := self.StatsReply.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	encoder.PutUint32(uint32(self.Experimenter))
	encoder.PutUint32(uint32(self.Subtype))

	return nil
}

func DecodeExperimenterStatsReply(parent *StatsReply, decoder *goloxi.Decoder) (IExperimenterStatsReply, error) {
	_experimenterstatsreply := &ExperimenterStatsReply{StatsReply: parent}
	if decoder.Length() < 12 {
		return nil, fmt.Errorf("ExperimenterStatsReply packet too short: %d < 12", decoder.Length())
	}
	decoder.Skip(4)
	_experimenterstatsreply.Experimenter = uint32(decoder.ReadUint32())
	_experimenterstatsreply.Subtype = uint32(decoder.ReadUint32())

	switch _experimenterstatsreply.Experimenter {
	case 8992:
		return DecodeNiciraStatsReply(_experimenterstatsreply, decoder)
	case 6035143:
		return DecodeBsnStatsReply(_experimenterstatsreply, decoder)
	default:
		return nil, fmt.Errorf("Invalid type '%d' for 'ExperimenterStatsReply'", _experimenterstatsreply.Experimenter)
	}
}

func NewExperimenterStatsReply(_experimenter uint32) *ExperimenterStatsReply {
	obj := &ExperimenterStatsReply{
		StatsReply: NewStatsReply(65535),
	}
	obj.Experimenter = _experimenter
	return obj
}

type BsnStatsReply struct {
	*ExperimenterStatsReply
}

type IBsnStatsReply interface {
	IExperimenterStatsReply
}

func (self *BsnStatsReply) Serialize(encoder *goloxi.Encoder) error {
	if err := self.ExperimenterStatsReply.Serialize(encoder); err != nil {
		return err
	}

	return nil
}

func DecodeBsnStatsReply(parent *ExperimenterStatsReply, decoder *goloxi.Decoder) (IBsnStatsReply, error) {
	_bsnstatsreply := &BsnStatsReply{ExperimenterStatsReply: parent}

	switch _bsnstatsreply.Subtype {
	case 1:
		return DecodeBsnLacpStatsReply(_bsnstatsreply, decoder)
	case 2:
		return DecodeBsnGentableEntryDescStatsReply(_bsnstatsreply, decoder)
	case 3:
		return DecodeBsnGentableEntryStatsReply(_bsnstatsreply, decoder)
	case 4:
		return DecodeBsnGentableDescStatsReply(_bsnstatsreply, decoder)
	case 5:
		return DecodeBsnGentableBucketStatsReply(_bsnstatsreply, decoder)
	case 6:
		return DecodeBsnSwitchPipelineStatsReply(_bsnstatsreply, decoder)
	case 7:
		return DecodeBsnGentableStatsReply(_bsnstatsreply, decoder)
	case 8:
		return DecodeBsnPortCounterStatsReply(_bsnstatsreply, decoder)
	case 9:
		return DecodeBsnVlanCounterStatsReply(_bsnstatsreply, decoder)
	case 10:
		return DecodeBsnFlowChecksumBucketStatsReply(_bsnstatsreply, decoder)
	case 11:
		return DecodeBsnTableChecksumStatsReply(_bsnstatsreply, decoder)
	case 12:
		return DecodeBsnDebugCounterStatsReply(_bsnstatsreply, decoder)
	case 13:
		return DecodeBsnDebugCounterDescStatsReply(_bsnstatsreply, decoder)
	case 14:
		return DecodeBsnImageDescStatsReply(_bsnstatsreply, decoder)
	case 15:
		return DecodeBsnVrfCounterStatsReply(_bsnstatsreply, decoder)
	case 16:
		return DecodeBsnGenericStatsReply(_bsnstatsreply, decoder)
	default:
		return nil, fmt.Errorf("Invalid type '%d' for 'BsnStatsReply'", _bsnstatsreply.Subtype)
	}
}

func NewBsnStatsReply(_subtype uint32) *BsnStatsReply {
	obj := &BsnStatsReply{
		ExperimenterStatsReply: NewExperimenterStatsReply(6035143),
	}
	obj.Subtype = _subtype
	return obj
}

type BsnDebugCounterDescStatsReply struct {
	*BsnStatsReply
	Entries []*BsnDebugCounterDescStatsEntry
}

type IBsnDebugCounterDescStatsReply interface {
	IBsnStatsReply
	GetEntries() []*BsnDebugCounterDescStatsEntry
}

func (self *BsnDebugCounterDescStatsReply) GetEntries() []*BsnDebugCounterDescStatsEntry {
	return self.Entries
}

func (self *BsnDebugCounterDescStatsReply) SetEntries(v []*BsnDebugCounterDescStatsEntry) {
	self.Entries = v
}

func (self *BsnDebugCounterDescStatsReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnStatsReply.Serialize(encoder); err != nil {
		return err
	}

	for _, obj := range self.Entries {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnDebugCounterDescStatsReply(parent *BsnStatsReply, decoder *goloxi.Decoder) (*BsnDebugCounterDescStatsReply, error) {
	_bsndebugcounterdescstatsreply := &BsnDebugCounterDescStatsReply{BsnStatsReply: parent}

	for decoder.Length() >= 328 {
		item, err := DecodeBsnDebugCounterDescStatsEntry(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_bsndebugcounterdescstatsreply.Entries = append(_bsndebugcounterdescstatsreply.Entries, item)
		}
	}
	return _bsndebugcounterdescstatsreply, nil
}

func NewBsnDebugCounterDescStatsReply() *BsnDebugCounterDescStatsReply {
	obj := &BsnDebugCounterDescStatsReply{
		BsnStatsReply: NewBsnStatsReply(13),
	}
	return obj
}

type ExperimenterStatsRequest struct {
	*StatsRequest
	Experimenter uint32
	Subtype      uint32
}

type IExperimenterStatsRequest interface {
	IStatsRequest
	GetExperimenter() uint32
	GetSubtype() uint32
}

func (self *ExperimenterStatsRequest) GetExperimenter() uint32 {
	return self.Experimenter
}

func (self *ExperimenterStatsRequest) SetExperimenter(v uint32) {
	self.Experimenter = v
}

func (self *ExperimenterStatsRequest) GetSubtype() uint32 {
	return self.Subtype
}

func (self *ExperimenterStatsRequest) SetSubtype(v uint32) {
	self.Subtype = v
}

func (self *ExperimenterStatsRequest) Serialize(encoder *goloxi.Encoder) error {
	if err := self.StatsRequest.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	encoder.PutUint32(uint32(self.Experimenter))
	encoder.PutUint32(uint32(self.Subtype))

	return nil
}

func DecodeExperimenterStatsRequest(parent *StatsRequest, decoder *goloxi.Decoder) (IExperimenterStatsRequest, error) {
	_experimenterstatsrequest := &ExperimenterStatsRequest{StatsRequest: parent}
	if decoder.Length() < 12 {
		return nil, fmt.Errorf("ExperimenterStatsRequest packet too short: %d < 12", decoder.Length())
	}
	decoder.Skip(4)
	_experimenterstatsrequest.Experimenter = uint32(decoder.ReadUint32())
	_experimenterstatsrequest.Subtype = uint32(decoder.ReadUint32())

	switch _experimenterstatsrequest.Experimenter {
	case 8992:
		return DecodeNiciraFlowStatsRequest(_experimenterstatsrequest, decoder)
	case 6035143:
		return DecodeBsnStatsRequest(_experimenterstatsrequest, decoder)
	default:
		return nil, fmt.Errorf("Invalid type '%d' for 'ExperimenterStatsRequest'", _experimenterstatsrequest.Experimenter)
	}
}

func NewExperimenterStatsRequest(_experimenter uint32) *ExperimenterStatsRequest {
	obj := &ExperimenterStatsRequest{
		StatsRequest: NewStatsRequest(65535),
	}
	obj.Experimenter = _experimenter
	return obj
}

type BsnStatsRequest struct {
	*ExperimenterStatsRequest
}

type IBsnStatsRequest interface {
	IExperimenterStatsRequest
}

func (self *BsnStatsRequest) Serialize(encoder *goloxi.Encoder) error {
	if err := self.ExperimenterStatsRequest.Serialize(encoder); err != nil {
		return err
	}

	return nil
}

func DecodeBsnStatsRequest(parent *ExperimenterStatsRequest, decoder *goloxi.Decoder) (IBsnStatsRequest, error) {
	_bsnstatsrequest := &BsnStatsRequest{ExperimenterStatsRequest: parent}

	switch _bsnstatsrequest.Subtype {
	case 1:
		return DecodeBsnLacpStatsRequest(_bsnstatsrequest, decoder)
	case 2:
		return DecodeBsnGentableEntryDescStatsRequest(_bsnstatsrequest, decoder)
	case 3:
		return DecodeBsnGentableEntryStatsRequest(_bsnstatsrequest, decoder)
	case 4:
		return DecodeBsnGentableDescStatsRequest(_bsnstatsrequest, decoder)
	case 5:
		return DecodeBsnGentableBucketStatsRequest(_bsnstatsrequest, decoder)
	case 6:
		return DecodeBsnSwitchPipelineStatsRequest(_bsnstatsrequest, decoder)
	case 7:
		return DecodeBsnGentableStatsRequest(_bsnstatsrequest, decoder)
	case 8:
		return DecodeBsnPortCounterStatsRequest(_bsnstatsrequest, decoder)
	case 9:
		return DecodeBsnVlanCounterStatsRequest(_bsnstatsrequest, decoder)
	case 10:
		return DecodeBsnFlowChecksumBucketStatsRequest(_bsnstatsrequest, decoder)
	case 11:
		return DecodeBsnTableChecksumStatsRequest(_bsnstatsrequest, decoder)
	case 12:
		return DecodeBsnDebugCounterStatsRequest(_bsnstatsrequest, decoder)
	case 13:
		return DecodeBsnDebugCounterDescStatsRequest(_bsnstatsrequest, decoder)
	case 14:
		return DecodeBsnImageDescStatsRequest(_bsnstatsrequest, decoder)
	case 15:
		return DecodeBsnVrfCounterStatsRequest(_bsnstatsrequest, decoder)
	case 16:
		return DecodeBsnGenericStatsRequest(_bsnstatsrequest, decoder)
	default:
		return nil, fmt.Errorf("Invalid type '%d' for 'BsnStatsRequest'", _bsnstatsrequest.Subtype)
	}
}

func NewBsnStatsRequest(_subtype uint32) *BsnStatsRequest {
	obj := &BsnStatsRequest{
		ExperimenterStatsRequest: NewExperimenterStatsRequest(6035143),
	}
	obj.Subtype = _subtype
	return obj
}

type BsnDebugCounterDescStatsRequest struct {
	*BsnStatsRequest
}

type IBsnDebugCounterDescStatsRequest interface {
	IBsnStatsRequest
}

func (self *BsnDebugCounterDescStatsRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnStatsRequest.Serialize(encoder); err != nil {
		return err
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnDebugCounterDescStatsRequest(parent *BsnStatsRequest, decoder *goloxi.Decoder) (*BsnDebugCounterDescStatsRequest, error) {
	_bsndebugcounterdescstatsrequest := &BsnDebugCounterDescStatsRequest{BsnStatsRequest: parent}
	return _bsndebugcounterdescstatsrequest, nil
}

func NewBsnDebugCounterDescStatsRequest() *BsnDebugCounterDescStatsRequest {
	obj := &BsnDebugCounterDescStatsRequest{
		BsnStatsRequest: NewBsnStatsRequest(13),
	}
	return obj
}

type BsnDebugCounterStatsReply struct {
	*BsnStatsReply
	Entries []*BsnDebugCounterStatsEntry
}

type IBsnDebugCounterStatsReply interface {
	IBsnStatsReply
	GetEntries() []*BsnDebugCounterStatsEntry
}

func (self *BsnDebugCounterStatsReply) GetEntries() []*BsnDebugCounterStatsEntry {
	return self.Entries
}

func (self *BsnDebugCounterStatsReply) SetEntries(v []*BsnDebugCounterStatsEntry) {
	self.Entries = v
}

func (self *BsnDebugCounterStatsReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnStatsReply.Serialize(encoder); err != nil {
		return err
	}

	for _, obj := range self.Entries {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnDebugCounterStatsReply(parent *BsnStatsReply, decoder *goloxi.Decoder) (*BsnDebugCounterStatsReply, error) {
	_bsndebugcounterstatsreply := &BsnDebugCounterStatsReply{BsnStatsReply: parent}

	for decoder.Length() >= 16 {
		item, err := DecodeBsnDebugCounterStatsEntry(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_bsndebugcounterstatsreply.Entries = append(_bsndebugcounterstatsreply.Entries, item)
		}
	}
	return _bsndebugcounterstatsreply, nil
}

func NewBsnDebugCounterStatsReply() *BsnDebugCounterStatsReply {
	obj := &BsnDebugCounterStatsReply{
		BsnStatsReply: NewBsnStatsReply(12),
	}
	return obj
}

type BsnDebugCounterStatsRequest struct {
	*BsnStatsRequest
}

type IBsnDebugCounterStatsRequest interface {
	IBsnStatsRequest
}

func (self *BsnDebugCounterStatsRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnStatsRequest.Serialize(encoder); err != nil {
		return err
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnDebugCounterStatsRequest(parent *BsnStatsRequest, decoder *goloxi.Decoder) (*BsnDebugCounterStatsRequest, error) {
	_bsndebugcounterstatsrequest := &BsnDebugCounterStatsRequest{BsnStatsRequest: parent}
	return _bsndebugcounterstatsrequest, nil
}

func NewBsnDebugCounterStatsRequest() *BsnDebugCounterStatsRequest {
	obj := &BsnDebugCounterStatsRequest{
		BsnStatsRequest: NewBsnStatsRequest(12),
	}
	return obj
}

type BsnError struct {
	*BsnBaseError
}

type IBsnError interface {
	IBsnBaseError
}

func (self *BsnError) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnBaseError.Serialize(encoder); err != nil {
		return err
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnError(parent *BsnBaseError, decoder *goloxi.Decoder) (*BsnError, error) {
	_bsnerror := &BsnError{BsnBaseError: parent}
	return _bsnerror, nil
}

func NewBsnError() *BsnError {
	obj := &BsnError{
		BsnBaseError: NewBsnBaseError(1),
	}
	return obj
}

type BsnFlowChecksumBucketStatsReply struct {
	*BsnStatsReply
	Entries []*BsnFlowChecksumBucketStatsEntry
}

type IBsnFlowChecksumBucketStatsReply interface {
	IBsnStatsReply
	GetEntries() []*BsnFlowChecksumBucketStatsEntry
}

func (self *BsnFlowChecksumBucketStatsReply) GetEntries() []*BsnFlowChecksumBucketStatsEntry {
	return self.Entries
}

func (self *BsnFlowChecksumBucketStatsReply) SetEntries(v []*BsnFlowChecksumBucketStatsEntry) {
	self.Entries = v
}

func (self *BsnFlowChecksumBucketStatsReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnStatsReply.Serialize(encoder); err != nil {
		return err
	}

	for _, obj := range self.Entries {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnFlowChecksumBucketStatsReply(parent *BsnStatsReply, decoder *goloxi.Decoder) (*BsnFlowChecksumBucketStatsReply, error) {
	_bsnflowchecksumbucketstatsreply := &BsnFlowChecksumBucketStatsReply{BsnStatsReply: parent}

	for decoder.Length() >= 8 {
		item, err := DecodeBsnFlowChecksumBucketStatsEntry(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_bsnflowchecksumbucketstatsreply.Entries = append(_bsnflowchecksumbucketstatsreply.Entries, item)
		}
	}
	return _bsnflowchecksumbucketstatsreply, nil
}

func NewBsnFlowChecksumBucketStatsReply() *BsnFlowChecksumBucketStatsReply {
	obj := &BsnFlowChecksumBucketStatsReply{
		BsnStatsReply: NewBsnStatsReply(10),
	}
	return obj
}

type BsnFlowChecksumBucketStatsRequest struct {
	*BsnStatsRequest
	TableId uint8
}

type IBsnFlowChecksumBucketStatsRequest interface {
	IBsnStatsRequest
	GetTableId() uint8
}

func (self *BsnFlowChecksumBucketStatsRequest) GetTableId() uint8 {
	return self.TableId
}

func (self *BsnFlowChecksumBucketStatsRequest) SetTableId(v uint8) {
	self.TableId = v
}

func (self *BsnFlowChecksumBucketStatsRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnStatsRequest.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint8(uint8(self.TableId))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnFlowChecksumBucketStatsRequest(parent *BsnStatsRequest, decoder *goloxi.Decoder) (*BsnFlowChecksumBucketStatsRequest, error) {
	_bsnflowchecksumbucketstatsrequest := &BsnFlowChecksumBucketStatsRequest{BsnStatsRequest: parent}
	if decoder.Length() < 1 {
		return nil, fmt.Errorf("BsnFlowChecksumBucketStatsRequest packet too short: %d < 1", decoder.Length())
	}
	_bsnflowchecksumbucketstatsrequest.TableId = uint8(decoder.ReadByte())
	return _bsnflowchecksumbucketstatsrequest, nil
}

func NewBsnFlowChecksumBucketStatsRequest() *BsnFlowChecksumBucketStatsRequest {
	obj := &BsnFlowChecksumBucketStatsRequest{
		BsnStatsRequest: NewBsnStatsRequest(10),
	}
	return obj
}

type BsnFlowIdle struct {
	*BsnHeader
	Cookie   uint64
	Priority uint16
	TableId  uint8
	Match    Match
}

type IBsnFlowIdle interface {
	IBsnHeader
	GetCookie() uint64
	GetPriority() uint16
	GetTableId() uint8
	GetMatch() Match
}

func (self *BsnFlowIdle) GetCookie() uint64 {
	return self.Cookie
}

func (self *BsnFlowIdle) SetCookie(v uint64) {
	self.Cookie = v
}

func (self *BsnFlowIdle) GetPriority() uint16 {
	return self.Priority
}

func (self *BsnFlowIdle) SetPriority(v uint16) {
	self.Priority = v
}

func (self *BsnFlowIdle) GetTableId() uint8 {
	return self.TableId
}

func (self *BsnFlowIdle) SetTableId(v uint8) {
	self.TableId = v
}

func (self *BsnFlowIdle) GetMatch() Match {
	return self.Match
}

func (self *BsnFlowIdle) SetMatch(v Match) {
	self.Match = v
}

func (self *BsnFlowIdle) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint64(uint64(self.Cookie))
	encoder.PutUint16(uint16(self.Priority))
	encoder.PutUint8(uint8(self.TableId))
	encoder.Write(bytes.Repeat([]byte{0}, 5))
	if err := self.Match.Serialize(encoder); err != nil {
		return err
	}

	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnFlowIdle(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnFlowIdle, error) {
	_bsnflowidle := &BsnFlowIdle{BsnHeader: parent}
	if decoder.Length() < 24 {
		return nil, fmt.Errorf("BsnFlowIdle packet too short: %d < 24", decoder.Length())
	}
	_bsnflowidle.Cookie = uint64(decoder.ReadUint64())
	_bsnflowidle.Priority = uint16(decoder.ReadUint16())
	_bsnflowidle.TableId = uint8(decoder.ReadByte())
	decoder.Skip(5)
	if err := _bsnflowidle.Match.Decode(decoder); err != nil {
		return nil, err
	}

	decoder.SkipAlign()
	return _bsnflowidle, nil
}

func NewBsnFlowIdle() *BsnFlowIdle {
	obj := &BsnFlowIdle{
		BsnHeader: NewBsnHeader(40),
	}
	return obj
}

type BsnFlowIdleEnableGetReply struct {
	*BsnHeader
	Enabled uint32
}

type IBsnFlowIdleEnableGetReply interface {
	IBsnHeader
	GetEnabled() uint32
}

func (self *BsnFlowIdleEnableGetReply) GetEnabled() uint32 {
	return self.Enabled
}

func (self *BsnFlowIdleEnableGetReply) SetEnabled(v uint32) {
	self.Enabled = v
}

func (self *BsnFlowIdleEnableGetReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint32(uint32(self.Enabled))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnFlowIdleEnableGetReply(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnFlowIdleEnableGetReply, error) {
	_bsnflowidleenablegetreply := &BsnFlowIdleEnableGetReply{BsnHeader: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("BsnFlowIdleEnableGetReply packet too short: %d < 4", decoder.Length())
	}
	_bsnflowidleenablegetreply.Enabled = uint32(decoder.ReadUint32())
	return _bsnflowidleenablegetreply, nil
}

func NewBsnFlowIdleEnableGetReply() *BsnFlowIdleEnableGetReply {
	obj := &BsnFlowIdleEnableGetReply{
		BsnHeader: NewBsnHeader(39),
	}
	return obj
}

type BsnFlowIdleEnableGetRequest struct {
	*BsnHeader
}

type IBsnFlowIdleEnableGetRequest interface {
	IBsnHeader
}

func (self *BsnFlowIdleEnableGetRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnFlowIdleEnableGetRequest(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnFlowIdleEnableGetRequest, error) {
	_bsnflowidleenablegetrequest := &BsnFlowIdleEnableGetRequest{BsnHeader: parent}
	return _bsnflowidleenablegetrequest, nil
}

func NewBsnFlowIdleEnableGetRequest() *BsnFlowIdleEnableGetRequest {
	obj := &BsnFlowIdleEnableGetRequest{
		BsnHeader: NewBsnHeader(38),
	}
	return obj
}

type BsnFlowIdleEnableSetReply struct {
	*BsnHeader
	Enable uint32
	Status uint32
}

type IBsnFlowIdleEnableSetReply interface {
	IBsnHeader
	GetEnable() uint32
	GetStatus() uint32
}

func (self *BsnFlowIdleEnableSetReply) GetEnable() uint32 {
	return self.Enable
}

func (self *BsnFlowIdleEnableSetReply) SetEnable(v uint32) {
	self.Enable = v
}

func (self *BsnFlowIdleEnableSetReply) GetStatus() uint32 {
	return self.Status
}

func (self *BsnFlowIdleEnableSetReply) SetStatus(v uint32) {
	self.Status = v
}

func (self *BsnFlowIdleEnableSetReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint32(uint32(self.Enable))
	encoder.PutUint32(uint32(self.Status))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnFlowIdleEnableSetReply(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnFlowIdleEnableSetReply, error) {
	_bsnflowidleenablesetreply := &BsnFlowIdleEnableSetReply{BsnHeader: parent}
	if decoder.Length() < 8 {
		return nil, fmt.Errorf("BsnFlowIdleEnableSetReply packet too short: %d < 8", decoder.Length())
	}
	_bsnflowidleenablesetreply.Enable = uint32(decoder.ReadUint32())
	_bsnflowidleenablesetreply.Status = uint32(decoder.ReadUint32())
	return _bsnflowidleenablesetreply, nil
}

func NewBsnFlowIdleEnableSetReply() *BsnFlowIdleEnableSetReply {
	obj := &BsnFlowIdleEnableSetReply{
		BsnHeader: NewBsnHeader(37),
	}
	return obj
}

type BsnFlowIdleEnableSetRequest struct {
	*BsnHeader
	Enable uint32
}

type IBsnFlowIdleEnableSetRequest interface {
	IBsnHeader
	GetEnable() uint32
}

func (self *BsnFlowIdleEnableSetRequest) GetEnable() uint32 {
	return self.Enable
}

func (self *BsnFlowIdleEnableSetRequest) SetEnable(v uint32) {
	self.Enable = v
}

func (self *BsnFlowIdleEnableSetRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint32(uint32(self.Enable))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnFlowIdleEnableSetRequest(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnFlowIdleEnableSetRequest, error) {
	_bsnflowidleenablesetrequest := &BsnFlowIdleEnableSetRequest{BsnHeader: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("BsnFlowIdleEnableSetRequest packet too short: %d < 4", decoder.Length())
	}
	_bsnflowidleenablesetrequest.Enable = uint32(decoder.ReadUint32())
	return _bsnflowidleenablesetrequest, nil
}

func NewBsnFlowIdleEnableSetRequest() *BsnFlowIdleEnableSetRequest {
	obj := &BsnFlowIdleEnableSetRequest{
		BsnHeader: NewBsnHeader(36),
	}
	return obj
}

type BsnGenericAsync struct {
	*BsnHeader
	Name string
	Tlvs []IBsnTlv
}

type IBsnGenericAsync interface {
	IBsnHeader
	GetName() string
	GetTlvs() []IBsnTlv
}

func (self *BsnGenericAsync) GetName() string {
	return self.Name
}

func (self *BsnGenericAsync) SetName(v string) {
	self.Name = v
}

func (self *BsnGenericAsync) GetTlvs() []IBsnTlv {
	return self.Tlvs
}

func (self *BsnGenericAsync) SetTlvs(v []IBsnTlv) {
	self.Tlvs = v
}

func (self *BsnGenericAsync) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write([]byte(self.Name))
	for _, obj := range self.Tlvs {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnGenericAsync(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnGenericAsync, error) {
	_bsngenericasync := &BsnGenericAsync{BsnHeader: parent}
	if decoder.Length() < 64 {
		return nil, fmt.Errorf("BsnGenericAsync packet too short: %d < 64", decoder.Length())
	}
	_bsngenericasync.Name = string(bytes.Trim(decoder.Read(64), "\x00"))

	for decoder.Length() >= 4 {
		item, err := DecodeBsnTlv(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_bsngenericasync.Tlvs = append(_bsngenericasync.Tlvs, item)
		}
	}
	return _bsngenericasync, nil
}

func NewBsnGenericAsync() *BsnGenericAsync {
	obj := &BsnGenericAsync{
		BsnHeader: NewBsnHeader(68),
	}
	return obj
}

type BsnGenericCommand struct {
	*BsnHeader
	Name string
	Tlvs []IBsnTlv
}

type IBsnGenericCommand interface {
	IBsnHeader
	GetName() string
	GetTlvs() []IBsnTlv
}

func (self *BsnGenericCommand) GetName() string {
	return self.Name
}

func (self *BsnGenericCommand) SetName(v string) {
	self.Name = v
}

func (self *BsnGenericCommand) GetTlvs() []IBsnTlv {
	return self.Tlvs
}

func (self *BsnGenericCommand) SetTlvs(v []IBsnTlv) {
	self.Tlvs = v
}

func (self *BsnGenericCommand) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write([]byte(self.Name))
	for _, obj := range self.Tlvs {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnGenericCommand(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnGenericCommand, error) {
	_bsngenericcommand := &BsnGenericCommand{BsnHeader: parent}
	if decoder.Length() < 64 {
		return nil, fmt.Errorf("BsnGenericCommand packet too short: %d < 64", decoder.Length())
	}
	_bsngenericcommand.Name = string(bytes.Trim(decoder.Read(64), "\x00"))

	for decoder.Length() >= 4 {
		item, err := DecodeBsnTlv(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_bsngenericcommand.Tlvs = append(_bsngenericcommand.Tlvs, item)
		}
	}
	return _bsngenericcommand, nil
}

func NewBsnGenericCommand() *BsnGenericCommand {
	obj := &BsnGenericCommand{
		BsnHeader: NewBsnHeader(71),
	}
	return obj
}

type BsnGenericStatsReply struct {
	*BsnStatsReply
	Entries []*BsnGenericStatsEntry
}

type IBsnGenericStatsReply interface {
	IBsnStatsReply
	GetEntries() []*BsnGenericStatsEntry
}

func (self *BsnGenericStatsReply) GetEntries() []*BsnGenericStatsEntry {
	return self.Entries
}

func (self *BsnGenericStatsReply) SetEntries(v []*BsnGenericStatsEntry) {
	self.Entries = v
}

func (self *BsnGenericStatsReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnStatsReply.Serialize(encoder); err != nil {
		return err
	}

	for _, obj := range self.Entries {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnGenericStatsReply(parent *BsnStatsReply, decoder *goloxi.Decoder) (*BsnGenericStatsReply, error) {
	_bsngenericstatsreply := &BsnGenericStatsReply{BsnStatsReply: parent}

	for decoder.Length() >= 2 {
		item, err := DecodeBsnGenericStatsEntry(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_bsngenericstatsreply.Entries = append(_bsngenericstatsreply.Entries, item)
		}
	}
	return _bsngenericstatsreply, nil
}

func NewBsnGenericStatsReply() *BsnGenericStatsReply {
	obj := &BsnGenericStatsReply{
		BsnStatsReply: NewBsnStatsReply(16),
	}
	return obj
}

type BsnGenericStatsRequest struct {
	*BsnStatsRequest
	Name string
	Tlvs []IBsnTlv
}

type IBsnGenericStatsRequest interface {
	IBsnStatsRequest
	GetName() string
	GetTlvs() []IBsnTlv
}

func (self *BsnGenericStatsRequest) GetName() string {
	return self.Name
}

func (self *BsnGenericStatsRequest) SetName(v string) {
	self.Name = v
}

func (self *BsnGenericStatsRequest) GetTlvs() []IBsnTlv {
	return self.Tlvs
}

func (self *BsnGenericStatsRequest) SetTlvs(v []IBsnTlv) {
	self.Tlvs = v
}

func (self *BsnGenericStatsRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnStatsRequest.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write([]byte(self.Name))
	for _, obj := range self.Tlvs {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnGenericStatsRequest(parent *BsnStatsRequest, decoder *goloxi.Decoder) (*BsnGenericStatsRequest, error) {
	_bsngenericstatsrequest := &BsnGenericStatsRequest{BsnStatsRequest: parent}
	if decoder.Length() < 64 {
		return nil, fmt.Errorf("BsnGenericStatsRequest packet too short: %d < 64", decoder.Length())
	}
	_bsngenericstatsrequest.Name = string(bytes.Trim(decoder.Read(64), "\x00"))

	for decoder.Length() >= 4 {
		item, err := DecodeBsnTlv(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_bsngenericstatsrequest.Tlvs = append(_bsngenericstatsrequest.Tlvs, item)
		}
	}
	return _bsngenericstatsrequest, nil
}

func NewBsnGenericStatsRequest() *BsnGenericStatsRequest {
	obj := &BsnGenericStatsRequest{
		BsnStatsRequest: NewBsnStatsRequest(16),
	}
	return obj
}

type BsnGentableBucketStatsReply struct {
	*BsnStatsReply
	Entries []*BsnGentableBucketStatsEntry
}

type IBsnGentableBucketStatsReply interface {
	IBsnStatsReply
	GetEntries() []*BsnGentableBucketStatsEntry
}

func (self *BsnGentableBucketStatsReply) GetEntries() []*BsnGentableBucketStatsEntry {
	return self.Entries
}

func (self *BsnGentableBucketStatsReply) SetEntries(v []*BsnGentableBucketStatsEntry) {
	self.Entries = v
}

func (self *BsnGentableBucketStatsReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnStatsReply.Serialize(encoder); err != nil {
		return err
	}

	for _, obj := range self.Entries {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnGentableBucketStatsReply(parent *BsnStatsReply, decoder *goloxi.Decoder) (*BsnGentableBucketStatsReply, error) {
	_bsngentablebucketstatsreply := &BsnGentableBucketStatsReply{BsnStatsReply: parent}

	for decoder.Length() >= 16 {
		item, err := DecodeBsnGentableBucketStatsEntry(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_bsngentablebucketstatsreply.Entries = append(_bsngentablebucketstatsreply.Entries, item)
		}
	}
	return _bsngentablebucketstatsreply, nil
}

func NewBsnGentableBucketStatsReply() *BsnGentableBucketStatsReply {
	obj := &BsnGentableBucketStatsReply{
		BsnStatsReply: NewBsnStatsReply(5),
	}
	return obj
}

type BsnGentableBucketStatsRequest struct {
	*BsnStatsRequest
	TableId uint16
}

type IBsnGentableBucketStatsRequest interface {
	IBsnStatsRequest
	GetTableId() uint16
}

func (self *BsnGentableBucketStatsRequest) GetTableId() uint16 {
	return self.TableId
}

func (self *BsnGentableBucketStatsRequest) SetTableId(v uint16) {
	self.TableId = v
}

func (self *BsnGentableBucketStatsRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnStatsRequest.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint16(uint16(self.TableId))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnGentableBucketStatsRequest(parent *BsnStatsRequest, decoder *goloxi.Decoder) (*BsnGentableBucketStatsRequest, error) {
	_bsngentablebucketstatsrequest := &BsnGentableBucketStatsRequest{BsnStatsRequest: parent}
	if decoder.Length() < 2 {
		return nil, fmt.Errorf("BsnGentableBucketStatsRequest packet too short: %d < 2", decoder.Length())
	}
	_bsngentablebucketstatsrequest.TableId = uint16(decoder.ReadUint16())
	return _bsngentablebucketstatsrequest, nil
}

func NewBsnGentableBucketStatsRequest() *BsnGentableBucketStatsRequest {
	obj := &BsnGentableBucketStatsRequest{
		BsnStatsRequest: NewBsnStatsRequest(5),
	}
	return obj
}

type BsnGentableClearReply struct {
	*BsnHeader
	TableId      uint16
	DeletedCount uint32
	ErrorCount   uint32
}

type IBsnGentableClearReply interface {
	IBsnHeader
	GetTableId() uint16
	GetDeletedCount() uint32
	GetErrorCount() uint32
}

func (self *BsnGentableClearReply) GetTableId() uint16 {
	return self.TableId
}

func (self *BsnGentableClearReply) SetTableId(v uint16) {
	self.TableId = v
}

func (self *BsnGentableClearReply) GetDeletedCount() uint32 {
	return self.DeletedCount
}

func (self *BsnGentableClearReply) SetDeletedCount(v uint32) {
	self.DeletedCount = v
}

func (self *BsnGentableClearReply) GetErrorCount() uint32 {
	return self.ErrorCount
}

func (self *BsnGentableClearReply) SetErrorCount(v uint32) {
	self.ErrorCount = v
}

func (self *BsnGentableClearReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint16(uint16(self.TableId))
	encoder.Write(bytes.Repeat([]byte{0}, 2))
	encoder.PutUint32(uint32(self.DeletedCount))
	encoder.PutUint32(uint32(self.ErrorCount))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnGentableClearReply(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnGentableClearReply, error) {
	_bsngentableclearreply := &BsnGentableClearReply{BsnHeader: parent}
	if decoder.Length() < 12 {
		return nil, fmt.Errorf("BsnGentableClearReply packet too short: %d < 12", decoder.Length())
	}
	_bsngentableclearreply.TableId = uint16(decoder.ReadUint16())
	decoder.Skip(2)
	_bsngentableclearreply.DeletedCount = uint32(decoder.ReadUint32())
	_bsngentableclearreply.ErrorCount = uint32(decoder.ReadUint32())
	return _bsngentableclearreply, nil
}

func NewBsnGentableClearReply() *BsnGentableClearReply {
	obj := &BsnGentableClearReply{
		BsnHeader: NewBsnHeader(49),
	}
	return obj
}

type BsnGentableClearRequest struct {
	*BsnHeader
	TableId      uint16
	Checksum     Checksum128
	ChecksumMask Checksum128
}

type IBsnGentableClearRequest interface {
	IBsnHeader
	GetTableId() uint16
	GetChecksum() Checksum128
	GetChecksumMask() Checksum128
}

func (self *BsnGentableClearRequest) GetTableId() uint16 {
	return self.TableId
}

func (self *BsnGentableClearRequest) SetTableId(v uint16) {
	self.TableId = v
}

func (self *BsnGentableClearRequest) GetChecksum() Checksum128 {
	return self.Checksum
}

func (self *BsnGentableClearRequest) SetChecksum(v Checksum128) {
	self.Checksum = v
}

func (self *BsnGentableClearRequest) GetChecksumMask() Checksum128 {
	return self.ChecksumMask
}

func (self *BsnGentableClearRequest) SetChecksumMask(v Checksum128) {
	self.ChecksumMask = v
}

func (self *BsnGentableClearRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint16(uint16(self.TableId))
	encoder.Write(bytes.Repeat([]byte{0}, 2))
	self.Checksum.Serialize(encoder)
	self.ChecksumMask.Serialize(encoder)
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnGentableClearRequest(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnGentableClearRequest, error) {
	_bsngentableclearrequest := &BsnGentableClearRequest{BsnHeader: parent}
	if decoder.Length() < 36 {
		return nil, fmt.Errorf("BsnGentableClearRequest packet too short: %d < 36", decoder.Length())
	}
	_bsngentableclearrequest.TableId = uint16(decoder.ReadUint16())
	decoder.Skip(2)
	_bsngentableclearrequest.Checksum.Decode(decoder)
	_bsngentableclearrequest.ChecksumMask.Decode(decoder)
	return _bsngentableclearrequest, nil
}

func NewBsnGentableClearRequest() *BsnGentableClearRequest {
	obj := &BsnGentableClearRequest{
		BsnHeader: NewBsnHeader(48),
	}
	return obj
}

type BsnGentableDescStatsReply struct {
	*BsnStatsReply
	Entries []*BsnGentableDescStatsEntry
}

type IBsnGentableDescStatsReply interface {
	IBsnStatsReply
	GetEntries() []*BsnGentableDescStatsEntry
}

func (self *BsnGentableDescStatsReply) GetEntries() []*BsnGentableDescStatsEntry {
	return self.Entries
}

func (self *BsnGentableDescStatsReply) SetEntries(v []*BsnGentableDescStatsEntry) {
	self.Entries = v
}

func (self *BsnGentableDescStatsReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnStatsReply.Serialize(encoder); err != nil {
		return err
	}

	for _, obj := range self.Entries {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnGentableDescStatsReply(parent *BsnStatsReply, decoder *goloxi.Decoder) (*BsnGentableDescStatsReply, error) {
	_bsngentabledescstatsreply := &BsnGentableDescStatsReply{BsnStatsReply: parent}

	for decoder.Length() >= 48 {
		item, err := DecodeBsnGentableDescStatsEntry(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_bsngentabledescstatsreply.Entries = append(_bsngentabledescstatsreply.Entries, item)
		}
	}
	return _bsngentabledescstatsreply, nil
}

func NewBsnGentableDescStatsReply() *BsnGentableDescStatsReply {
	obj := &BsnGentableDescStatsReply{
		BsnStatsReply: NewBsnStatsReply(4),
	}
	return obj
}

type BsnGentableDescStatsRequest struct {
	*BsnStatsRequest
}

type IBsnGentableDescStatsRequest interface {
	IBsnStatsRequest
}

func (self *BsnGentableDescStatsRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnStatsRequest.Serialize(encoder); err != nil {
		return err
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnGentableDescStatsRequest(parent *BsnStatsRequest, decoder *goloxi.Decoder) (*BsnGentableDescStatsRequest, error) {
	_bsngentabledescstatsrequest := &BsnGentableDescStatsRequest{BsnStatsRequest: parent}
	return _bsngentabledescstatsrequest, nil
}

func NewBsnGentableDescStatsRequest() *BsnGentableDescStatsRequest {
	obj := &BsnGentableDescStatsRequest{
		BsnStatsRequest: NewBsnStatsRequest(4),
	}
	return obj
}

type BsnGentableEntryAdd struct {
	*BsnHeader
	TableId   uint16
	KeyLength uint16
	Checksum  Checksum128
	Key       []IBsnTlv
	Value     []IBsnTlv
}

type IBsnGentableEntryAdd interface {
	IBsnHeader
	GetTableId() uint16
	GetKeyLength() uint16
	GetChecksum() Checksum128
	GetKey() []IBsnTlv
	GetValue() []IBsnTlv
}

func (self *BsnGentableEntryAdd) GetTableId() uint16 {
	return self.TableId
}

func (self *BsnGentableEntryAdd) SetTableId(v uint16) {
	self.TableId = v
}

func (self *BsnGentableEntryAdd) GetKeyLength() uint16 {
	return self.KeyLength
}

func (self *BsnGentableEntryAdd) SetKeyLength(v uint16) {
	self.KeyLength = v
}

func (self *BsnGentableEntryAdd) GetChecksum() Checksum128 {
	return self.Checksum
}

func (self *BsnGentableEntryAdd) SetChecksum(v Checksum128) {
	self.Checksum = v
}

func (self *BsnGentableEntryAdd) GetKey() []IBsnTlv {
	return self.Key
}

func (self *BsnGentableEntryAdd) SetKey(v []IBsnTlv) {
	self.Key = v
}

func (self *BsnGentableEntryAdd) GetValue() []IBsnTlv {
	return self.Value
}

func (self *BsnGentableEntryAdd) SetValue(v []IBsnTlv) {
	self.Value = v
}

func (self *BsnGentableEntryAdd) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint16(uint16(self.TableId))
	encoder.PutUint16(uint16(self.KeyLength))
	self.Checksum.Serialize(encoder)
	for _, obj := range self.Key {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	for _, obj := range self.Value {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnGentableEntryAdd(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnGentableEntryAdd, error) {
	_bsngentableentryadd := &BsnGentableEntryAdd{BsnHeader: parent}
	if decoder.Length() < 20 {
		return nil, fmt.Errorf("BsnGentableEntryAdd packet too short: %d < 20", decoder.Length())
	}
	_bsngentableentryadd.TableId = uint16(decoder.ReadUint16())
	_bsngentableentryadd.KeyLength = uint16(decoder.ReadUint16())
	_bsngentableentryadd.Checksum.Decode(decoder)

	end := decoder.Offset() + int(_bsngentableentryadd.KeyLength)
	for decoder.Offset() < end {
		item, err := DecodeBsnTlv(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_bsngentableentryadd.Key = append(_bsngentableentryadd.Key, item)
		}
	}

	for decoder.Length() >= 4 {
		item, err := DecodeBsnTlv(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_bsngentableentryadd.Value = append(_bsngentableentryadd.Value, item)
		}
	}
	return _bsngentableentryadd, nil
}

func NewBsnGentableEntryAdd() *BsnGentableEntryAdd {
	obj := &BsnGentableEntryAdd{
		BsnHeader: NewBsnHeader(46),
	}
	return obj
}

type BsnGentableEntryDelete struct {
	*BsnHeader
	TableId uint16
	Key     []IBsnTlv
}

type IBsnGentableEntryDelete interface {
	IBsnHeader
	GetTableId() uint16
	GetKey() []IBsnTlv
}

func (self *BsnGentableEntryDelete) GetTableId() uint16 {
	return self.TableId
}

func (self *BsnGentableEntryDelete) SetTableId(v uint16) {
	self.TableId = v
}

func (self *BsnGentableEntryDelete) GetKey() []IBsnTlv {
	return self.Key
}

func (self *BsnGentableEntryDelete) SetKey(v []IBsnTlv) {
	self.Key = v
}

func (self *BsnGentableEntryDelete) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint16(uint16(self.TableId))
	for _, obj := range self.Key {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnGentableEntryDelete(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnGentableEntryDelete, error) {
	_bsngentableentrydelete := &BsnGentableEntryDelete{BsnHeader: parent}
	if decoder.Length() < 2 {
		return nil, fmt.Errorf("BsnGentableEntryDelete packet too short: %d < 2", decoder.Length())
	}
	_bsngentableentrydelete.TableId = uint16(decoder.ReadUint16())

	for decoder.Length() >= 4 {
		item, err := DecodeBsnTlv(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_bsngentableentrydelete.Key = append(_bsngentableentrydelete.Key, item)
		}
	}
	return _bsngentableentrydelete, nil
}

func NewBsnGentableEntryDelete() *BsnGentableEntryDelete {
	obj := &BsnGentableEntryDelete{
		BsnHeader: NewBsnHeader(47),
	}
	return obj
}

type BsnGentableEntryDescStatsReply struct {
	*BsnStatsReply
	Entries []*BsnGentableEntryDescStatsEntry
}

type IBsnGentableEntryDescStatsReply interface {
	IBsnStatsReply
	GetEntries() []*BsnGentableEntryDescStatsEntry
}

func (self *BsnGentableEntryDescStatsReply) GetEntries() []*BsnGentableEntryDescStatsEntry {
	return self.Entries
}

func (self *BsnGentableEntryDescStatsReply) SetEntries(v []*BsnGentableEntryDescStatsEntry) {
	self.Entries = v
}

func (self *BsnGentableEntryDescStatsReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnStatsReply.Serialize(encoder); err != nil {
		return err
	}

	for _, obj := range self.Entries {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnGentableEntryDescStatsReply(parent *BsnStatsReply, decoder *goloxi.Decoder) (*BsnGentableEntryDescStatsReply, error) {
	_bsngentableentrydescstatsreply := &BsnGentableEntryDescStatsReply{BsnStatsReply: parent}

	for decoder.Length() >= 20 {
		item, err := DecodeBsnGentableEntryDescStatsEntry(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_bsngentableentrydescstatsreply.Entries = append(_bsngentableentrydescstatsreply.Entries, item)
		}
	}
	return _bsngentableentrydescstatsreply, nil
}

func NewBsnGentableEntryDescStatsReply() *BsnGentableEntryDescStatsReply {
	obj := &BsnGentableEntryDescStatsReply{
		BsnStatsReply: NewBsnStatsReply(2),
	}
	return obj
}

type BsnGentableEntryDescStatsRequest struct {
	*BsnStatsRequest
	TableId      uint16
	Checksum     Checksum128
	ChecksumMask Checksum128
}

type IBsnGentableEntryDescStatsRequest interface {
	IBsnStatsRequest
	GetTableId() uint16
	GetChecksum() Checksum128
	GetChecksumMask() Checksum128
}

func (self *BsnGentableEntryDescStatsRequest) GetTableId() uint16 {
	return self.TableId
}

func (self *BsnGentableEntryDescStatsRequest) SetTableId(v uint16) {
	self.TableId = v
}

func (self *BsnGentableEntryDescStatsRequest) GetChecksum() Checksum128 {
	return self.Checksum
}

func (self *BsnGentableEntryDescStatsRequest) SetChecksum(v Checksum128) {
	self.Checksum = v
}

func (self *BsnGentableEntryDescStatsRequest) GetChecksumMask() Checksum128 {
	return self.ChecksumMask
}

func (self *BsnGentableEntryDescStatsRequest) SetChecksumMask(v Checksum128) {
	self.ChecksumMask = v
}

func (self *BsnGentableEntryDescStatsRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnStatsRequest.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint16(uint16(self.TableId))
	encoder.Write(bytes.Repeat([]byte{0}, 2))
	self.Checksum.Serialize(encoder)
	self.ChecksumMask.Serialize(encoder)
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnGentableEntryDescStatsRequest(parent *BsnStatsRequest, decoder *goloxi.Decoder) (*BsnGentableEntryDescStatsRequest, error) {
	_bsngentableentrydescstatsrequest := &BsnGentableEntryDescStatsRequest{BsnStatsRequest: parent}
	if decoder.Length() < 36 {
		return nil, fmt.Errorf("BsnGentableEntryDescStatsRequest packet too short: %d < 36", decoder.Length())
	}
	_bsngentableentrydescstatsrequest.TableId = uint16(decoder.ReadUint16())
	decoder.Skip(2)
	_bsngentableentrydescstatsrequest.Checksum.Decode(decoder)
	_bsngentableentrydescstatsrequest.ChecksumMask.Decode(decoder)
	return _bsngentableentrydescstatsrequest, nil
}

func NewBsnGentableEntryDescStatsRequest() *BsnGentableEntryDescStatsRequest {
	obj := &BsnGentableEntryDescStatsRequest{
		BsnStatsRequest: NewBsnStatsRequest(2),
	}
	return obj
}

type BsnGentableEntryStatsReply struct {
	*BsnStatsReply
	Entries []*BsnGentableEntryStatsEntry
}

type IBsnGentableEntryStatsReply interface {
	IBsnStatsReply
	GetEntries() []*BsnGentableEntryStatsEntry
}

func (self *BsnGentableEntryStatsReply) GetEntries() []*BsnGentableEntryStatsEntry {
	return self.Entries
}

func (self *BsnGentableEntryStatsReply) SetEntries(v []*BsnGentableEntryStatsEntry) {
	self.Entries = v
}

func (self *BsnGentableEntryStatsReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnStatsReply.Serialize(encoder); err != nil {
		return err
	}

	for _, obj := range self.Entries {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnGentableEntryStatsReply(parent *BsnStatsReply, decoder *goloxi.Decoder) (*BsnGentableEntryStatsReply, error) {
	_bsngentableentrystatsreply := &BsnGentableEntryStatsReply{BsnStatsReply: parent}

	for decoder.Length() >= 4 {
		item, err := DecodeBsnGentableEntryStatsEntry(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_bsngentableentrystatsreply.Entries = append(_bsngentableentrystatsreply.Entries, item)
		}
	}
	return _bsngentableentrystatsreply, nil
}

func NewBsnGentableEntryStatsReply() *BsnGentableEntryStatsReply {
	obj := &BsnGentableEntryStatsReply{
		BsnStatsReply: NewBsnStatsReply(3),
	}
	return obj
}

type BsnGentableEntryStatsRequest struct {
	*BsnStatsRequest
	TableId      uint16
	Checksum     Checksum128
	ChecksumMask Checksum128
}

type IBsnGentableEntryStatsRequest interface {
	IBsnStatsRequest
	GetTableId() uint16
	GetChecksum() Checksum128
	GetChecksumMask() Checksum128
}

func (self *BsnGentableEntryStatsRequest) GetTableId() uint16 {
	return self.TableId
}

func (self *BsnGentableEntryStatsRequest) SetTableId(v uint16) {
	self.TableId = v
}

func (self *BsnGentableEntryStatsRequest) GetChecksum() Checksum128 {
	return self.Checksum
}

func (self *BsnGentableEntryStatsRequest) SetChecksum(v Checksum128) {
	self.Checksum = v
}

func (self *BsnGentableEntryStatsRequest) GetChecksumMask() Checksum128 {
	return self.ChecksumMask
}

func (self *BsnGentableEntryStatsRequest) SetChecksumMask(v Checksum128) {
	self.ChecksumMask = v
}

func (self *BsnGentableEntryStatsRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnStatsRequest.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint16(uint16(self.TableId))
	encoder.Write(bytes.Repeat([]byte{0}, 2))
	self.Checksum.Serialize(encoder)
	self.ChecksumMask.Serialize(encoder)
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnGentableEntryStatsRequest(parent *BsnStatsRequest, decoder *goloxi.Decoder) (*BsnGentableEntryStatsRequest, error) {
	_bsngentableentrystatsrequest := &BsnGentableEntryStatsRequest{BsnStatsRequest: parent}
	if decoder.Length() < 36 {
		return nil, fmt.Errorf("BsnGentableEntryStatsRequest packet too short: %d < 36", decoder.Length())
	}
	_bsngentableentrystatsrequest.TableId = uint16(decoder.ReadUint16())
	decoder.Skip(2)
	_bsngentableentrystatsrequest.Checksum.Decode(decoder)
	_bsngentableentrystatsrequest.ChecksumMask.Decode(decoder)
	return _bsngentableentrystatsrequest, nil
}

func NewBsnGentableEntryStatsRequest() *BsnGentableEntryStatsRequest {
	obj := &BsnGentableEntryStatsRequest{
		BsnStatsRequest: NewBsnStatsRequest(3),
	}
	return obj
}

type BsnGentableError struct {
	*BsnBaseError
	ErrorCode BsnGentableErrorCode
	TableId   uint16
}

type IBsnGentableError interface {
	IBsnBaseError
	GetErrorCode() BsnGentableErrorCode
	GetTableId() uint16
}

func (self *BsnGentableError) GetErrorCode() BsnGentableErrorCode {
	return self.ErrorCode
}

func (self *BsnGentableError) SetErrorCode(v BsnGentableErrorCode) {
	self.ErrorCode = v
}

func (self *BsnGentableError) GetTableId() uint16 {
	return self.TableId
}

func (self *BsnGentableError) SetTableId(v uint16) {
	self.TableId = v
}

func (self *BsnGentableError) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnBaseError.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint16(uint16(self.ErrorCode))
	encoder.PutUint16(uint16(self.TableId))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnGentableError(parent *BsnBaseError, decoder *goloxi.Decoder) (*BsnGentableError, error) {
	_bsngentableerror := &BsnGentableError{BsnBaseError: parent}
	if decoder.Length() < 260 {
		return nil, fmt.Errorf("BsnGentableError packet too short: %d < 260", decoder.Length())
	}
	_bsngentableerror.ErrorCode = BsnGentableErrorCode(decoder.ReadUint16())
	_bsngentableerror.TableId = uint16(decoder.ReadUint16())
	return _bsngentableerror, nil
}

func NewBsnGentableError() *BsnGentableError {
	obj := &BsnGentableError{
		BsnBaseError: NewBsnBaseError(2),
	}
	return obj
}

type BsnGentableSetBucketsSize struct {
	*BsnHeader
	TableId     uint16
	BucketsSize uint32
}

type IBsnGentableSetBucketsSize interface {
	IBsnHeader
	GetTableId() uint16
	GetBucketsSize() uint32
}

func (self *BsnGentableSetBucketsSize) GetTableId() uint16 {
	return self.TableId
}

func (self *BsnGentableSetBucketsSize) SetTableId(v uint16) {
	self.TableId = v
}

func (self *BsnGentableSetBucketsSize) GetBucketsSize() uint32 {
	return self.BucketsSize
}

func (self *BsnGentableSetBucketsSize) SetBucketsSize(v uint32) {
	self.BucketsSize = v
}

func (self *BsnGentableSetBucketsSize) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint16(uint16(self.TableId))
	encoder.Write(bytes.Repeat([]byte{0}, 2))
	encoder.PutUint32(uint32(self.BucketsSize))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnGentableSetBucketsSize(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnGentableSetBucketsSize, error) {
	_bsngentablesetbucketssize := &BsnGentableSetBucketsSize{BsnHeader: parent}
	if decoder.Length() < 8 {
		return nil, fmt.Errorf("BsnGentableSetBucketsSize packet too short: %d < 8", decoder.Length())
	}
	_bsngentablesetbucketssize.TableId = uint16(decoder.ReadUint16())
	decoder.Skip(2)
	_bsngentablesetbucketssize.BucketsSize = uint32(decoder.ReadUint32())
	return _bsngentablesetbucketssize, nil
}

func NewBsnGentableSetBucketsSize() *BsnGentableSetBucketsSize {
	obj := &BsnGentableSetBucketsSize{
		BsnHeader: NewBsnHeader(50),
	}
	return obj
}

type BsnGentableStatsReply struct {
	*BsnStatsReply
	Entries []*BsnGentableStatsEntry
}

type IBsnGentableStatsReply interface {
	IBsnStatsReply
	GetEntries() []*BsnGentableStatsEntry
}

func (self *BsnGentableStatsReply) GetEntries() []*BsnGentableStatsEntry {
	return self.Entries
}

func (self *BsnGentableStatsReply) SetEntries(v []*BsnGentableStatsEntry) {
	self.Entries = v
}

func (self *BsnGentableStatsReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnStatsReply.Serialize(encoder); err != nil {
		return err
	}

	for _, obj := range self.Entries {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnGentableStatsReply(parent *BsnStatsReply, decoder *goloxi.Decoder) (*BsnGentableStatsReply, error) {
	_bsngentablestatsreply := &BsnGentableStatsReply{BsnStatsReply: parent}

	for decoder.Length() >= 24 {
		item, err := DecodeBsnGentableStatsEntry(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_bsngentablestatsreply.Entries = append(_bsngentablestatsreply.Entries, item)
		}
	}
	return _bsngentablestatsreply, nil
}

func NewBsnGentableStatsReply() *BsnGentableStatsReply {
	obj := &BsnGentableStatsReply{
		BsnStatsReply: NewBsnStatsReply(7),
	}
	return obj
}

type BsnGentableStatsRequest struct {
	*BsnStatsRequest
}

type IBsnGentableStatsRequest interface {
	IBsnStatsRequest
}

func (self *BsnGentableStatsRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnStatsRequest.Serialize(encoder); err != nil {
		return err
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnGentableStatsRequest(parent *BsnStatsRequest, decoder *goloxi.Decoder) (*BsnGentableStatsRequest, error) {
	_bsngentablestatsrequest := &BsnGentableStatsRequest{BsnStatsRequest: parent}
	return _bsngentablestatsrequest, nil
}

func NewBsnGentableStatsRequest() *BsnGentableStatsRequest {
	obj := &BsnGentableStatsRequest{
		BsnStatsRequest: NewBsnStatsRequest(7),
	}
	return obj
}

type BsnGetInterfacesReply struct {
	*BsnHeader
	Interfaces []*BsnInterface
}

type IBsnGetInterfacesReply interface {
	IBsnHeader
	GetInterfaces() []*BsnInterface
}

func (self *BsnGetInterfacesReply) GetInterfaces() []*BsnInterface {
	return self.Interfaces
}

func (self *BsnGetInterfacesReply) SetInterfaces(v []*BsnInterface) {
	self.Interfaces = v
}

func (self *BsnGetInterfacesReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	for _, obj := range self.Interfaces {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnGetInterfacesReply(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnGetInterfacesReply, error) {
	_bsngetinterfacesreply := &BsnGetInterfacesReply{BsnHeader: parent}

	for decoder.Length() >= 32 {
		item, err := DecodeBsnInterface(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_bsngetinterfacesreply.Interfaces = append(_bsngetinterfacesreply.Interfaces, item)
		}
	}
	return _bsngetinterfacesreply, nil
}

func NewBsnGetInterfacesReply() *BsnGetInterfacesReply {
	obj := &BsnGetInterfacesReply{
		BsnHeader: NewBsnHeader(10),
	}
	return obj
}

type BsnGetInterfacesRequest struct {
	*BsnHeader
}

type IBsnGetInterfacesRequest interface {
	IBsnHeader
}

func (self *BsnGetInterfacesRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnGetInterfacesRequest(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnGetInterfacesRequest, error) {
	_bsngetinterfacesrequest := &BsnGetInterfacesRequest{BsnHeader: parent}
	return _bsngetinterfacesrequest, nil
}

func NewBsnGetInterfacesRequest() *BsnGetInterfacesRequest {
	obj := &BsnGetInterfacesRequest{
		BsnHeader: NewBsnHeader(9),
	}
	return obj
}

type BsnGetMirroringReply struct {
	*BsnHeader
	ReportMirrorPorts uint8
}

type IBsnGetMirroringReply interface {
	IBsnHeader
	GetReportMirrorPorts() uint8
}

func (self *BsnGetMirroringReply) GetReportMirrorPorts() uint8 {
	return self.ReportMirrorPorts
}

func (self *BsnGetMirroringReply) SetReportMirrorPorts(v uint8) {
	self.ReportMirrorPorts = v
}

func (self *BsnGetMirroringReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint8(uint8(self.ReportMirrorPorts))
	encoder.Write(bytes.Repeat([]byte{0}, 3))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnGetMirroringReply(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnGetMirroringReply, error) {
	_bsngetmirroringreply := &BsnGetMirroringReply{BsnHeader: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("BsnGetMirroringReply packet too short: %d < 4", decoder.Length())
	}
	_bsngetmirroringreply.ReportMirrorPorts = uint8(decoder.ReadByte())
	decoder.Skip(3)
	return _bsngetmirroringreply, nil
}

func NewBsnGetMirroringReply() *BsnGetMirroringReply {
	obj := &BsnGetMirroringReply{
		BsnHeader: NewBsnHeader(5),
	}
	return obj
}

type BsnGetMirroringRequest struct {
	*BsnHeader
	ReportMirrorPorts uint8
}

type IBsnGetMirroringRequest interface {
	IBsnHeader
	GetReportMirrorPorts() uint8
}

func (self *BsnGetMirroringRequest) GetReportMirrorPorts() uint8 {
	return self.ReportMirrorPorts
}

func (self *BsnGetMirroringRequest) SetReportMirrorPorts(v uint8) {
	self.ReportMirrorPorts = v
}

func (self *BsnGetMirroringRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint8(uint8(self.ReportMirrorPorts))
	encoder.Write(bytes.Repeat([]byte{0}, 3))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnGetMirroringRequest(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnGetMirroringRequest, error) {
	_bsngetmirroringrequest := &BsnGetMirroringRequest{BsnHeader: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("BsnGetMirroringRequest packet too short: %d < 4", decoder.Length())
	}
	_bsngetmirroringrequest.ReportMirrorPorts = uint8(decoder.ReadByte())
	decoder.Skip(3)
	return _bsngetmirroringrequest, nil
}

func NewBsnGetMirroringRequest() *BsnGetMirroringRequest {
	obj := &BsnGetMirroringRequest{
		BsnHeader: NewBsnHeader(4),
	}
	return obj
}

type BsnGetSwitchPipelineReply struct {
	*BsnHeader
	Pipeline string
}

type IBsnGetSwitchPipelineReply interface {
	IBsnHeader
	GetPipeline() string
}

func (self *BsnGetSwitchPipelineReply) GetPipeline() string {
	return self.Pipeline
}

func (self *BsnGetSwitchPipelineReply) SetPipeline(v string) {
	self.Pipeline = v
}

func (self *BsnGetSwitchPipelineReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write([]byte(self.Pipeline))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnGetSwitchPipelineReply(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnGetSwitchPipelineReply, error) {
	_bsngetswitchpipelinereply := &BsnGetSwitchPipelineReply{BsnHeader: parent}
	if decoder.Length() < 256 {
		return nil, fmt.Errorf("BsnGetSwitchPipelineReply packet too short: %d < 256", decoder.Length())
	}
	_bsngetswitchpipelinereply.Pipeline = string(bytes.Trim(decoder.Read(256), "\x00"))
	return _bsngetswitchpipelinereply, nil
}

func NewBsnGetSwitchPipelineReply() *BsnGetSwitchPipelineReply {
	obj := &BsnGetSwitchPipelineReply{
		BsnHeader: NewBsnHeader(52),
	}
	return obj
}

type BsnGetSwitchPipelineRequest struct {
	*BsnHeader
}

type IBsnGetSwitchPipelineRequest interface {
	IBsnHeader
}

func (self *BsnGetSwitchPipelineRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnGetSwitchPipelineRequest(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnGetSwitchPipelineRequest, error) {
	_bsngetswitchpipelinerequest := &BsnGetSwitchPipelineRequest{BsnHeader: parent}
	return _bsngetswitchpipelinerequest, nil
}

func NewBsnGetSwitchPipelineRequest() *BsnGetSwitchPipelineRequest {
	obj := &BsnGetSwitchPipelineRequest{
		BsnHeader: NewBsnHeader(51),
	}
	return obj
}

type BsnImageDescStatsReply struct {
	*BsnStatsReply
	ImageChecksum         string
	StartupConfigChecksum string
}

type IBsnImageDescStatsReply interface {
	IBsnStatsReply
	GetImageChecksum() string
	GetStartupConfigChecksum() string
}

func (self *BsnImageDescStatsReply) GetImageChecksum() string {
	return self.ImageChecksum
}

func (self *BsnImageDescStatsReply) SetImageChecksum(v string) {
	self.ImageChecksum = v
}

func (self *BsnImageDescStatsReply) GetStartupConfigChecksum() string {
	return self.StartupConfigChecksum
}

func (self *BsnImageDescStatsReply) SetStartupConfigChecksum(v string) {
	self.StartupConfigChecksum = v
}

func (self *BsnImageDescStatsReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnStatsReply.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write([]byte(self.ImageChecksum))
	encoder.Write([]byte(self.StartupConfigChecksum))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnImageDescStatsReply(parent *BsnStatsReply, decoder *goloxi.Decoder) (*BsnImageDescStatsReply, error) {
	_bsnimagedescstatsreply := &BsnImageDescStatsReply{BsnStatsReply: parent}
	if decoder.Length() < 512 {
		return nil, fmt.Errorf("BsnImageDescStatsReply packet too short: %d < 512", decoder.Length())
	}
	_bsnimagedescstatsreply.ImageChecksum = string(bytes.Trim(decoder.Read(256), "\x00"))
	_bsnimagedescstatsreply.StartupConfigChecksum = string(bytes.Trim(decoder.Read(256), "\x00"))
	return _bsnimagedescstatsreply, nil
}

func NewBsnImageDescStatsReply() *BsnImageDescStatsReply {
	obj := &BsnImageDescStatsReply{
		BsnStatsReply: NewBsnStatsReply(14),
	}
	return obj
}

type BsnImageDescStatsRequest struct {
	*BsnStatsRequest
}

type IBsnImageDescStatsRequest interface {
	IBsnStatsRequest
}

func (self *BsnImageDescStatsRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnStatsRequest.Serialize(encoder); err != nil {
		return err
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnImageDescStatsRequest(parent *BsnStatsRequest, decoder *goloxi.Decoder) (*BsnImageDescStatsRequest, error) {
	_bsnimagedescstatsrequest := &BsnImageDescStatsRequest{BsnStatsRequest: parent}
	return _bsnimagedescstatsrequest, nil
}

func NewBsnImageDescStatsRequest() *BsnImageDescStatsRequest {
	obj := &BsnImageDescStatsRequest{
		BsnStatsRequest: NewBsnStatsRequest(14),
	}
	return obj
}

type BsnLacpConvergenceNotif struct {
	*BsnHeader
	ConvergenceStatus   uint8
	PortNo              Port
	ActorSysPriority    uint16
	ActorSysMac         net.HardwareAddr
	ActorPortPriority   uint16
	ActorPortNum        uint16
	ActorKey            uint16
	PartnerSysPriority  uint16
	PartnerSysMac       net.HardwareAddr
	PartnerPortPriority uint16
	PartnerPortNum      uint16
	PartnerKey          uint16
}

type IBsnLacpConvergenceNotif interface {
	IBsnHeader
	GetConvergenceStatus() uint8
	GetPortNo() Port
	GetActorSysPriority() uint16
	GetActorSysMac() net.HardwareAddr
	GetActorPortPriority() uint16
	GetActorPortNum() uint16
	GetActorKey() uint16
	GetPartnerSysPriority() uint16
	GetPartnerSysMac() net.HardwareAddr
	GetPartnerPortPriority() uint16
	GetPartnerPortNum() uint16
	GetPartnerKey() uint16
}

func (self *BsnLacpConvergenceNotif) GetConvergenceStatus() uint8 {
	return self.ConvergenceStatus
}

func (self *BsnLacpConvergenceNotif) SetConvergenceStatus(v uint8) {
	self.ConvergenceStatus = v
}

func (self *BsnLacpConvergenceNotif) GetPortNo() Port {
	return self.PortNo
}

func (self *BsnLacpConvergenceNotif) SetPortNo(v Port) {
	self.PortNo = v
}

func (self *BsnLacpConvergenceNotif) GetActorSysPriority() uint16 {
	return self.ActorSysPriority
}

func (self *BsnLacpConvergenceNotif) SetActorSysPriority(v uint16) {
	self.ActorSysPriority = v
}

func (self *BsnLacpConvergenceNotif) GetActorSysMac() net.HardwareAddr {
	return self.ActorSysMac
}

func (self *BsnLacpConvergenceNotif) SetActorSysMac(v net.HardwareAddr) {
	self.ActorSysMac = v
}

func (self *BsnLacpConvergenceNotif) GetActorPortPriority() uint16 {
	return self.ActorPortPriority
}

func (self *BsnLacpConvergenceNotif) SetActorPortPriority(v uint16) {
	self.ActorPortPriority = v
}

func (self *BsnLacpConvergenceNotif) GetActorPortNum() uint16 {
	return self.ActorPortNum
}

func (self *BsnLacpConvergenceNotif) SetActorPortNum(v uint16) {
	self.ActorPortNum = v
}

func (self *BsnLacpConvergenceNotif) GetActorKey() uint16 {
	return self.ActorKey
}

func (self *BsnLacpConvergenceNotif) SetActorKey(v uint16) {
	self.ActorKey = v
}

func (self *BsnLacpConvergenceNotif) GetPartnerSysPriority() uint16 {
	return self.PartnerSysPriority
}

func (self *BsnLacpConvergenceNotif) SetPartnerSysPriority(v uint16) {
	self.PartnerSysPriority = v
}

func (self *BsnLacpConvergenceNotif) GetPartnerSysMac() net.HardwareAddr {
	return self.PartnerSysMac
}

func (self *BsnLacpConvergenceNotif) SetPartnerSysMac(v net.HardwareAddr) {
	self.PartnerSysMac = v
}

func (self *BsnLacpConvergenceNotif) GetPartnerPortPriority() uint16 {
	return self.PartnerPortPriority
}

func (self *BsnLacpConvergenceNotif) SetPartnerPortPriority(v uint16) {
	self.PartnerPortPriority = v
}

func (self *BsnLacpConvergenceNotif) GetPartnerPortNum() uint16 {
	return self.PartnerPortNum
}

func (self *BsnLacpConvergenceNotif) SetPartnerPortNum(v uint16) {
	self.PartnerPortNum = v
}

func (self *BsnLacpConvergenceNotif) GetPartnerKey() uint16 {
	return self.PartnerKey
}

func (self *BsnLacpConvergenceNotif) SetPartnerKey(v uint16) {
	self.PartnerKey = v
}

func (self *BsnLacpConvergenceNotif) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint8(uint8(self.ConvergenceStatus))
	encoder.Write(bytes.Repeat([]byte{0}, 3))
	self.PortNo.Serialize(encoder)
	encoder.PutUint16(uint16(self.ActorSysPriority))
	encoder.Write(self.ActorSysMac)
	encoder.PutUint16(uint16(self.ActorPortPriority))
	encoder.PutUint16(uint16(self.ActorPortNum))
	encoder.PutUint16(uint16(self.ActorKey))
	encoder.PutUint16(uint16(self.PartnerSysPriority))
	encoder.Write(self.PartnerSysMac)
	encoder.PutUint16(uint16(self.PartnerPortPriority))
	encoder.PutUint16(uint16(self.PartnerPortNum))
	encoder.PutUint16(uint16(self.PartnerKey))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnLacpConvergenceNotif(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnLacpConvergenceNotif, error) {
	_bsnlacpconvergencenotif := &BsnLacpConvergenceNotif{BsnHeader: parent}
	if decoder.Length() < 36 {
		return nil, fmt.Errorf("BsnLacpConvergenceNotif packet too short: %d < 36", decoder.Length())
	}
	_bsnlacpconvergencenotif.ConvergenceStatus = uint8(decoder.ReadByte())
	decoder.Skip(3)
	_bsnlacpconvergencenotif.PortNo.Decode(decoder)
	_bsnlacpconvergencenotif.ActorSysPriority = uint16(decoder.ReadUint16())
	_bsnlacpconvergencenotif.ActorSysMac = net.HardwareAddr(decoder.Read(6))
	_bsnlacpconvergencenotif.ActorPortPriority = uint16(decoder.ReadUint16())
	_bsnlacpconvergencenotif.ActorPortNum = uint16(decoder.ReadUint16())
	_bsnlacpconvergencenotif.ActorKey = uint16(decoder.ReadUint16())
	_bsnlacpconvergencenotif.PartnerSysPriority = uint16(decoder.ReadUint16())
	_bsnlacpconvergencenotif.PartnerSysMac = net.HardwareAddr(decoder.Read(6))
	_bsnlacpconvergencenotif.PartnerPortPriority = uint16(decoder.ReadUint16())
	_bsnlacpconvergencenotif.PartnerPortNum = uint16(decoder.ReadUint16())
	_bsnlacpconvergencenotif.PartnerKey = uint16(decoder.ReadUint16())
	return _bsnlacpconvergencenotif, nil
}

func NewBsnLacpConvergenceNotif() *BsnLacpConvergenceNotif {
	obj := &BsnLacpConvergenceNotif{
		BsnHeader: NewBsnHeader(43),
	}
	return obj
}

type BsnLacpStatsReply struct {
	*BsnStatsReply
	Entries []*BsnLacpStatsEntry
}

type IBsnLacpStatsReply interface {
	IBsnStatsReply
	GetEntries() []*BsnLacpStatsEntry
}

func (self *BsnLacpStatsReply) GetEntries() []*BsnLacpStatsEntry {
	return self.Entries
}

func (self *BsnLacpStatsReply) SetEntries(v []*BsnLacpStatsEntry) {
	self.Entries = v
}

func (self *BsnLacpStatsReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnStatsReply.Serialize(encoder); err != nil {
		return err
	}

	for _, obj := range self.Entries {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnLacpStatsReply(parent *BsnStatsReply, decoder *goloxi.Decoder) (*BsnLacpStatsReply, error) {
	_bsnlacpstatsreply := &BsnLacpStatsReply{BsnStatsReply: parent}

	for decoder.Length() >= 36 {
		item, err := DecodeBsnLacpStatsEntry(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_bsnlacpstatsreply.Entries = append(_bsnlacpstatsreply.Entries, item)
		}
	}
	return _bsnlacpstatsreply, nil
}

func NewBsnLacpStatsReply() *BsnLacpStatsReply {
	obj := &BsnLacpStatsReply{
		BsnStatsReply: NewBsnStatsReply(1),
	}
	return obj
}

type BsnLacpStatsRequest struct {
	*BsnStatsRequest
}

type IBsnLacpStatsRequest interface {
	IBsnStatsRequest
}

func (self *BsnLacpStatsRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnStatsRequest.Serialize(encoder); err != nil {
		return err
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnLacpStatsRequest(parent *BsnStatsRequest, decoder *goloxi.Decoder) (*BsnLacpStatsRequest, error) {
	_bsnlacpstatsrequest := &BsnLacpStatsRequest{BsnStatsRequest: parent}
	return _bsnlacpstatsrequest, nil
}

func NewBsnLacpStatsRequest() *BsnLacpStatsRequest {
	obj := &BsnLacpStatsRequest{
		BsnStatsRequest: NewBsnStatsRequest(1),
	}
	return obj
}

type BsnLog struct {
	*BsnHeader
	Loglevel BsnLoglevel
	Data     []byte
}

type IBsnLog interface {
	IBsnHeader
	GetLoglevel() BsnLoglevel
	GetData() []byte
}

func (self *BsnLog) GetLoglevel() BsnLoglevel {
	return self.Loglevel
}

func (self *BsnLog) SetLoglevel(v BsnLoglevel) {
	self.Loglevel = v
}

func (self *BsnLog) GetData() []byte {
	return self.Data
}

func (self *BsnLog) SetData(v []byte) {
	self.Data = v
}

func (self *BsnLog) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint8(uint8(self.Loglevel))
	encoder.Write(self.Data)
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnLog(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnLog, error) {
	_bsnlog := &BsnLog{BsnHeader: parent}
	if decoder.Length() < 1 {
		return nil, fmt.Errorf("BsnLog packet too short: %d < 1", decoder.Length())
	}
	_bsnlog.Loglevel = BsnLoglevel(decoder.ReadByte())
	_bsnlog.Data = decoder.Read(int(decoder.Length()))
	return _bsnlog, nil
}

func NewBsnLog() *BsnLog {
	obj := &BsnLog{
		BsnHeader: NewBsnHeader(63),
	}
	return obj
}

type BsnLuaCommandReply struct {
	*BsnHeader
	Data []byte
}

type IBsnLuaCommandReply interface {
	IBsnHeader
	GetData() []byte
}

func (self *BsnLuaCommandReply) GetData() []byte {
	return self.Data
}

func (self *BsnLuaCommandReply) SetData(v []byte) {
	self.Data = v
}

func (self *BsnLuaCommandReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(self.Data)
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnLuaCommandReply(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnLuaCommandReply, error) {
	_bsnluacommandreply := &BsnLuaCommandReply{BsnHeader: parent}
	_bsnluacommandreply.Data = decoder.Read(int(decoder.Length()))
	return _bsnluacommandreply, nil
}

func NewBsnLuaCommandReply() *BsnLuaCommandReply {
	obj := &BsnLuaCommandReply{
		BsnHeader: NewBsnHeader(66),
	}
	return obj
}

type BsnLuaCommandRequest struct {
	*BsnHeader
	Data []byte
}

type IBsnLuaCommandRequest interface {
	IBsnHeader
	GetData() []byte
}

func (self *BsnLuaCommandRequest) GetData() []byte {
	return self.Data
}

func (self *BsnLuaCommandRequest) SetData(v []byte) {
	self.Data = v
}

func (self *BsnLuaCommandRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(self.Data)
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnLuaCommandRequest(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnLuaCommandRequest, error) {
	_bsnluacommandrequest := &BsnLuaCommandRequest{BsnHeader: parent}
	_bsnluacommandrequest.Data = decoder.Read(int(decoder.Length()))
	return _bsnluacommandrequest, nil
}

func NewBsnLuaCommandRequest() *BsnLuaCommandRequest {
	obj := &BsnLuaCommandRequest{
		BsnHeader: NewBsnHeader(65),
	}
	return obj
}

type BsnLuaNotification struct {
	*BsnHeader
	Data []byte
}

type IBsnLuaNotification interface {
	IBsnHeader
	GetData() []byte
}

func (self *BsnLuaNotification) GetData() []byte {
	return self.Data
}

func (self *BsnLuaNotification) SetData(v []byte) {
	self.Data = v
}

func (self *BsnLuaNotification) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(self.Data)
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnLuaNotification(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnLuaNotification, error) {
	_bsnluanotification := &BsnLuaNotification{BsnHeader: parent}
	_bsnluanotification.Data = decoder.Read(int(decoder.Length()))
	return _bsnluanotification, nil
}

func NewBsnLuaNotification() *BsnLuaNotification {
	obj := &BsnLuaNotification{
		BsnHeader: NewBsnHeader(67),
	}
	return obj
}

type BsnLuaUpload struct {
	*BsnHeader
	Flags    BsnLuaUploadFlags
	Filename string
	Data     []byte
}

type IBsnLuaUpload interface {
	IBsnHeader
	GetFlags() BsnLuaUploadFlags
	GetFilename() string
	GetData() []byte
}

func (self *BsnLuaUpload) GetFlags() BsnLuaUploadFlags {
	return self.Flags
}

func (self *BsnLuaUpload) SetFlags(v BsnLuaUploadFlags) {
	self.Flags = v
}

func (self *BsnLuaUpload) GetFilename() string {
	return self.Filename
}

func (self *BsnLuaUpload) SetFilename(v string) {
	self.Filename = v
}

func (self *BsnLuaUpload) GetData() []byte {
	return self.Data
}

func (self *BsnLuaUpload) SetData(v []byte) {
	self.Data = v
}

func (self *BsnLuaUpload) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint16(uint16(self.Flags))
	encoder.Write([]byte(self.Filename))
	encoder.Write(self.Data)
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnLuaUpload(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnLuaUpload, error) {
	_bsnluaupload := &BsnLuaUpload{BsnHeader: parent}
	if decoder.Length() < 66 {
		return nil, fmt.Errorf("BsnLuaUpload packet too short: %d < 66", decoder.Length())
	}
	_bsnluaupload.Flags = BsnLuaUploadFlags(decoder.ReadUint16())
	_bsnluaupload.Filename = string(bytes.Trim(decoder.Read(64), "\x00"))
	_bsnluaupload.Data = decoder.Read(int(decoder.Length()))
	return _bsnluaupload, nil
}

func NewBsnLuaUpload() *BsnLuaUpload {
	obj := &BsnLuaUpload{
		BsnHeader: NewBsnHeader(64),
	}
	return obj
}

type BsnPduRxReply struct {
	*BsnHeader
	Status  uint32
	PortNo  Port
	SlotNum uint8
}

type IBsnPduRxReply interface {
	IBsnHeader
	GetStatus() uint32
	GetPortNo() Port
	GetSlotNum() uint8
}

func (self *BsnPduRxReply) GetStatus() uint32 {
	return self.Status
}

func (self *BsnPduRxReply) SetStatus(v uint32) {
	self.Status = v
}

func (self *BsnPduRxReply) GetPortNo() Port {
	return self.PortNo
}

func (self *BsnPduRxReply) SetPortNo(v Port) {
	self.PortNo = v
}

func (self *BsnPduRxReply) GetSlotNum() uint8 {
	return self.SlotNum
}

func (self *BsnPduRxReply) SetSlotNum(v uint8) {
	self.SlotNum = v
}

func (self *BsnPduRxReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint32(uint32(self.Status))
	self.PortNo.Serialize(encoder)
	encoder.PutUint8(uint8(self.SlotNum))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnPduRxReply(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnPduRxReply, error) {
	_bsnpdurxreply := &BsnPduRxReply{BsnHeader: parent}
	if decoder.Length() < 9 {
		return nil, fmt.Errorf("BsnPduRxReply packet too short: %d < 9", decoder.Length())
	}
	_bsnpdurxreply.Status = uint32(decoder.ReadUint32())
	_bsnpdurxreply.PortNo.Decode(decoder)
	_bsnpdurxreply.SlotNum = uint8(decoder.ReadByte())
	return _bsnpdurxreply, nil
}

func NewBsnPduRxReply() *BsnPduRxReply {
	obj := &BsnPduRxReply{
		BsnHeader: NewBsnHeader(34),
	}
	return obj
}

type BsnPduRxRequest struct {
	*BsnHeader
	TimeoutMs uint32
	PortNo    Port
	SlotNum   uint8
	Data      []byte
}

type IBsnPduRxRequest interface {
	IBsnHeader
	GetTimeoutMs() uint32
	GetPortNo() Port
	GetSlotNum() uint8
	GetData() []byte
}

func (self *BsnPduRxRequest) GetTimeoutMs() uint32 {
	return self.TimeoutMs
}

func (self *BsnPduRxRequest) SetTimeoutMs(v uint32) {
	self.TimeoutMs = v
}

func (self *BsnPduRxRequest) GetPortNo() Port {
	return self.PortNo
}

func (self *BsnPduRxRequest) SetPortNo(v Port) {
	self.PortNo = v
}

func (self *BsnPduRxRequest) GetSlotNum() uint8 {
	return self.SlotNum
}

func (self *BsnPduRxRequest) SetSlotNum(v uint8) {
	self.SlotNum = v
}

func (self *BsnPduRxRequest) GetData() []byte {
	return self.Data
}

func (self *BsnPduRxRequest) SetData(v []byte) {
	self.Data = v
}

func (self *BsnPduRxRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint32(uint32(self.TimeoutMs))
	self.PortNo.Serialize(encoder)
	encoder.PutUint8(uint8(self.SlotNum))
	encoder.Write(bytes.Repeat([]byte{0}, 3))
	encoder.Write(self.Data)
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnPduRxRequest(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnPduRxRequest, error) {
	_bsnpdurxrequest := &BsnPduRxRequest{BsnHeader: parent}
	if decoder.Length() < 12 {
		return nil, fmt.Errorf("BsnPduRxRequest packet too short: %d < 12", decoder.Length())
	}
	_bsnpdurxrequest.TimeoutMs = uint32(decoder.ReadUint32())
	_bsnpdurxrequest.PortNo.Decode(decoder)
	_bsnpdurxrequest.SlotNum = uint8(decoder.ReadByte())
	decoder.Skip(3)
	_bsnpdurxrequest.Data = decoder.Read(int(decoder.Length()))
	return _bsnpdurxrequest, nil
}

func NewBsnPduRxRequest() *BsnPduRxRequest {
	obj := &BsnPduRxRequest{
		BsnHeader: NewBsnHeader(33),
	}
	return obj
}

type BsnPduRxTimeout struct {
	*BsnHeader
	PortNo  Port
	SlotNum uint8
}

type IBsnPduRxTimeout interface {
	IBsnHeader
	GetPortNo() Port
	GetSlotNum() uint8
}

func (self *BsnPduRxTimeout) GetPortNo() Port {
	return self.PortNo
}

func (self *BsnPduRxTimeout) SetPortNo(v Port) {
	self.PortNo = v
}

func (self *BsnPduRxTimeout) GetSlotNum() uint8 {
	return self.SlotNum
}

func (self *BsnPduRxTimeout) SetSlotNum(v uint8) {
	self.SlotNum = v
}

func (self *BsnPduRxTimeout) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	self.PortNo.Serialize(encoder)
	encoder.PutUint8(uint8(self.SlotNum))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnPduRxTimeout(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnPduRxTimeout, error) {
	_bsnpdurxtimeout := &BsnPduRxTimeout{BsnHeader: parent}
	if decoder.Length() < 5 {
		return nil, fmt.Errorf("BsnPduRxTimeout packet too short: %d < 5", decoder.Length())
	}
	_bsnpdurxtimeout.PortNo.Decode(decoder)
	_bsnpdurxtimeout.SlotNum = uint8(decoder.ReadByte())
	return _bsnpdurxtimeout, nil
}

func NewBsnPduRxTimeout() *BsnPduRxTimeout {
	obj := &BsnPduRxTimeout{
		BsnHeader: NewBsnHeader(35),
	}
	return obj
}

type BsnPduTxReply struct {
	*BsnHeader
	Status  uint32
	PortNo  Port
	SlotNum uint8
}

type IBsnPduTxReply interface {
	IBsnHeader
	GetStatus() uint32
	GetPortNo() Port
	GetSlotNum() uint8
}

func (self *BsnPduTxReply) GetStatus() uint32 {
	return self.Status
}

func (self *BsnPduTxReply) SetStatus(v uint32) {
	self.Status = v
}

func (self *BsnPduTxReply) GetPortNo() Port {
	return self.PortNo
}

func (self *BsnPduTxReply) SetPortNo(v Port) {
	self.PortNo = v
}

func (self *BsnPduTxReply) GetSlotNum() uint8 {
	return self.SlotNum
}

func (self *BsnPduTxReply) SetSlotNum(v uint8) {
	self.SlotNum = v
}

func (self *BsnPduTxReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint32(uint32(self.Status))
	self.PortNo.Serialize(encoder)
	encoder.PutUint8(uint8(self.SlotNum))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnPduTxReply(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnPduTxReply, error) {
	_bsnpdutxreply := &BsnPduTxReply{BsnHeader: parent}
	if decoder.Length() < 9 {
		return nil, fmt.Errorf("BsnPduTxReply packet too short: %d < 9", decoder.Length())
	}
	_bsnpdutxreply.Status = uint32(decoder.ReadUint32())
	_bsnpdutxreply.PortNo.Decode(decoder)
	_bsnpdutxreply.SlotNum = uint8(decoder.ReadByte())
	return _bsnpdutxreply, nil
}

func NewBsnPduTxReply() *BsnPduTxReply {
	obj := &BsnPduTxReply{
		BsnHeader: NewBsnHeader(32),
	}
	return obj
}

type BsnPduTxRequest struct {
	*BsnHeader
	TxIntervalMs uint32
	PortNo       Port
	SlotNum      uint8
	Data         []byte
}

type IBsnPduTxRequest interface {
	IBsnHeader
	GetTxIntervalMs() uint32
	GetPortNo() Port
	GetSlotNum() uint8
	GetData() []byte
}

func (self *BsnPduTxRequest) GetTxIntervalMs() uint32 {
	return self.TxIntervalMs
}

func (self *BsnPduTxRequest) SetTxIntervalMs(v uint32) {
	self.TxIntervalMs = v
}

func (self *BsnPduTxRequest) GetPortNo() Port {
	return self.PortNo
}

func (self *BsnPduTxRequest) SetPortNo(v Port) {
	self.PortNo = v
}

func (self *BsnPduTxRequest) GetSlotNum() uint8 {
	return self.SlotNum
}

func (self *BsnPduTxRequest) SetSlotNum(v uint8) {
	self.SlotNum = v
}

func (self *BsnPduTxRequest) GetData() []byte {
	return self.Data
}

func (self *BsnPduTxRequest) SetData(v []byte) {
	self.Data = v
}

func (self *BsnPduTxRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint32(uint32(self.TxIntervalMs))
	self.PortNo.Serialize(encoder)
	encoder.PutUint8(uint8(self.SlotNum))
	encoder.Write(bytes.Repeat([]byte{0}, 3))
	encoder.Write(self.Data)
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnPduTxRequest(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnPduTxRequest, error) {
	_bsnpdutxrequest := &BsnPduTxRequest{BsnHeader: parent}
	if decoder.Length() < 12 {
		return nil, fmt.Errorf("BsnPduTxRequest packet too short: %d < 12", decoder.Length())
	}
	_bsnpdutxrequest.TxIntervalMs = uint32(decoder.ReadUint32())
	_bsnpdutxrequest.PortNo.Decode(decoder)
	_bsnpdutxrequest.SlotNum = uint8(decoder.ReadByte())
	decoder.Skip(3)
	_bsnpdutxrequest.Data = decoder.Read(int(decoder.Length()))
	return _bsnpdutxrequest, nil
}

func NewBsnPduTxRequest() *BsnPduTxRequest {
	obj := &BsnPduTxRequest{
		BsnHeader: NewBsnHeader(31),
	}
	return obj
}

type BsnPortCounterStatsReply struct {
	*BsnStatsReply
	Entries []*BsnPortCounterStatsEntry
}

type IBsnPortCounterStatsReply interface {
	IBsnStatsReply
	GetEntries() []*BsnPortCounterStatsEntry
}

func (self *BsnPortCounterStatsReply) GetEntries() []*BsnPortCounterStatsEntry {
	return self.Entries
}

func (self *BsnPortCounterStatsReply) SetEntries(v []*BsnPortCounterStatsEntry) {
	self.Entries = v
}

func (self *BsnPortCounterStatsReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnStatsReply.Serialize(encoder); err != nil {
		return err
	}

	for _, obj := range self.Entries {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnPortCounterStatsReply(parent *BsnStatsReply, decoder *goloxi.Decoder) (*BsnPortCounterStatsReply, error) {
	_bsnportcounterstatsreply := &BsnPortCounterStatsReply{BsnStatsReply: parent}

	for decoder.Length() >= 8 {
		item, err := DecodeBsnPortCounterStatsEntry(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_bsnportcounterstatsreply.Entries = append(_bsnportcounterstatsreply.Entries, item)
		}
	}
	return _bsnportcounterstatsreply, nil
}

func NewBsnPortCounterStatsReply() *BsnPortCounterStatsReply {
	obj := &BsnPortCounterStatsReply{
		BsnStatsReply: NewBsnStatsReply(8),
	}
	return obj
}

type BsnPortCounterStatsRequest struct {
	*BsnStatsRequest
	PortNo Port
}

type IBsnPortCounterStatsRequest interface {
	IBsnStatsRequest
	GetPortNo() Port
}

func (self *BsnPortCounterStatsRequest) GetPortNo() Port {
	return self.PortNo
}

func (self *BsnPortCounterStatsRequest) SetPortNo(v Port) {
	self.PortNo = v
}

func (self *BsnPortCounterStatsRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnStatsRequest.Serialize(encoder); err != nil {
		return err
	}

	self.PortNo.Serialize(encoder)
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnPortCounterStatsRequest(parent *BsnStatsRequest, decoder *goloxi.Decoder) (*BsnPortCounterStatsRequest, error) {
	_bsnportcounterstatsrequest := &BsnPortCounterStatsRequest{BsnStatsRequest: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("BsnPortCounterStatsRequest packet too short: %d < 4", decoder.Length())
	}
	_bsnportcounterstatsrequest.PortNo.Decode(decoder)
	return _bsnportcounterstatsrequest, nil
}

func NewBsnPortCounterStatsRequest() *BsnPortCounterStatsRequest {
	obj := &BsnPortCounterStatsRequest{
		BsnStatsRequest: NewBsnStatsRequest(8),
	}
	return obj
}

type BsnSetAuxCxnsReply struct {
	*BsnHeader
	NumAux uint32
	Status uint32
}

type IBsnSetAuxCxnsReply interface {
	IBsnHeader
	GetNumAux() uint32
	GetStatus() uint32
}

func (self *BsnSetAuxCxnsReply) GetNumAux() uint32 {
	return self.NumAux
}

func (self *BsnSetAuxCxnsReply) SetNumAux(v uint32) {
	self.NumAux = v
}

func (self *BsnSetAuxCxnsReply) GetStatus() uint32 {
	return self.Status
}

func (self *BsnSetAuxCxnsReply) SetStatus(v uint32) {
	self.Status = v
}

func (self *BsnSetAuxCxnsReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint32(uint32(self.NumAux))
	encoder.PutUint32(uint32(self.Status))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnSetAuxCxnsReply(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnSetAuxCxnsReply, error) {
	_bsnsetauxcxnsreply := &BsnSetAuxCxnsReply{BsnHeader: parent}
	if decoder.Length() < 8 {
		return nil, fmt.Errorf("BsnSetAuxCxnsReply packet too short: %d < 8", decoder.Length())
	}
	_bsnsetauxcxnsreply.NumAux = uint32(decoder.ReadUint32())
	_bsnsetauxcxnsreply.Status = uint32(decoder.ReadUint32())
	return _bsnsetauxcxnsreply, nil
}

func NewBsnSetAuxCxnsReply() *BsnSetAuxCxnsReply {
	obj := &BsnSetAuxCxnsReply{
		BsnHeader: NewBsnHeader(59),
	}
	return obj
}

type BsnSetAuxCxnsRequest struct {
	*BsnHeader
	NumAux uint32
}

type IBsnSetAuxCxnsRequest interface {
	IBsnHeader
	GetNumAux() uint32
}

func (self *BsnSetAuxCxnsRequest) GetNumAux() uint32 {
	return self.NumAux
}

func (self *BsnSetAuxCxnsRequest) SetNumAux(v uint32) {
	self.NumAux = v
}

func (self *BsnSetAuxCxnsRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint32(uint32(self.NumAux))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnSetAuxCxnsRequest(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnSetAuxCxnsRequest, error) {
	_bsnsetauxcxnsrequest := &BsnSetAuxCxnsRequest{BsnHeader: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("BsnSetAuxCxnsRequest packet too short: %d < 4", decoder.Length())
	}
	_bsnsetauxcxnsrequest.NumAux = uint32(decoder.ReadUint32())
	return _bsnsetauxcxnsrequest, nil
}

func NewBsnSetAuxCxnsRequest() *BsnSetAuxCxnsRequest {
	obj := &BsnSetAuxCxnsRequest{
		BsnHeader: NewBsnHeader(58),
	}
	return obj
}

type BsnSetLacpReply struct {
	*BsnHeader
	Status uint32
	PortNo Port
}

type IBsnSetLacpReply interface {
	IBsnHeader
	GetStatus() uint32
	GetPortNo() Port
}

func (self *BsnSetLacpReply) GetStatus() uint32 {
	return self.Status
}

func (self *BsnSetLacpReply) SetStatus(v uint32) {
	self.Status = v
}

func (self *BsnSetLacpReply) GetPortNo() Port {
	return self.PortNo
}

func (self *BsnSetLacpReply) SetPortNo(v Port) {
	self.PortNo = v
}

func (self *BsnSetLacpReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint32(uint32(self.Status))
	self.PortNo.Serialize(encoder)
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnSetLacpReply(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnSetLacpReply, error) {
	_bsnsetlacpreply := &BsnSetLacpReply{BsnHeader: parent}
	if decoder.Length() < 8 {
		return nil, fmt.Errorf("BsnSetLacpReply packet too short: %d < 8", decoder.Length())
	}
	_bsnsetlacpreply.Status = uint32(decoder.ReadUint32())
	_bsnsetlacpreply.PortNo.Decode(decoder)
	return _bsnsetlacpreply, nil
}

func NewBsnSetLacpReply() *BsnSetLacpReply {
	obj := &BsnSetLacpReply{
		BsnHeader: NewBsnHeader(42),
	}
	return obj
}

type BsnSetLacpRequest struct {
	*BsnHeader
	Enabled           uint8
	PortNo            Port
	ActorSysPriority  uint16
	ActorSysMac       net.HardwareAddr
	ActorPortPriority uint16
	ActorPortNum      uint16
	ActorKey          uint16
}

type IBsnSetLacpRequest interface {
	IBsnHeader
	GetEnabled() uint8
	GetPortNo() Port
	GetActorSysPriority() uint16
	GetActorSysMac() net.HardwareAddr
	GetActorPortPriority() uint16
	GetActorPortNum() uint16
	GetActorKey() uint16
}

func (self *BsnSetLacpRequest) GetEnabled() uint8 {
	return self.Enabled
}

func (self *BsnSetLacpRequest) SetEnabled(v uint8) {
	self.Enabled = v
}

func (self *BsnSetLacpRequest) GetPortNo() Port {
	return self.PortNo
}

func (self *BsnSetLacpRequest) SetPortNo(v Port) {
	self.PortNo = v
}

func (self *BsnSetLacpRequest) GetActorSysPriority() uint16 {
	return self.ActorSysPriority
}

func (self *BsnSetLacpRequest) SetActorSysPriority(v uint16) {
	self.ActorSysPriority = v
}

func (self *BsnSetLacpRequest) GetActorSysMac() net.HardwareAddr {
	return self.ActorSysMac
}

func (self *BsnSetLacpRequest) SetActorSysMac(v net.HardwareAddr) {
	self.ActorSysMac = v
}

func (self *BsnSetLacpRequest) GetActorPortPriority() uint16 {
	return self.ActorPortPriority
}

func (self *BsnSetLacpRequest) SetActorPortPriority(v uint16) {
	self.ActorPortPriority = v
}

func (self *BsnSetLacpRequest) GetActorPortNum() uint16 {
	return self.ActorPortNum
}

func (self *BsnSetLacpRequest) SetActorPortNum(v uint16) {
	self.ActorPortNum = v
}

func (self *BsnSetLacpRequest) GetActorKey() uint16 {
	return self.ActorKey
}

func (self *BsnSetLacpRequest) SetActorKey(v uint16) {
	self.ActorKey = v
}

func (self *BsnSetLacpRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint8(uint8(self.Enabled))
	encoder.Write(bytes.Repeat([]byte{0}, 3))
	self.PortNo.Serialize(encoder)
	encoder.PutUint16(uint16(self.ActorSysPriority))
	encoder.Write(self.ActorSysMac)
	encoder.PutUint16(uint16(self.ActorPortPriority))
	encoder.PutUint16(uint16(self.ActorPortNum))
	encoder.PutUint16(uint16(self.ActorKey))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnSetLacpRequest(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnSetLacpRequest, error) {
	_bsnsetlacprequest := &BsnSetLacpRequest{BsnHeader: parent}
	if decoder.Length() < 22 {
		return nil, fmt.Errorf("BsnSetLacpRequest packet too short: %d < 22", decoder.Length())
	}
	_bsnsetlacprequest.Enabled = uint8(decoder.ReadByte())
	decoder.Skip(3)
	_bsnsetlacprequest.PortNo.Decode(decoder)
	_bsnsetlacprequest.ActorSysPriority = uint16(decoder.ReadUint16())
	_bsnsetlacprequest.ActorSysMac = net.HardwareAddr(decoder.Read(6))
	_bsnsetlacprequest.ActorPortPriority = uint16(decoder.ReadUint16())
	_bsnsetlacprequest.ActorPortNum = uint16(decoder.ReadUint16())
	_bsnsetlacprequest.ActorKey = uint16(decoder.ReadUint16())
	return _bsnsetlacprequest, nil
}

func NewBsnSetLacpRequest() *BsnSetLacpRequest {
	obj := &BsnSetLacpRequest{
		BsnHeader: NewBsnHeader(41),
	}
	return obj
}

type BsnSetMirroring struct {
	*BsnHeader
	ReportMirrorPorts uint8
}

type IBsnSetMirroring interface {
	IBsnHeader
	GetReportMirrorPorts() uint8
}

func (self *BsnSetMirroring) GetReportMirrorPorts() uint8 {
	return self.ReportMirrorPorts
}

func (self *BsnSetMirroring) SetReportMirrorPorts(v uint8) {
	self.ReportMirrorPorts = v
}

func (self *BsnSetMirroring) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint8(uint8(self.ReportMirrorPorts))
	encoder.Write(bytes.Repeat([]byte{0}, 3))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnSetMirroring(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnSetMirroring, error) {
	_bsnsetmirroring := &BsnSetMirroring{BsnHeader: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("BsnSetMirroring packet too short: %d < 4", decoder.Length())
	}
	_bsnsetmirroring.ReportMirrorPorts = uint8(decoder.ReadByte())
	decoder.Skip(3)
	return _bsnsetmirroring, nil
}

func NewBsnSetMirroring() *BsnSetMirroring {
	obj := &BsnSetMirroring{
		BsnHeader: NewBsnHeader(3),
	}
	return obj
}

type BsnSetPktinSuppressionReply struct {
	*BsnHeader
	Status uint32
}

type IBsnSetPktinSuppressionReply interface {
	IBsnHeader
	GetStatus() uint32
}

func (self *BsnSetPktinSuppressionReply) GetStatus() uint32 {
	return self.Status
}

func (self *BsnSetPktinSuppressionReply) SetStatus(v uint32) {
	self.Status = v
}

func (self *BsnSetPktinSuppressionReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint32(uint32(self.Status))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnSetPktinSuppressionReply(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnSetPktinSuppressionReply, error) {
	_bsnsetpktinsuppressionreply := &BsnSetPktinSuppressionReply{BsnHeader: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("BsnSetPktinSuppressionReply packet too short: %d < 4", decoder.Length())
	}
	_bsnsetpktinsuppressionreply.Status = uint32(decoder.ReadUint32())
	return _bsnsetpktinsuppressionreply, nil
}

func NewBsnSetPktinSuppressionReply() *BsnSetPktinSuppressionReply {
	obj := &BsnSetPktinSuppressionReply{
		BsnHeader: NewBsnHeader(25),
	}
	return obj
}

type BsnSetPktinSuppressionRequest struct {
	*BsnHeader
	Enabled     uint8
	IdleTimeout uint16
	HardTimeout uint16
	Priority    uint16
	Cookie      uint64
}

type IBsnSetPktinSuppressionRequest interface {
	IBsnHeader
	GetEnabled() uint8
	GetIdleTimeout() uint16
	GetHardTimeout() uint16
	GetPriority() uint16
	GetCookie() uint64
}

func (self *BsnSetPktinSuppressionRequest) GetEnabled() uint8 {
	return self.Enabled
}

func (self *BsnSetPktinSuppressionRequest) SetEnabled(v uint8) {
	self.Enabled = v
}

func (self *BsnSetPktinSuppressionRequest) GetIdleTimeout() uint16 {
	return self.IdleTimeout
}

func (self *BsnSetPktinSuppressionRequest) SetIdleTimeout(v uint16) {
	self.IdleTimeout = v
}

func (self *BsnSetPktinSuppressionRequest) GetHardTimeout() uint16 {
	return self.HardTimeout
}

func (self *BsnSetPktinSuppressionRequest) SetHardTimeout(v uint16) {
	self.HardTimeout = v
}

func (self *BsnSetPktinSuppressionRequest) GetPriority() uint16 {
	return self.Priority
}

func (self *BsnSetPktinSuppressionRequest) SetPriority(v uint16) {
	self.Priority = v
}

func (self *BsnSetPktinSuppressionRequest) GetCookie() uint64 {
	return self.Cookie
}

func (self *BsnSetPktinSuppressionRequest) SetCookie(v uint64) {
	self.Cookie = v
}

func (self *BsnSetPktinSuppressionRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint8(uint8(self.Enabled))
	encoder.Write(bytes.Repeat([]byte{0}, 1))
	encoder.PutUint16(uint16(self.IdleTimeout))
	encoder.PutUint16(uint16(self.HardTimeout))
	encoder.PutUint16(uint16(self.Priority))
	encoder.PutUint64(uint64(self.Cookie))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnSetPktinSuppressionRequest(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnSetPktinSuppressionRequest, error) {
	_bsnsetpktinsuppressionrequest := &BsnSetPktinSuppressionRequest{BsnHeader: parent}
	if decoder.Length() < 16 {
		return nil, fmt.Errorf("BsnSetPktinSuppressionRequest packet too short: %d < 16", decoder.Length())
	}
	_bsnsetpktinsuppressionrequest.Enabled = uint8(decoder.ReadByte())
	decoder.Skip(1)
	_bsnsetpktinsuppressionrequest.IdleTimeout = uint16(decoder.ReadUint16())
	_bsnsetpktinsuppressionrequest.HardTimeout = uint16(decoder.ReadUint16())
	_bsnsetpktinsuppressionrequest.Priority = uint16(decoder.ReadUint16())
	_bsnsetpktinsuppressionrequest.Cookie = uint64(decoder.ReadUint64())
	return _bsnsetpktinsuppressionrequest, nil
}

func NewBsnSetPktinSuppressionRequest() *BsnSetPktinSuppressionRequest {
	obj := &BsnSetPktinSuppressionRequest{
		BsnHeader: NewBsnHeader(11),
	}
	return obj
}

type BsnSetSwitchPipelineReply struct {
	*BsnHeader
	Status uint32
}

type IBsnSetSwitchPipelineReply interface {
	IBsnHeader
	GetStatus() uint32
}

func (self *BsnSetSwitchPipelineReply) GetStatus() uint32 {
	return self.Status
}

func (self *BsnSetSwitchPipelineReply) SetStatus(v uint32) {
	self.Status = v
}

func (self *BsnSetSwitchPipelineReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint32(uint32(self.Status))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnSetSwitchPipelineReply(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnSetSwitchPipelineReply, error) {
	_bsnsetswitchpipelinereply := &BsnSetSwitchPipelineReply{BsnHeader: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("BsnSetSwitchPipelineReply packet too short: %d < 4", decoder.Length())
	}
	_bsnsetswitchpipelinereply.Status = uint32(decoder.ReadUint32())
	return _bsnsetswitchpipelinereply, nil
}

func NewBsnSetSwitchPipelineReply() *BsnSetSwitchPipelineReply {
	obj := &BsnSetSwitchPipelineReply{
		BsnHeader: NewBsnHeader(54),
	}
	return obj
}

type BsnSetSwitchPipelineRequest struct {
	*BsnHeader
	Pipeline string
}

type IBsnSetSwitchPipelineRequest interface {
	IBsnHeader
	GetPipeline() string
}

func (self *BsnSetSwitchPipelineRequest) GetPipeline() string {
	return self.Pipeline
}

func (self *BsnSetSwitchPipelineRequest) SetPipeline(v string) {
	self.Pipeline = v
}

func (self *BsnSetSwitchPipelineRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write([]byte(self.Pipeline))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnSetSwitchPipelineRequest(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnSetSwitchPipelineRequest, error) {
	_bsnsetswitchpipelinerequest := &BsnSetSwitchPipelineRequest{BsnHeader: parent}
	if decoder.Length() < 256 {
		return nil, fmt.Errorf("BsnSetSwitchPipelineRequest packet too short: %d < 256", decoder.Length())
	}
	_bsnsetswitchpipelinerequest.Pipeline = string(bytes.Trim(decoder.Read(256), "\x00"))
	return _bsnsetswitchpipelinerequest, nil
}

func NewBsnSetSwitchPipelineRequest() *BsnSetSwitchPipelineRequest {
	obj := &BsnSetSwitchPipelineRequest{
		BsnHeader: NewBsnHeader(53),
	}
	return obj
}

type BsnSwitchPipelineStatsReply struct {
	*BsnStatsReply
	Entries []*BsnSwitchPipelineStatsEntry
}

type IBsnSwitchPipelineStatsReply interface {
	IBsnStatsReply
	GetEntries() []*BsnSwitchPipelineStatsEntry
}

func (self *BsnSwitchPipelineStatsReply) GetEntries() []*BsnSwitchPipelineStatsEntry {
	return self.Entries
}

func (self *BsnSwitchPipelineStatsReply) SetEntries(v []*BsnSwitchPipelineStatsEntry) {
	self.Entries = v
}

func (self *BsnSwitchPipelineStatsReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnStatsReply.Serialize(encoder); err != nil {
		return err
	}

	for _, obj := range self.Entries {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnSwitchPipelineStatsReply(parent *BsnStatsReply, decoder *goloxi.Decoder) (*BsnSwitchPipelineStatsReply, error) {
	_bsnswitchpipelinestatsreply := &BsnSwitchPipelineStatsReply{BsnStatsReply: parent}

	for decoder.Length() >= 256 {
		item, err := DecodeBsnSwitchPipelineStatsEntry(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_bsnswitchpipelinestatsreply.Entries = append(_bsnswitchpipelinestatsreply.Entries, item)
		}
	}
	return _bsnswitchpipelinestatsreply, nil
}

func NewBsnSwitchPipelineStatsReply() *BsnSwitchPipelineStatsReply {
	obj := &BsnSwitchPipelineStatsReply{
		BsnStatsReply: NewBsnStatsReply(6),
	}
	return obj
}

type BsnSwitchPipelineStatsRequest struct {
	*BsnStatsRequest
}

type IBsnSwitchPipelineStatsRequest interface {
	IBsnStatsRequest
}

func (self *BsnSwitchPipelineStatsRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnStatsRequest.Serialize(encoder); err != nil {
		return err
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnSwitchPipelineStatsRequest(parent *BsnStatsRequest, decoder *goloxi.Decoder) (*BsnSwitchPipelineStatsRequest, error) {
	_bsnswitchpipelinestatsrequest := &BsnSwitchPipelineStatsRequest{BsnStatsRequest: parent}
	return _bsnswitchpipelinestatsrequest, nil
}

func NewBsnSwitchPipelineStatsRequest() *BsnSwitchPipelineStatsRequest {
	obj := &BsnSwitchPipelineStatsRequest{
		BsnStatsRequest: NewBsnStatsRequest(6),
	}
	return obj
}

type BsnTableChecksumStatsReply struct {
	*BsnStatsReply
	Entries []*BsnTableChecksumStatsEntry
}

type IBsnTableChecksumStatsReply interface {
	IBsnStatsReply
	GetEntries() []*BsnTableChecksumStatsEntry
}

func (self *BsnTableChecksumStatsReply) GetEntries() []*BsnTableChecksumStatsEntry {
	return self.Entries
}

func (self *BsnTableChecksumStatsReply) SetEntries(v []*BsnTableChecksumStatsEntry) {
	self.Entries = v
}

func (self *BsnTableChecksumStatsReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnStatsReply.Serialize(encoder); err != nil {
		return err
	}

	for _, obj := range self.Entries {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnTableChecksumStatsReply(parent *BsnStatsReply, decoder *goloxi.Decoder) (*BsnTableChecksumStatsReply, error) {
	_bsntablechecksumstatsreply := &BsnTableChecksumStatsReply{BsnStatsReply: parent}

	for decoder.Length() >= 9 {
		item, err := DecodeBsnTableChecksumStatsEntry(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_bsntablechecksumstatsreply.Entries = append(_bsntablechecksumstatsreply.Entries, item)
		}
	}
	return _bsntablechecksumstatsreply, nil
}

func NewBsnTableChecksumStatsReply() *BsnTableChecksumStatsReply {
	obj := &BsnTableChecksumStatsReply{
		BsnStatsReply: NewBsnStatsReply(11),
	}
	return obj
}

type BsnTableChecksumStatsRequest struct {
	*BsnStatsRequest
}

type IBsnTableChecksumStatsRequest interface {
	IBsnStatsRequest
}

func (self *BsnTableChecksumStatsRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnStatsRequest.Serialize(encoder); err != nil {
		return err
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnTableChecksumStatsRequest(parent *BsnStatsRequest, decoder *goloxi.Decoder) (*BsnTableChecksumStatsRequest, error) {
	_bsntablechecksumstatsrequest := &BsnTableChecksumStatsRequest{BsnStatsRequest: parent}
	return _bsntablechecksumstatsrequest, nil
}

func NewBsnTableChecksumStatsRequest() *BsnTableChecksumStatsRequest {
	obj := &BsnTableChecksumStatsRequest{
		BsnStatsRequest: NewBsnStatsRequest(11),
	}
	return obj
}

type BsnTableSetBucketsSize struct {
	*BsnHeader
	TableId     uint8
	BucketsSize uint32
}

type IBsnTableSetBucketsSize interface {
	IBsnHeader
	GetTableId() uint8
	GetBucketsSize() uint32
}

func (self *BsnTableSetBucketsSize) GetTableId() uint8 {
	return self.TableId
}

func (self *BsnTableSetBucketsSize) SetTableId(v uint8) {
	self.TableId = v
}

func (self *BsnTableSetBucketsSize) GetBucketsSize() uint32 {
	return self.BucketsSize
}

func (self *BsnTableSetBucketsSize) SetBucketsSize(v uint32) {
	self.BucketsSize = v
}

func (self *BsnTableSetBucketsSize) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 1))
	encoder.PutUint8(uint8(self.TableId))
	encoder.Write(bytes.Repeat([]byte{0}, 2))
	encoder.PutUint32(uint32(self.BucketsSize))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnTableSetBucketsSize(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnTableSetBucketsSize, error) {
	_bsntablesetbucketssize := &BsnTableSetBucketsSize{BsnHeader: parent}
	if decoder.Length() < 8 {
		return nil, fmt.Errorf("BsnTableSetBucketsSize packet too short: %d < 8", decoder.Length())
	}
	decoder.Skip(1)
	_bsntablesetbucketssize.TableId = uint8(decoder.ReadByte())
	decoder.Skip(2)
	_bsntablesetbucketssize.BucketsSize = uint32(decoder.ReadUint32())
	return _bsntablesetbucketssize, nil
}

func NewBsnTableSetBucketsSize() *BsnTableSetBucketsSize {
	obj := &BsnTableSetBucketsSize{
		BsnHeader: NewBsnHeader(61),
	}
	return obj
}

type BsnTakeover struct {
	*BsnHeader
}

type IBsnTakeover interface {
	IBsnHeader
}

func (self *BsnTakeover) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnTakeover(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnTakeover, error) {
	_bsntakeover := &BsnTakeover{BsnHeader: parent}
	return _bsntakeover, nil
}

func NewBsnTakeover() *BsnTakeover {
	obj := &BsnTakeover{
		BsnHeader: NewBsnHeader(69),
	}
	return obj
}

type BsnTimeReply struct {
	*BsnHeader
	TimeMs uint64
}

type IBsnTimeReply interface {
	IBsnHeader
	GetTimeMs() uint64
}

func (self *BsnTimeReply) GetTimeMs() uint64 {
	return self.TimeMs
}

func (self *BsnTimeReply) SetTimeMs(v uint64) {
	self.TimeMs = v
}

func (self *BsnTimeReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint64(uint64(self.TimeMs))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnTimeReply(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnTimeReply, error) {
	_bsntimereply := &BsnTimeReply{BsnHeader: parent}
	if decoder.Length() < 8 {
		return nil, fmt.Errorf("BsnTimeReply packet too short: %d < 8", decoder.Length())
	}
	_bsntimereply.TimeMs = uint64(decoder.ReadUint64())
	return _bsntimereply, nil
}

func NewBsnTimeReply() *BsnTimeReply {
	obj := &BsnTimeReply{
		BsnHeader: NewBsnHeader(45),
	}
	return obj
}

type BsnTimeRequest struct {
	*BsnHeader
}

type IBsnTimeRequest interface {
	IBsnHeader
}

func (self *BsnTimeRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnTimeRequest(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnTimeRequest, error) {
	_bsntimerequest := &BsnTimeRequest{BsnHeader: parent}
	return _bsntimerequest, nil
}

func NewBsnTimeRequest() *BsnTimeRequest {
	obj := &BsnTimeRequest{
		BsnHeader: NewBsnHeader(44),
	}
	return obj
}

type BsnVirtualPortCreateReply struct {
	*BsnHeader
	Status  uint32
	VportNo uint32
}

type IBsnVirtualPortCreateReply interface {
	IBsnHeader
	GetStatus() uint32
	GetVportNo() uint32
}

func (self *BsnVirtualPortCreateReply) GetStatus() uint32 {
	return self.Status
}

func (self *BsnVirtualPortCreateReply) SetStatus(v uint32) {
	self.Status = v
}

func (self *BsnVirtualPortCreateReply) GetVportNo() uint32 {
	return self.VportNo
}

func (self *BsnVirtualPortCreateReply) SetVportNo(v uint32) {
	self.VportNo = v
}

func (self *BsnVirtualPortCreateReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint32(uint32(self.Status))
	encoder.PutUint32(uint32(self.VportNo))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnVirtualPortCreateReply(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnVirtualPortCreateReply, error) {
	_bsnvirtualportcreatereply := &BsnVirtualPortCreateReply{BsnHeader: parent}
	if decoder.Length() < 8 {
		return nil, fmt.Errorf("BsnVirtualPortCreateReply packet too short: %d < 8", decoder.Length())
	}
	_bsnvirtualportcreatereply.Status = uint32(decoder.ReadUint32())
	_bsnvirtualportcreatereply.VportNo = uint32(decoder.ReadUint32())
	return _bsnvirtualportcreatereply, nil
}

func NewBsnVirtualPortCreateReply() *BsnVirtualPortCreateReply {
	obj := &BsnVirtualPortCreateReply{
		BsnHeader: NewBsnHeader(16),
	}
	return obj
}

type BsnVirtualPortCreateRequest struct {
	*BsnHeader
	Vport BSNVport
}

type IBsnVirtualPortCreateRequest interface {
	IBsnHeader
	GetVport() BSNVport
}

func (self *BsnVirtualPortCreateRequest) GetVport() BSNVport {
	return self.Vport
}

func (self *BsnVirtualPortCreateRequest) SetVport(v BSNVport) {
	self.Vport = v
}

func (self *BsnVirtualPortCreateRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	if err := self.Vport.Serialize(encoder); err != nil {
		return err
	}

	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnVirtualPortCreateRequest(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnVirtualPortCreateRequest, error) {
	_bsnvirtualportcreaterequest := &BsnVirtualPortCreateRequest{BsnHeader: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("BsnVirtualPortCreateRequest packet too short: %d < 4", decoder.Length())
	}
	if err := _bsnvirtualportcreaterequest.Vport.Decode(decoder); err != nil {
		return nil, err
	}

	return _bsnvirtualportcreaterequest, nil
}

func NewBsnVirtualPortCreateRequest() *BsnVirtualPortCreateRequest {
	obj := &BsnVirtualPortCreateRequest{
		BsnHeader: NewBsnHeader(15),
	}
	return obj
}

type BsnVirtualPortRemoveReply struct {
	*BsnHeader
	Status uint32
}

type IBsnVirtualPortRemoveReply interface {
	IBsnHeader
	GetStatus() uint32
}

func (self *BsnVirtualPortRemoveReply) GetStatus() uint32 {
	return self.Status
}

func (self *BsnVirtualPortRemoveReply) SetStatus(v uint32) {
	self.Status = v
}

func (self *BsnVirtualPortRemoveReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint32(uint32(self.Status))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnVirtualPortRemoveReply(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnVirtualPortRemoveReply, error) {
	_bsnvirtualportremovereply := &BsnVirtualPortRemoveReply{BsnHeader: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("BsnVirtualPortRemoveReply packet too short: %d < 4", decoder.Length())
	}
	_bsnvirtualportremovereply.Status = uint32(decoder.ReadUint32())
	return _bsnvirtualportremovereply, nil
}

func NewBsnVirtualPortRemoveReply() *BsnVirtualPortRemoveReply {
	obj := &BsnVirtualPortRemoveReply{
		BsnHeader: NewBsnHeader(26),
	}
	return obj
}

type BsnVirtualPortRemoveRequest struct {
	*BsnHeader
	VportNo uint32
}

type IBsnVirtualPortRemoveRequest interface {
	IBsnHeader
	GetVportNo() uint32
}

func (self *BsnVirtualPortRemoveRequest) GetVportNo() uint32 {
	return self.VportNo
}

func (self *BsnVirtualPortRemoveRequest) SetVportNo(v uint32) {
	self.VportNo = v
}

func (self *BsnVirtualPortRemoveRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint32(uint32(self.VportNo))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnVirtualPortRemoveRequest(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnVirtualPortRemoveRequest, error) {
	_bsnvirtualportremoverequest := &BsnVirtualPortRemoveRequest{BsnHeader: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("BsnVirtualPortRemoveRequest packet too short: %d < 4", decoder.Length())
	}
	_bsnvirtualportremoverequest.VportNo = uint32(decoder.ReadUint32())
	return _bsnvirtualportremoverequest, nil
}

func NewBsnVirtualPortRemoveRequest() *BsnVirtualPortRemoveRequest {
	obj := &BsnVirtualPortRemoveRequest{
		BsnHeader: NewBsnHeader(17),
	}
	return obj
}

type BsnVlanCounterClear struct {
	*BsnHeader
	VlanVid uint16
}

type IBsnVlanCounterClear interface {
	IBsnHeader
	GetVlanVid() uint16
}

func (self *BsnVlanCounterClear) GetVlanVid() uint16 {
	return self.VlanVid
}

func (self *BsnVlanCounterClear) SetVlanVid(v uint16) {
	self.VlanVid = v
}

func (self *BsnVlanCounterClear) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnHeader.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint16(uint16(self.VlanVid))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnVlanCounterClear(parent *BsnHeader, decoder *goloxi.Decoder) (*BsnVlanCounterClear, error) {
	_bsnvlancounterclear := &BsnVlanCounterClear{BsnHeader: parent}
	if decoder.Length() < 2 {
		return nil, fmt.Errorf("BsnVlanCounterClear packet too short: %d < 2", decoder.Length())
	}
	_bsnvlancounterclear.VlanVid = uint16(decoder.ReadUint16())
	return _bsnvlancounterclear, nil
}

func NewBsnVlanCounterClear() *BsnVlanCounterClear {
	obj := &BsnVlanCounterClear{
		BsnHeader: NewBsnHeader(70),
	}
	return obj
}

type BsnVlanCounterStatsReply struct {
	*BsnStatsReply
	Entries []*BsnVlanCounterStatsEntry
}

type IBsnVlanCounterStatsReply interface {
	IBsnStatsReply
	GetEntries() []*BsnVlanCounterStatsEntry
}

func (self *BsnVlanCounterStatsReply) GetEntries() []*BsnVlanCounterStatsEntry {
	return self.Entries
}

func (self *BsnVlanCounterStatsReply) SetEntries(v []*BsnVlanCounterStatsEntry) {
	self.Entries = v
}

func (self *BsnVlanCounterStatsReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnStatsReply.Serialize(encoder); err != nil {
		return err
	}

	for _, obj := range self.Entries {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnVlanCounterStatsReply(parent *BsnStatsReply, decoder *goloxi.Decoder) (*BsnVlanCounterStatsReply, error) {
	_bsnvlancounterstatsreply := &BsnVlanCounterStatsReply{BsnStatsReply: parent}

	for decoder.Length() >= 8 {
		item, err := DecodeBsnVlanCounterStatsEntry(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_bsnvlancounterstatsreply.Entries = append(_bsnvlancounterstatsreply.Entries, item)
		}
	}
	return _bsnvlancounterstatsreply, nil
}

func NewBsnVlanCounterStatsReply() *BsnVlanCounterStatsReply {
	obj := &BsnVlanCounterStatsReply{
		BsnStatsReply: NewBsnStatsReply(9),
	}
	return obj
}

type BsnVlanCounterStatsRequest struct {
	*BsnStatsRequest
	VlanVid uint16
}

type IBsnVlanCounterStatsRequest interface {
	IBsnStatsRequest
	GetVlanVid() uint16
}

func (self *BsnVlanCounterStatsRequest) GetVlanVid() uint16 {
	return self.VlanVid
}

func (self *BsnVlanCounterStatsRequest) SetVlanVid(v uint16) {
	self.VlanVid = v
}

func (self *BsnVlanCounterStatsRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnStatsRequest.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint16(uint16(self.VlanVid))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnVlanCounterStatsRequest(parent *BsnStatsRequest, decoder *goloxi.Decoder) (*BsnVlanCounterStatsRequest, error) {
	_bsnvlancounterstatsrequest := &BsnVlanCounterStatsRequest{BsnStatsRequest: parent}
	if decoder.Length() < 2 {
		return nil, fmt.Errorf("BsnVlanCounterStatsRequest packet too short: %d < 2", decoder.Length())
	}
	_bsnvlancounterstatsrequest.VlanVid = uint16(decoder.ReadUint16())
	return _bsnvlancounterstatsrequest, nil
}

func NewBsnVlanCounterStatsRequest() *BsnVlanCounterStatsRequest {
	obj := &BsnVlanCounterStatsRequest{
		BsnStatsRequest: NewBsnStatsRequest(9),
	}
	return obj
}

type BsnVrfCounterStatsReply struct {
	*BsnStatsReply
	Entries []*BsnVrfCounterStatsEntry
}

type IBsnVrfCounterStatsReply interface {
	IBsnStatsReply
	GetEntries() []*BsnVrfCounterStatsEntry
}

func (self *BsnVrfCounterStatsReply) GetEntries() []*BsnVrfCounterStatsEntry {
	return self.Entries
}

func (self *BsnVrfCounterStatsReply) SetEntries(v []*BsnVrfCounterStatsEntry) {
	self.Entries = v
}

func (self *BsnVrfCounterStatsReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnStatsReply.Serialize(encoder); err != nil {
		return err
	}

	for _, obj := range self.Entries {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnVrfCounterStatsReply(parent *BsnStatsReply, decoder *goloxi.Decoder) (*BsnVrfCounterStatsReply, error) {
	_bsnvrfcounterstatsreply := &BsnVrfCounterStatsReply{BsnStatsReply: parent}

	for decoder.Length() >= 8 {
		item, err := DecodeBsnVrfCounterStatsEntry(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_bsnvrfcounterstatsreply.Entries = append(_bsnvrfcounterstatsreply.Entries, item)
		}
	}
	return _bsnvrfcounterstatsreply, nil
}

func NewBsnVrfCounterStatsReply() *BsnVrfCounterStatsReply {
	obj := &BsnVrfCounterStatsReply{
		BsnStatsReply: NewBsnStatsReply(15),
	}
	return obj
}

type BsnVrfCounterStatsRequest struct {
	*BsnStatsRequest
	Vrf uint32
}

type IBsnVrfCounterStatsRequest interface {
	IBsnStatsRequest
	GetVrf() uint32
}

func (self *BsnVrfCounterStatsRequest) GetVrf() uint32 {
	return self.Vrf
}

func (self *BsnVrfCounterStatsRequest) SetVrf(v uint32) {
	self.Vrf = v
}

func (self *BsnVrfCounterStatsRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.BsnStatsRequest.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint32(uint32(self.Vrf))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBsnVrfCounterStatsRequest(parent *BsnStatsRequest, decoder *goloxi.Decoder) (*BsnVrfCounterStatsRequest, error) {
	_bsnvrfcounterstatsrequest := &BsnVrfCounterStatsRequest{BsnStatsRequest: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("BsnVrfCounterStatsRequest packet too short: %d < 4", decoder.Length())
	}
	_bsnvrfcounterstatsrequest.Vrf = uint32(decoder.ReadUint32())
	return _bsnvrfcounterstatsrequest, nil
}

func NewBsnVrfCounterStatsRequest() *BsnVrfCounterStatsRequest {
	obj := &BsnVrfCounterStatsRequest{
		BsnStatsRequest: NewBsnStatsRequest(15),
	}
	return obj
}

type BundleAddMsg struct {
	*Header
	BundleId   uint32
	Flags      BundleFlags
	Message    IHeader
	Properties []IBundleProp
}

type IBundleAddMsg interface {
	IHeader
	GetBundleId() uint32
	GetFlags() BundleFlags
	GetMessage() IHeader
	GetProperties() []IBundleProp
}

func (self *BundleAddMsg) GetBundleId() uint32 {
	return self.BundleId
}

func (self *BundleAddMsg) SetBundleId(v uint32) {
	self.BundleId = v
}

func (self *BundleAddMsg) GetFlags() BundleFlags {
	return self.Flags
}

func (self *BundleAddMsg) SetFlags(v BundleFlags) {
	self.Flags = v
}

func (self *BundleAddMsg) GetMessage() IHeader {
	return self.Message
}

func (self *BundleAddMsg) SetMessage(v IHeader) {
	self.Message = v
}

func (self *BundleAddMsg) GetProperties() []IBundleProp {
	return self.Properties
}

func (self *BundleAddMsg) SetProperties(v []IBundleProp) {
	self.Properties = v
}

func (self *BundleAddMsg) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.Header.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint32(uint32(self.BundleId))
	encoder.Write(bytes.Repeat([]byte{0}, 1))
	encoder.PutUint16(uint16(self.Flags))
	self.Message.Serialize(encoder)
	for _, obj := range self.Properties {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBundleAddMsg(parent *Header, decoder *goloxi.Decoder) (*BundleAddMsg, error) {
	_bundleaddmsg := &BundleAddMsg{Header: parent}
	if decoder.Length() < 15 {
		return nil, fmt.Errorf("BundleAddMsg packet too short: %d < 15", decoder.Length())
	}
	_bundleaddmsg.BundleId = uint32(decoder.ReadUint32())
	decoder.Skip(1)
	_bundleaddmsg.Flags = BundleFlags(decoder.ReadUint16())
	if obj, err := DecodeHeader(decoder); err != nil {
		return nil, err
	} else {
		_bundleaddmsg.Message = obj
	}

	for decoder.Length() >= 4 {
		item, err := DecodeBundleProp(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_bundleaddmsg.Properties = append(_bundleaddmsg.Properties, item)
		}
	}
	return _bundleaddmsg, nil
}

func NewBundleAddMsg() *BundleAddMsg {
	obj := &BundleAddMsg{
		Header: NewHeader(34),
	}
	return obj
}

type BundleCtrlMsg struct {
	*Header
	BundleId       uint32
	BundleCtrlType BundleCtrlType
	Flags          BundleFlags
	Properties     []IBundleProp
}

type IBundleCtrlMsg interface {
	IHeader
	GetBundleId() uint32
	GetBundleCtrlType() BundleCtrlType
	GetFlags() BundleFlags
	GetProperties() []IBundleProp
}

func (self *BundleCtrlMsg) GetBundleId() uint32 {
	return self.BundleId
}

func (self *BundleCtrlMsg) SetBundleId(v uint32) {
	self.BundleId = v
}

func (self *BundleCtrlMsg) GetBundleCtrlType() BundleCtrlType {
	return self.BundleCtrlType
}

func (self *BundleCtrlMsg) SetBundleCtrlType(v BundleCtrlType) {
	self.BundleCtrlType = v
}

func (self *BundleCtrlMsg) GetFlags() BundleFlags {
	return self.Flags
}

func (self *BundleCtrlMsg) SetFlags(v BundleFlags) {
	self.Flags = v
}

func (self *BundleCtrlMsg) GetProperties() []IBundleProp {
	return self.Properties
}

func (self *BundleCtrlMsg) SetProperties(v []IBundleProp) {
	self.Properties = v
}

func (self *BundleCtrlMsg) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.Header.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint32(uint32(self.BundleId))
	encoder.PutUint16(uint16(self.BundleCtrlType))
	encoder.PutUint16(uint16(self.Flags))
	for _, obj := range self.Properties {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBundleCtrlMsg(parent *Header, decoder *goloxi.Decoder) (*BundleCtrlMsg, error) {
	_bundlectrlmsg := &BundleCtrlMsg{Header: parent}
	if decoder.Length() < 8 {
		return nil, fmt.Errorf("BundleCtrlMsg packet too short: %d < 8", decoder.Length())
	}
	_bundlectrlmsg.BundleId = uint32(decoder.ReadUint32())
	_bundlectrlmsg.BundleCtrlType = BundleCtrlType(decoder.ReadUint16())
	_bundlectrlmsg.Flags = BundleFlags(decoder.ReadUint16())

	for decoder.Length() >= 4 {
		item, err := DecodeBundleProp(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_bundlectrlmsg.Properties = append(_bundlectrlmsg.Properties, item)
		}
	}
	return _bundlectrlmsg, nil
}

func NewBundleCtrlMsg() *BundleCtrlMsg {
	obj := &BundleCtrlMsg{
		Header: NewHeader(33),
	}
	return obj
}

type BundleFailedErrorMsg struct {
	*ErrorMsg
	Code BundleFailedCode
	Data []byte
}

type IBundleFailedErrorMsg interface {
	IErrorMsg
	GetCode() BundleFailedCode
	GetData() []byte
}

func (self *BundleFailedErrorMsg) GetCode() BundleFailedCode {
	return self.Code
}

func (self *BundleFailedErrorMsg) SetCode(v BundleFailedCode) {
	self.Code = v
}

func (self *BundleFailedErrorMsg) GetData() []byte {
	return self.Data
}

func (self *BundleFailedErrorMsg) SetData(v []byte) {
	self.Data = v
}

func (self *BundleFailedErrorMsg) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.ErrorMsg.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint16(uint16(self.Code))
	encoder.Write(self.Data)
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBundleFailedErrorMsg(parent *ErrorMsg, decoder *goloxi.Decoder) (*BundleFailedErrorMsg, error) {
	_bundlefailederrormsg := &BundleFailedErrorMsg{ErrorMsg: parent}
	if decoder.Length() < 2 {
		return nil, fmt.Errorf("BundleFailedErrorMsg packet too short: %d < 2", decoder.Length())
	}
	_bundlefailederrormsg.Code = BundleFailedCode(decoder.ReadUint16())
	_bundlefailederrormsg.Data = decoder.Read(int(decoder.Length()))
	return _bundlefailederrormsg, nil
}

func NewBundleFailedErrorMsg() *BundleFailedErrorMsg {
	obj := &BundleFailedErrorMsg{
		ErrorMsg: NewErrorMsg(17),
	}
	return obj
}

type BundleFeaturesStatsReply struct {
	*StatsReply
	Capabilities BundleFeatureFlags
	Properties   []IBundleFeaturesProp
}

type IBundleFeaturesStatsReply interface {
	IStatsReply
	GetCapabilities() BundleFeatureFlags
	GetProperties() []IBundleFeaturesProp
}

func (self *BundleFeaturesStatsReply) GetCapabilities() BundleFeatureFlags {
	return self.Capabilities
}

func (self *BundleFeaturesStatsReply) SetCapabilities(v BundleFeatureFlags) {
	self.Capabilities = v
}

func (self *BundleFeaturesStatsReply) GetProperties() []IBundleFeaturesProp {
	return self.Properties
}

func (self *BundleFeaturesStatsReply) SetProperties(v []IBundleFeaturesProp) {
	self.Properties = v
}

func (self *BundleFeaturesStatsReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsReply.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	encoder.PutUint32(uint32(self.Capabilities))
	encoder.Write(bytes.Repeat([]byte{0}, 6))
	for _, obj := range self.Properties {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBundleFeaturesStatsReply(parent *StatsReply, decoder *goloxi.Decoder) (*BundleFeaturesStatsReply, error) {
	_bundlefeaturesstatsreply := &BundleFeaturesStatsReply{StatsReply: parent}
	if decoder.Length() < 14 {
		return nil, fmt.Errorf("BundleFeaturesStatsReply packet too short: %d < 14", decoder.Length())
	}
	decoder.Skip(4)
	_bundlefeaturesstatsreply.Capabilities = BundleFeatureFlags(decoder.ReadUint32())
	decoder.Skip(6)

	for decoder.Length() >= 4 {
		item, err := DecodeBundleFeaturesProp(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_bundlefeaturesstatsreply.Properties = append(_bundlefeaturesstatsreply.Properties, item)
		}
	}
	return _bundlefeaturesstatsreply, nil
}

func NewBundleFeaturesStatsReply() *BundleFeaturesStatsReply {
	obj := &BundleFeaturesStatsReply{
		StatsReply: NewStatsReply(19),
	}
	return obj
}

type BundleFeaturesStatsRequest struct {
	*StatsRequest
	FeatureRequestFlags BundleFeatureFlags
	Properties          []IBundleFeaturesProp
}

type IBundleFeaturesStatsRequest interface {
	IStatsRequest
	GetFeatureRequestFlags() BundleFeatureFlags
	GetProperties() []IBundleFeaturesProp
}

func (self *BundleFeaturesStatsRequest) GetFeatureRequestFlags() BundleFeatureFlags {
	return self.FeatureRequestFlags
}

func (self *BundleFeaturesStatsRequest) SetFeatureRequestFlags(v BundleFeatureFlags) {
	self.FeatureRequestFlags = v
}

func (self *BundleFeaturesStatsRequest) GetProperties() []IBundleFeaturesProp {
	return self.Properties
}

func (self *BundleFeaturesStatsRequest) SetProperties(v []IBundleFeaturesProp) {
	self.Properties = v
}

func (self *BundleFeaturesStatsRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsRequest.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	encoder.PutUint32(uint32(self.FeatureRequestFlags))
	encoder.Write(bytes.Repeat([]byte{0}, 4))
	for _, obj := range self.Properties {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeBundleFeaturesStatsRequest(parent *StatsRequest, decoder *goloxi.Decoder) (*BundleFeaturesStatsRequest, error) {
	_bundlefeaturesstatsrequest := &BundleFeaturesStatsRequest{StatsRequest: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("BundleFeaturesStatsRequest packet too short: %d < 4", decoder.Length())
	}
	decoder.Skip(4)
	_bundlefeaturesstatsrequest.FeatureRequestFlags = BundleFeatureFlags(decoder.ReadUint32())
	decoder.Skip(4)

	for decoder.Length() >= 4 {
		item, err := DecodeBundleFeaturesProp(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_bundlefeaturesstatsrequest.Properties = append(_bundlefeaturesstatsrequest.Properties, item)
		}
	}
	return _bundlefeaturesstatsrequest, nil
}

func NewBundleFeaturesStatsRequest() *BundleFeaturesStatsRequest {
	obj := &BundleFeaturesStatsRequest{
		StatsRequest: NewStatsRequest(19),
	}
	return obj
}

type ControllerStatus struct {
	*Header
	Entry *ControllerStatusEntry
}

type IControllerStatus interface {
	IHeader
	GetEntry() *ControllerStatusEntry
}

func (self *ControllerStatus) GetEntry() *ControllerStatusEntry {
	return self.Entry
}

func (self *ControllerStatus) SetEntry(v *ControllerStatusEntry) {
	self.Entry = v
}

func (self *ControllerStatus) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.Header.Serialize(encoder); err != nil {
		return err
	}

	self.Entry.Serialize(encoder)
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeControllerStatus(parent *Header, decoder *goloxi.Decoder) (*ControllerStatus, error) {
	_controllerstatus := &ControllerStatus{Header: parent}
	if decoder.Length() < 16 {
		return nil, fmt.Errorf("ControllerStatus packet too short: %d < 16", decoder.Length())
	}
	if obj, err := DecodeControllerStatusEntry(decoder); err != nil {
		return nil, err
	} else {
		_controllerstatus.Entry = obj
	}

	return _controllerstatus, nil
}

func NewControllerStatus() *ControllerStatus {
	obj := &ControllerStatus{
		Header: NewHeader(35),
	}
	return obj
}

type ControllerStatusStatsReply struct {
	*StatsReply
	ControllerStatus []*ControllerStatusEntry
}

type IControllerStatusStatsReply interface {
	IStatsReply
	GetControllerStatus() []*ControllerStatusEntry
}

func (self *ControllerStatusStatsReply) GetControllerStatus() []*ControllerStatusEntry {
	return self.ControllerStatus
}

func (self *ControllerStatusStatsReply) SetControllerStatus(v []*ControllerStatusEntry) {
	self.ControllerStatus = v
}

func (self *ControllerStatusStatsReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsReply.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	for _, obj := range self.ControllerStatus {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeControllerStatusStatsReply(parent *StatsReply, decoder *goloxi.Decoder) (*ControllerStatusStatsReply, error) {
	_controllerstatusstatsreply := &ControllerStatusStatsReply{StatsReply: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("ControllerStatusStatsReply packet too short: %d < 4", decoder.Length())
	}
	decoder.Skip(4)

	for decoder.Length() >= 16 {
		item, err := DecodeControllerStatusEntry(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_controllerstatusstatsreply.ControllerStatus = append(_controllerstatusstatsreply.ControllerStatus, item)
		}
	}
	return _controllerstatusstatsreply, nil
}

func NewControllerStatusStatsReply() *ControllerStatusStatsReply {
	obj := &ControllerStatusStatsReply{
		StatsReply: NewStatsReply(18),
	}
	return obj
}

type ControllerStatusStatsRequest struct {
	*StatsRequest
}

type IControllerStatusStatsRequest interface {
	IStatsRequest
}

func (self *ControllerStatusStatsRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsRequest.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeControllerStatusStatsRequest(parent *StatsRequest, decoder *goloxi.Decoder) (*ControllerStatusStatsRequest, error) {
	_controllerstatusstatsrequest := &ControllerStatusStatsRequest{StatsRequest: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("ControllerStatusStatsRequest packet too short: %d < 4", decoder.Length())
	}
	decoder.Skip(4)
	return _controllerstatusstatsrequest, nil
}

func NewControllerStatusStatsRequest() *ControllerStatusStatsRequest {
	obj := &ControllerStatusStatsRequest{
		StatsRequest: NewStatsRequest(18),
	}
	return obj
}

type DescStatsReply struct {
	*StatsReply
	MfrDesc   string
	HwDesc    string
	SwDesc    string
	SerialNum string
	DpDesc    string
}

type IDescStatsReply interface {
	IStatsReply
	GetMfrDesc() string
	GetHwDesc() string
	GetSwDesc() string
	GetSerialNum() string
	GetDpDesc() string
}

func (self *DescStatsReply) GetMfrDesc() string {
	return self.MfrDesc
}

func (self *DescStatsReply) SetMfrDesc(v string) {
	self.MfrDesc = v
}

func (self *DescStatsReply) GetHwDesc() string {
	return self.HwDesc
}

func (self *DescStatsReply) SetHwDesc(v string) {
	self.HwDesc = v
}

func (self *DescStatsReply) GetSwDesc() string {
	return self.SwDesc
}

func (self *DescStatsReply) SetSwDesc(v string) {
	self.SwDesc = v
}

func (self *DescStatsReply) GetSerialNum() string {
	return self.SerialNum
}

func (self *DescStatsReply) SetSerialNum(v string) {
	self.SerialNum = v
}

func (self *DescStatsReply) GetDpDesc() string {
	return self.DpDesc
}

func (self *DescStatsReply) SetDpDesc(v string) {
	self.DpDesc = v
}

func (self *DescStatsReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsReply.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	encoder.Write([]byte(self.MfrDesc))
	encoder.Write([]byte(self.HwDesc))
	encoder.Write([]byte(self.SwDesc))
	encoder.Write([]byte(self.SerialNum))
	encoder.Write([]byte(self.DpDesc))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeDescStatsReply(parent *StatsReply, decoder *goloxi.Decoder) (*DescStatsReply, error) {
	_descstatsreply := &DescStatsReply{StatsReply: parent}
	if decoder.Length() < 1060 {
		return nil, fmt.Errorf("DescStatsReply packet too short: %d < 1060", decoder.Length())
	}
	decoder.Skip(4)
	_descstatsreply.MfrDesc = string(bytes.Trim(decoder.Read(256), "\x00"))
	_descstatsreply.HwDesc = string(bytes.Trim(decoder.Read(256), "\x00"))
	_descstatsreply.SwDesc = string(bytes.Trim(decoder.Read(256), "\x00"))
	_descstatsreply.SerialNum = string(bytes.Trim(decoder.Read(32), "\x00"))
	_descstatsreply.DpDesc = string(bytes.Trim(decoder.Read(256), "\x00"))
	return _descstatsreply, nil
}

func NewDescStatsReply() *DescStatsReply {
	obj := &DescStatsReply{
		StatsReply: NewStatsReply(0),
	}
	return obj
}

type DescStatsRequest struct {
	*StatsRequest
}

type IDescStatsRequest interface {
	IStatsRequest
}

func (self *DescStatsRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsRequest.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeDescStatsRequest(parent *StatsRequest, decoder *goloxi.Decoder) (*DescStatsRequest, error) {
	_descstatsrequest := &DescStatsRequest{StatsRequest: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("DescStatsRequest packet too short: %d < 4", decoder.Length())
	}
	decoder.Skip(4)
	return _descstatsrequest, nil
}

func NewDescStatsRequest() *DescStatsRequest {
	obj := &DescStatsRequest{
		StatsRequest: NewStatsRequest(0),
	}
	return obj
}

type EchoReply struct {
	*Header
	Data []byte
}

type IEchoReply interface {
	IHeader
	GetData() []byte
}

func (self *EchoReply) GetData() []byte {
	return self.Data
}

func (self *EchoReply) SetData(v []byte) {
	self.Data = v
}

func (self *EchoReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.Header.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(self.Data)
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeEchoReply(parent *Header, decoder *goloxi.Decoder) (*EchoReply, error) {
	_echoreply := &EchoReply{Header: parent}
	_echoreply.Data = decoder.Read(int(decoder.Length()))
	return _echoreply, nil
}

func NewEchoReply() *EchoReply {
	obj := &EchoReply{
		Header: NewHeader(3),
	}
	return obj
}

type EchoRequest struct {
	*Header
	Data []byte
}

type IEchoRequest interface {
	IHeader
	GetData() []byte
}

func (self *EchoRequest) GetData() []byte {
	return self.Data
}

func (self *EchoRequest) SetData(v []byte) {
	self.Data = v
}

func (self *EchoRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.Header.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(self.Data)
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeEchoRequest(parent *Header, decoder *goloxi.Decoder) (*EchoRequest, error) {
	_echorequest := &EchoRequest{Header: parent}
	_echorequest.Data = decoder.Read(int(decoder.Length()))
	return _echorequest, nil
}

func NewEchoRequest() *EchoRequest {
	obj := &EchoRequest{
		Header: NewHeader(2),
	}
	return obj
}

type FeaturesReply struct {
	*Header
	DatapathId   uint64
	NBuffers     uint32
	NTables      uint8
	AuxiliaryId  uint8
	Capabilities Capabilities
	Reserved     uint32
}

type IFeaturesReply interface {
	IHeader
	GetDatapathId() uint64
	GetNBuffers() uint32
	GetNTables() uint8
	GetAuxiliaryId() uint8
	GetCapabilities() Capabilities
	GetReserved() uint32
}

func (self *FeaturesReply) GetDatapathId() uint64 {
	return self.DatapathId
}

func (self *FeaturesReply) SetDatapathId(v uint64) {
	self.DatapathId = v
}

func (self *FeaturesReply) GetNBuffers() uint32 {
	return self.NBuffers
}

func (self *FeaturesReply) SetNBuffers(v uint32) {
	self.NBuffers = v
}

func (self *FeaturesReply) GetNTables() uint8 {
	return self.NTables
}

func (self *FeaturesReply) SetNTables(v uint8) {
	self.NTables = v
}

func (self *FeaturesReply) GetAuxiliaryId() uint8 {
	return self.AuxiliaryId
}

func (self *FeaturesReply) SetAuxiliaryId(v uint8) {
	self.AuxiliaryId = v
}

func (self *FeaturesReply) GetCapabilities() Capabilities {
	return self.Capabilities
}

func (self *FeaturesReply) SetCapabilities(v Capabilities) {
	self.Capabilities = v
}

func (self *FeaturesReply) GetReserved() uint32 {
	return self.Reserved
}

func (self *FeaturesReply) SetReserved(v uint32) {
	self.Reserved = v
}

func (self *FeaturesReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.Header.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint64(uint64(self.DatapathId))
	encoder.PutUint32(uint32(self.NBuffers))
	encoder.PutUint8(uint8(self.NTables))
	encoder.PutUint8(uint8(self.AuxiliaryId))
	encoder.Write(bytes.Repeat([]byte{0}, 2))
	encoder.PutUint32(uint32(self.Capabilities))
	encoder.PutUint32(uint32(self.Reserved))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeFeaturesReply(parent *Header, decoder *goloxi.Decoder) (*FeaturesReply, error) {
	_featuresreply := &FeaturesReply{Header: parent}
	if decoder.Length() < 24 {
		return nil, fmt.Errorf("FeaturesReply packet too short: %d < 24", decoder.Length())
	}
	_featuresreply.DatapathId = uint64(decoder.ReadUint64())
	_featuresreply.NBuffers = uint32(decoder.ReadUint32())
	_featuresreply.NTables = uint8(decoder.ReadByte())
	_featuresreply.AuxiliaryId = uint8(decoder.ReadByte())
	decoder.Skip(2)
	_featuresreply.Capabilities = Capabilities(decoder.ReadUint32())
	_featuresreply.Reserved = uint32(decoder.ReadUint32())
	return _featuresreply, nil
}

func NewFeaturesReply() *FeaturesReply {
	obj := &FeaturesReply{
		Header: NewHeader(6),
	}
	return obj
}

type FeaturesRequest struct {
	*Header
}

type IFeaturesRequest interface {
	IHeader
}

func (self *FeaturesRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.Header.Serialize(encoder); err != nil {
		return err
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeFeaturesRequest(parent *Header, decoder *goloxi.Decoder) (*FeaturesRequest, error) {
	_featuresrequest := &FeaturesRequest{Header: parent}
	return _featuresrequest, nil
}

func NewFeaturesRequest() *FeaturesRequest {
	obj := &FeaturesRequest{
		Header: NewHeader(5),
	}
	return obj
}

type FlowMod struct {
	*Header
	Cookie       uint64
	CookieMask   uint64
	TableId      uint8
	Command      FmCmd
	IdleTimeout  uint16
	HardTimeout  uint16
	Priority     uint16
	BufferId     uint32
	OutPort      Port
	OutGroup     uint32
	Flags        FlowModFlags
	Importance   uint16
	Match        Match
	Instructions []IInstruction
}

type IFlowMod interface {
	IHeader
	GetCookie() uint64
	GetCookieMask() uint64
	GetTableId() uint8
	GetCommand() FmCmd
	GetIdleTimeout() uint16
	GetHardTimeout() uint16
	GetPriority() uint16
	GetBufferId() uint32
	GetOutPort() Port
	GetOutGroup() uint32
	GetFlags() FlowModFlags
	GetImportance() uint16
	GetMatch() Match
	GetInstructions() []IInstruction
}

func (self *FlowMod) GetCookie() uint64 {
	return self.Cookie
}

func (self *FlowMod) SetCookie(v uint64) {
	self.Cookie = v
}

func (self *FlowMod) GetCookieMask() uint64 {
	return self.CookieMask
}

func (self *FlowMod) SetCookieMask(v uint64) {
	self.CookieMask = v
}

func (self *FlowMod) GetTableId() uint8 {
	return self.TableId
}

func (self *FlowMod) SetTableId(v uint8) {
	self.TableId = v
}

func (self *FlowMod) GetCommand() FmCmd {
	return self.Command
}

func (self *FlowMod) SetCommand(v FmCmd) {
	self.Command = v
}

func (self *FlowMod) GetIdleTimeout() uint16 {
	return self.IdleTimeout
}

func (self *FlowMod) SetIdleTimeout(v uint16) {
	self.IdleTimeout = v
}

func (self *FlowMod) GetHardTimeout() uint16 {
	return self.HardTimeout
}

func (self *FlowMod) SetHardTimeout(v uint16) {
	self.HardTimeout = v
}

func (self *FlowMod) GetPriority() uint16 {
	return self.Priority
}

func (self *FlowMod) SetPriority(v uint16) {
	self.Priority = v
}

func (self *FlowMod) GetBufferId() uint32 {
	return self.BufferId
}

func (self *FlowMod) SetBufferId(v uint32) {
	self.BufferId = v
}

func (self *FlowMod) GetOutPort() Port {
	return self.OutPort
}

func (self *FlowMod) SetOutPort(v Port) {
	self.OutPort = v
}

func (self *FlowMod) GetOutGroup() uint32 {
	return self.OutGroup
}

func (self *FlowMod) SetOutGroup(v uint32) {
	self.OutGroup = v
}

func (self *FlowMod) GetFlags() FlowModFlags {
	return self.Flags
}

func (self *FlowMod) SetFlags(v FlowModFlags) {
	self.Flags = v
}

func (self *FlowMod) GetImportance() uint16 {
	return self.Importance
}

func (self *FlowMod) SetImportance(v uint16) {
	self.Importance = v
}

func (self *FlowMod) GetMatch() Match {
	return self.Match
}

func (self *FlowMod) SetMatch(v Match) {
	self.Match = v
}

func (self *FlowMod) GetInstructions() []IInstruction {
	return self.Instructions
}

func (self *FlowMod) SetInstructions(v []IInstruction) {
	self.Instructions = v
}

func (self *FlowMod) Serialize(encoder *goloxi.Encoder) error {
	if err := self.Header.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint64(uint64(self.Cookie))
	encoder.PutUint64(uint64(self.CookieMask))
	encoder.PutUint8(uint8(self.TableId))
	self.Command.Serialize(encoder)
	encoder.PutUint16(uint16(self.IdleTimeout))
	encoder.PutUint16(uint16(self.HardTimeout))
	encoder.PutUint16(uint16(self.Priority))
	encoder.PutUint32(uint32(self.BufferId))
	self.OutPort.Serialize(encoder)
	encoder.PutUint32(uint32(self.OutGroup))
	encoder.PutUint16(uint16(self.Flags))
	encoder.PutUint16(uint16(self.Importance))
	if err := self.Match.Serialize(encoder); err != nil {
		return err
	}

	for _, obj := range self.Instructions {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}

	return nil
}

func DecodeFlowMod(parent *Header, decoder *goloxi.Decoder) (IFlowMod, error) {
	_flowmod := &FlowMod{Header: parent}
	if decoder.Length() < 48 {
		return nil, fmt.Errorf("FlowMod packet too short: %d < 48", decoder.Length())
	}
	_flowmod.Cookie = uint64(decoder.ReadUint64())
	_flowmod.CookieMask = uint64(decoder.ReadUint64())
	_flowmod.TableId = uint8(decoder.ReadByte())
	_flowmod.Command.Decode(decoder)
	_flowmod.IdleTimeout = uint16(decoder.ReadUint16())
	_flowmod.HardTimeout = uint16(decoder.ReadUint16())
	_flowmod.Priority = uint16(decoder.ReadUint16())
	_flowmod.BufferId = uint32(decoder.ReadUint32())
	_flowmod.OutPort.Decode(decoder)
	_flowmod.OutGroup = uint32(decoder.ReadUint32())
	_flowmod.Flags = FlowModFlags(decoder.ReadUint16())
	_flowmod.Importance = uint16(decoder.ReadUint16())
	if err := _flowmod.Match.Decode(decoder); err != nil {
		return nil, err
	}

	decoder.SkipAlign()

	for decoder.Length() >= 4 {
		item, err := DecodeInstruction(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_flowmod.Instructions = append(_flowmod.Instructions, item)
		}
	}

	switch _flowmod.Command {
	case 0:
		return DecodeFlowAdd(_flowmod, decoder)
	case 1:
		return DecodeFlowModify(_flowmod, decoder)
	case 2:
		return DecodeFlowModifyStrict(_flowmod, decoder)
	case 3:
		return DecodeFlowDelete(_flowmod, decoder)
	case 4:
		return DecodeFlowDeleteStrict(_flowmod, decoder)
	default:
		return nil, fmt.Errorf("Invalid type '%d' for 'FlowMod'", _flowmod.Command)
	}
}

func NewFlowMod(__command FmCmd) *FlowMod {
	obj := &FlowMod{
		Header: NewHeader(14),
	}
	obj.Command = __command
	return obj
}

type FlowAdd struct {
	*FlowMod
}

type IFlowAdd interface {
	IFlowMod
}

func (self *FlowAdd) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.FlowMod.Serialize(encoder); err != nil {
		return err
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeFlowAdd(parent *FlowMod, decoder *goloxi.Decoder) (*FlowAdd, error) {
	_flowadd := &FlowAdd{FlowMod: parent}
	return _flowadd, nil
}

func NewFlowAdd() *FlowAdd {
	obj := &FlowAdd{
		FlowMod: NewFlowMod(0),
	}
	return obj
}

type FlowDelete struct {
	*FlowMod
}

type IFlowDelete interface {
	IFlowMod
}

func (self *FlowDelete) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.FlowMod.Serialize(encoder); err != nil {
		return err
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeFlowDelete(parent *FlowMod, decoder *goloxi.Decoder) (*FlowDelete, error) {
	_flowdelete := &FlowDelete{FlowMod: parent}
	return _flowdelete, nil
}

func NewFlowDelete() *FlowDelete {
	obj := &FlowDelete{
		FlowMod: NewFlowMod(3),
	}
	return obj
}

type FlowDeleteStrict struct {
	*FlowMod
}

type IFlowDeleteStrict interface {
	IFlowMod
}

func (self *FlowDeleteStrict) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.FlowMod.Serialize(encoder); err != nil {
		return err
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeFlowDeleteStrict(parent *FlowMod, decoder *goloxi.Decoder) (*FlowDeleteStrict, error) {
	_flowdeletestrict := &FlowDeleteStrict{FlowMod: parent}
	return _flowdeletestrict, nil
}

func NewFlowDeleteStrict() *FlowDeleteStrict {
	obj := &FlowDeleteStrict{
		FlowMod: NewFlowMod(4),
	}
	return obj
}

type FlowLightweightStatsReply struct {
	*StatsReply
	Entries []*FlowLightweightStatsEntry
}

type IFlowLightweightStatsReply interface {
	IStatsReply
	GetEntries() []*FlowLightweightStatsEntry
}

func (self *FlowLightweightStatsReply) GetEntries() []*FlowLightweightStatsEntry {
	return self.Entries
}

func (self *FlowLightweightStatsReply) SetEntries(v []*FlowLightweightStatsEntry) {
	self.Entries = v
}

func (self *FlowLightweightStatsReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsReply.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	for _, obj := range self.Entries {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeFlowLightweightStatsReply(parent *StatsReply, decoder *goloxi.Decoder) (*FlowLightweightStatsReply, error) {
	_flowlightweightstatsreply := &FlowLightweightStatsReply{StatsReply: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("FlowLightweightStatsReply packet too short: %d < 4", decoder.Length())
	}
	decoder.Skip(4)

	for decoder.Length() >= 24 {
		item, err := DecodeFlowLightweightStatsEntry(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_flowlightweightstatsreply.Entries = append(_flowlightweightstatsreply.Entries, item)
		}
	}
	return _flowlightweightstatsreply, nil
}

func NewFlowLightweightStatsReply() *FlowLightweightStatsReply {
	obj := &FlowLightweightStatsReply{
		StatsReply: NewStatsReply(17),
	}
	return obj
}

type FlowLightweightStatsRequest struct {
	*StatsRequest
	TableId    uint8
	OutPort    Port
	OutGroup   uint32
	Cookie     uint64
	CookieMask uint64
	Match      Match
}

type IFlowLightweightStatsRequest interface {
	IStatsRequest
	GetTableId() uint8
	GetOutPort() Port
	GetOutGroup() uint32
	GetCookie() uint64
	GetCookieMask() uint64
	GetMatch() Match
}

func (self *FlowLightweightStatsRequest) GetTableId() uint8 {
	return self.TableId
}

func (self *FlowLightweightStatsRequest) SetTableId(v uint8) {
	self.TableId = v
}

func (self *FlowLightweightStatsRequest) GetOutPort() Port {
	return self.OutPort
}

func (self *FlowLightweightStatsRequest) SetOutPort(v Port) {
	self.OutPort = v
}

func (self *FlowLightweightStatsRequest) GetOutGroup() uint32 {
	return self.OutGroup
}

func (self *FlowLightweightStatsRequest) SetOutGroup(v uint32) {
	self.OutGroup = v
}

func (self *FlowLightweightStatsRequest) GetCookie() uint64 {
	return self.Cookie
}

func (self *FlowLightweightStatsRequest) SetCookie(v uint64) {
	self.Cookie = v
}

func (self *FlowLightweightStatsRequest) GetCookieMask() uint64 {
	return self.CookieMask
}

func (self *FlowLightweightStatsRequest) SetCookieMask(v uint64) {
	self.CookieMask = v
}

func (self *FlowLightweightStatsRequest) GetMatch() Match {
	return self.Match
}

func (self *FlowLightweightStatsRequest) SetMatch(v Match) {
	self.Match = v
}

func (self *FlowLightweightStatsRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsRequest.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	encoder.PutUint8(uint8(self.TableId))
	encoder.Write(bytes.Repeat([]byte{0}, 3))
	self.OutPort.Serialize(encoder)
	encoder.PutUint32(uint32(self.OutGroup))
	encoder.Write(bytes.Repeat([]byte{0}, 4))
	encoder.PutUint64(uint64(self.Cookie))
	encoder.PutUint64(uint64(self.CookieMask))
	if err := self.Match.Serialize(encoder); err != nil {
		return err
	}

	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeFlowLightweightStatsRequest(parent *StatsRequest, decoder *goloxi.Decoder) (*FlowLightweightStatsRequest, error) {
	_flowlightweightstatsrequest := &FlowLightweightStatsRequest{StatsRequest: parent}
	if decoder.Length() < 28 {
		return nil, fmt.Errorf("FlowLightweightStatsRequest packet too short: %d < 28", decoder.Length())
	}
	decoder.Skip(4)
	_flowlightweightstatsrequest.TableId = uint8(decoder.ReadByte())
	decoder.Skip(3)
	_flowlightweightstatsrequest.OutPort.Decode(decoder)
	_flowlightweightstatsrequest.OutGroup = uint32(decoder.ReadUint32())
	decoder.Skip(4)
	_flowlightweightstatsrequest.Cookie = uint64(decoder.ReadUint64())
	_flowlightweightstatsrequest.CookieMask = uint64(decoder.ReadUint64())
	if err := _flowlightweightstatsrequest.Match.Decode(decoder); err != nil {
		return nil, err
	}

	decoder.SkipAlign()
	return _flowlightweightstatsrequest, nil
}

func NewFlowLightweightStatsRequest() *FlowLightweightStatsRequest {
	obj := &FlowLightweightStatsRequest{
		StatsRequest: NewStatsRequest(17),
	}
	return obj
}

type FlowModFailedErrorMsg struct {
	*ErrorMsg
	Code FlowModFailedCode
	Data []byte
}

type IFlowModFailedErrorMsg interface {
	IErrorMsg
	GetCode() FlowModFailedCode
	GetData() []byte
}

func (self *FlowModFailedErrorMsg) GetCode() FlowModFailedCode {
	return self.Code
}

func (self *FlowModFailedErrorMsg) SetCode(v FlowModFailedCode) {
	self.Code = v
}

func (self *FlowModFailedErrorMsg) GetData() []byte {
	return self.Data
}

func (self *FlowModFailedErrorMsg) SetData(v []byte) {
	self.Data = v
}

func (self *FlowModFailedErrorMsg) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.ErrorMsg.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint16(uint16(self.Code))
	encoder.Write(self.Data)
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeFlowModFailedErrorMsg(parent *ErrorMsg, decoder *goloxi.Decoder) (*FlowModFailedErrorMsg, error) {
	_flowmodfailederrormsg := &FlowModFailedErrorMsg{ErrorMsg: parent}
	if decoder.Length() < 2 {
		return nil, fmt.Errorf("FlowModFailedErrorMsg packet too short: %d < 2", decoder.Length())
	}
	_flowmodfailederrormsg.Code = FlowModFailedCode(decoder.ReadUint16())
	_flowmodfailederrormsg.Data = decoder.Read(int(decoder.Length()))
	return _flowmodfailederrormsg, nil
}

func NewFlowModFailedErrorMsg() *FlowModFailedErrorMsg {
	obj := &FlowModFailedErrorMsg{
		ErrorMsg: NewErrorMsg(5),
	}
	return obj
}

type FlowModify struct {
	*FlowMod
}

type IFlowModify interface {
	IFlowMod
}

func (self *FlowModify) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.FlowMod.Serialize(encoder); err != nil {
		return err
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeFlowModify(parent *FlowMod, decoder *goloxi.Decoder) (*FlowModify, error) {
	_flowmodify := &FlowModify{FlowMod: parent}
	return _flowmodify, nil
}

func NewFlowModify() *FlowModify {
	obj := &FlowModify{
		FlowMod: NewFlowMod(1),
	}
	return obj
}

type FlowModifyStrict struct {
	*FlowMod
}

type IFlowModifyStrict interface {
	IFlowMod
}

func (self *FlowModifyStrict) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.FlowMod.Serialize(encoder); err != nil {
		return err
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeFlowModifyStrict(parent *FlowMod, decoder *goloxi.Decoder) (*FlowModifyStrict, error) {
	_flowmodifystrict := &FlowModifyStrict{FlowMod: parent}
	return _flowmodifystrict, nil
}

func NewFlowModifyStrict() *FlowModifyStrict {
	obj := &FlowModifyStrict{
		FlowMod: NewFlowMod(2),
	}
	return obj
}

type FlowMonitorFailedErrorMsg struct {
	*ErrorMsg
	Code FlowMonitorFailedCode
	Data []byte
}

type IFlowMonitorFailedErrorMsg interface {
	IErrorMsg
	GetCode() FlowMonitorFailedCode
	GetData() []byte
}

func (self *FlowMonitorFailedErrorMsg) GetCode() FlowMonitorFailedCode {
	return self.Code
}

func (self *FlowMonitorFailedErrorMsg) SetCode(v FlowMonitorFailedCode) {
	self.Code = v
}

func (self *FlowMonitorFailedErrorMsg) GetData() []byte {
	return self.Data
}

func (self *FlowMonitorFailedErrorMsg) SetData(v []byte) {
	self.Data = v
}

func (self *FlowMonitorFailedErrorMsg) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.ErrorMsg.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint16(uint16(self.Code))
	encoder.Write(self.Data)
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeFlowMonitorFailedErrorMsg(parent *ErrorMsg, decoder *goloxi.Decoder) (*FlowMonitorFailedErrorMsg, error) {
	_flowmonitorfailederrormsg := &FlowMonitorFailedErrorMsg{ErrorMsg: parent}
	if decoder.Length() < 2 {
		return nil, fmt.Errorf("FlowMonitorFailedErrorMsg packet too short: %d < 2", decoder.Length())
	}
	_flowmonitorfailederrormsg.Code = FlowMonitorFailedCode(decoder.ReadUint16())
	_flowmonitorfailederrormsg.Data = decoder.Read(int(decoder.Length()))
	return _flowmonitorfailederrormsg, nil
}

func NewFlowMonitorFailedErrorMsg() *FlowMonitorFailedErrorMsg {
	obj := &FlowMonitorFailedErrorMsg{
		ErrorMsg: NewErrorMsg(16),
	}
	return obj
}

type FlowMonitorReply struct {
	*StatsReply
	Entries []IFlowMonitorReplyEntry
}

type IFlowMonitorReply interface {
	IStatsReply
	GetEntries() []IFlowMonitorReplyEntry
}

func (self *FlowMonitorReply) GetEntries() []IFlowMonitorReplyEntry {
	return self.Entries
}

func (self *FlowMonitorReply) SetEntries(v []IFlowMonitorReplyEntry) {
	self.Entries = v
}

func (self *FlowMonitorReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsReply.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	for _, obj := range self.Entries {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeFlowMonitorReply(parent *StatsReply, decoder *goloxi.Decoder) (*FlowMonitorReply, error) {
	_flowmonitorreply := &FlowMonitorReply{StatsReply: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("FlowMonitorReply packet too short: %d < 4", decoder.Length())
	}
	decoder.Skip(4)

	for decoder.Length() >= 4 {
		item, err := DecodeFlowMonitorReplyEntry(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_flowmonitorreply.Entries = append(_flowmonitorreply.Entries, item)
		}
	}
	return _flowmonitorreply, nil
}

func NewFlowMonitorReply() *FlowMonitorReply {
	obj := &FlowMonitorReply{
		StatsReply: NewStatsReply(16),
	}
	return obj
}

type FlowMonitorRequest struct {
	*StatsRequest
	Entries []*FlowMonitorEntry
}

type IFlowMonitorRequest interface {
	IStatsRequest
	GetEntries() []*FlowMonitorEntry
}

func (self *FlowMonitorRequest) GetEntries() []*FlowMonitorEntry {
	return self.Entries
}

func (self *FlowMonitorRequest) SetEntries(v []*FlowMonitorEntry) {
	self.Entries = v
}

func (self *FlowMonitorRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsRequest.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	for _, obj := range self.Entries {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeFlowMonitorRequest(parent *StatsRequest, decoder *goloxi.Decoder) (*FlowMonitorRequest, error) {
	_flowmonitorrequest := &FlowMonitorRequest{StatsRequest: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("FlowMonitorRequest packet too short: %d < 4", decoder.Length())
	}
	decoder.Skip(4)

	for decoder.Length() >= 24 {
		item, err := DecodeFlowMonitorEntry(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_flowmonitorrequest.Entries = append(_flowmonitorrequest.Entries, item)
		}
	}
	return _flowmonitorrequest, nil
}

func NewFlowMonitorRequest() *FlowMonitorRequest {
	obj := &FlowMonitorRequest{
		StatsRequest: NewStatsRequest(16),
	}
	return obj
}

type FlowRemoved struct {
	*Header
	TableId     uint8
	Reason      FlowRemovedReason
	Priority    uint16
	IdleTimeout uint16
	HardTimeout uint16
	Cookie      uint64
	Match       Match
	Stats       Stat
}

type IFlowRemoved interface {
	IHeader
	GetTableId() uint8
	GetReason() FlowRemovedReason
	GetPriority() uint16
	GetIdleTimeout() uint16
	GetHardTimeout() uint16
	GetCookie() uint64
	GetMatch() Match
	GetStats() Stat
}

func (self *FlowRemoved) GetTableId() uint8 {
	return self.TableId
}

func (self *FlowRemoved) SetTableId(v uint8) {
	self.TableId = v
}

func (self *FlowRemoved) GetReason() FlowRemovedReason {
	return self.Reason
}

func (self *FlowRemoved) SetReason(v FlowRemovedReason) {
	self.Reason = v
}

func (self *FlowRemoved) GetPriority() uint16 {
	return self.Priority
}

func (self *FlowRemoved) SetPriority(v uint16) {
	self.Priority = v
}

func (self *FlowRemoved) GetIdleTimeout() uint16 {
	return self.IdleTimeout
}

func (self *FlowRemoved) SetIdleTimeout(v uint16) {
	self.IdleTimeout = v
}

func (self *FlowRemoved) GetHardTimeout() uint16 {
	return self.HardTimeout
}

func (self *FlowRemoved) SetHardTimeout(v uint16) {
	self.HardTimeout = v
}

func (self *FlowRemoved) GetCookie() uint64 {
	return self.Cookie
}

func (self *FlowRemoved) SetCookie(v uint64) {
	self.Cookie = v
}

func (self *FlowRemoved) GetMatch() Match {
	return self.Match
}

func (self *FlowRemoved) SetMatch(v Match) {
	self.Match = v
}

func (self *FlowRemoved) GetStats() Stat {
	return self.Stats
}

func (self *FlowRemoved) SetStats(v Stat) {
	self.Stats = v
}

func (self *FlowRemoved) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.Header.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint8(uint8(self.TableId))
	encoder.PutUint8(uint8(self.Reason))
	encoder.PutUint16(uint16(self.Priority))
	encoder.PutUint16(uint16(self.IdleTimeout))
	encoder.PutUint16(uint16(self.HardTimeout))
	encoder.PutUint64(uint64(self.Cookie))
	if err := self.Match.Serialize(encoder); err != nil {
		return err
	}

	if err := self.Stats.Serialize(encoder); err != nil {
		return err
	}

	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeFlowRemoved(parent *Header, decoder *goloxi.Decoder) (*FlowRemoved, error) {
	_flowremoved := &FlowRemoved{Header: parent}
	if decoder.Length() < 32 {
		return nil, fmt.Errorf("FlowRemoved packet too short: %d < 32", decoder.Length())
	}
	_flowremoved.TableId = uint8(decoder.ReadByte())
	_flowremoved.Reason = FlowRemovedReason(decoder.ReadByte())
	_flowremoved.Priority = uint16(decoder.ReadUint16())
	_flowremoved.IdleTimeout = uint16(decoder.ReadUint16())
	_flowremoved.HardTimeout = uint16(decoder.ReadUint16())
	_flowremoved.Cookie = uint64(decoder.ReadUint64())
	if err := _flowremoved.Match.Decode(decoder); err != nil {
		return nil, err
	}

	decoder.SkipAlign()
	if err := _flowremoved.Stats.Decode(decoder); err != nil {
		return nil, err
	}

	decoder.SkipAlign()
	return _flowremoved, nil
}

func NewFlowRemoved() *FlowRemoved {
	obj := &FlowRemoved{
		Header: NewHeader(11),
	}
	return obj
}

type FlowStatsReply struct {
	*StatsReply
	Entries []*FlowStatsEntry
}

type IFlowStatsReply interface {
	IStatsReply
	GetEntries() []*FlowStatsEntry
}

func (self *FlowStatsReply) GetEntries() []*FlowStatsEntry {
	return self.Entries
}

func (self *FlowStatsReply) SetEntries(v []*FlowStatsEntry) {
	self.Entries = v
}

func (self *FlowStatsReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsReply.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	for _, obj := range self.Entries {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeFlowStatsReply(parent *StatsReply, decoder *goloxi.Decoder) (*FlowStatsReply, error) {
	_flowstatsreply := &FlowStatsReply{StatsReply: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("FlowStatsReply packet too short: %d < 4", decoder.Length())
	}
	decoder.Skip(4)

	for decoder.Length() >= 40 {
		item, err := DecodeFlowStatsEntry(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_flowstatsreply.Entries = append(_flowstatsreply.Entries, item)
		}
	}
	return _flowstatsreply, nil
}

func NewFlowStatsReply() *FlowStatsReply {
	obj := &FlowStatsReply{
		StatsReply: NewStatsReply(1),
	}
	return obj
}

type FlowStatsRequest struct {
	*StatsRequest
	TableId    uint8
	OutPort    Port
	OutGroup   uint32
	Cookie     uint64
	CookieMask uint64
	Match      Match
}

type IFlowStatsRequest interface {
	IStatsRequest
	GetTableId() uint8
	GetOutPort() Port
	GetOutGroup() uint32
	GetCookie() uint64
	GetCookieMask() uint64
	GetMatch() Match
}

func (self *FlowStatsRequest) GetTableId() uint8 {
	return self.TableId
}

func (self *FlowStatsRequest) SetTableId(v uint8) {
	self.TableId = v
}

func (self *FlowStatsRequest) GetOutPort() Port {
	return self.OutPort
}

func (self *FlowStatsRequest) SetOutPort(v Port) {
	self.OutPort = v
}

func (self *FlowStatsRequest) GetOutGroup() uint32 {
	return self.OutGroup
}

func (self *FlowStatsRequest) SetOutGroup(v uint32) {
	self.OutGroup = v
}

func (self *FlowStatsRequest) GetCookie() uint64 {
	return self.Cookie
}

func (self *FlowStatsRequest) SetCookie(v uint64) {
	self.Cookie = v
}

func (self *FlowStatsRequest) GetCookieMask() uint64 {
	return self.CookieMask
}

func (self *FlowStatsRequest) SetCookieMask(v uint64) {
	self.CookieMask = v
}

func (self *FlowStatsRequest) GetMatch() Match {
	return self.Match
}

func (self *FlowStatsRequest) SetMatch(v Match) {
	self.Match = v
}

func (self *FlowStatsRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsRequest.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	encoder.PutUint8(uint8(self.TableId))
	encoder.Write(bytes.Repeat([]byte{0}, 3))
	self.OutPort.Serialize(encoder)
	encoder.PutUint32(uint32(self.OutGroup))
	encoder.Write(bytes.Repeat([]byte{0}, 4))
	encoder.PutUint64(uint64(self.Cookie))
	encoder.PutUint64(uint64(self.CookieMask))
	if err := self.Match.Serialize(encoder); err != nil {
		return err
	}

	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeFlowStatsRequest(parent *StatsRequest, decoder *goloxi.Decoder) (*FlowStatsRequest, error) {
	_flowstatsrequest := &FlowStatsRequest{StatsRequest: parent}
	if decoder.Length() < 28 {
		return nil, fmt.Errorf("FlowStatsRequest packet too short: %d < 28", decoder.Length())
	}
	decoder.Skip(4)
	_flowstatsrequest.TableId = uint8(decoder.ReadByte())
	decoder.Skip(3)
	_flowstatsrequest.OutPort.Decode(decoder)
	_flowstatsrequest.OutGroup = uint32(decoder.ReadUint32())
	decoder.Skip(4)
	_flowstatsrequest.Cookie = uint64(decoder.ReadUint64())
	_flowstatsrequest.CookieMask = uint64(decoder.ReadUint64())
	if err := _flowstatsrequest.Match.Decode(decoder); err != nil {
		return nil, err
	}

	decoder.SkipAlign()
	return _flowstatsrequest, nil
}

func NewFlowStatsRequest() *FlowStatsRequest {
	obj := &FlowStatsRequest{
		StatsRequest: NewStatsRequest(1),
	}
	return obj
}

type GetConfigReply struct {
	*Header
	Flags       ConfigFlags
	MissSendLen uint16
}

type IGetConfigReply interface {
	IHeader
	GetFlags() ConfigFlags
	GetMissSendLen() uint16
}

func (self *GetConfigReply) GetFlags() ConfigFlags {
	return self.Flags
}

func (self *GetConfigReply) SetFlags(v ConfigFlags) {
	self.Flags = v
}

func (self *GetConfigReply) GetMissSendLen() uint16 {
	return self.MissSendLen
}

func (self *GetConfigReply) SetMissSendLen(v uint16) {
	self.MissSendLen = v
}

func (self *GetConfigReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.Header.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint16(uint16(self.Flags))
	encoder.PutUint16(uint16(self.MissSendLen))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeGetConfigReply(parent *Header, decoder *goloxi.Decoder) (*GetConfigReply, error) {
	_getconfigreply := &GetConfigReply{Header: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("GetConfigReply packet too short: %d < 4", decoder.Length())
	}
	_getconfigreply.Flags = ConfigFlags(decoder.ReadUint16())
	_getconfigreply.MissSendLen = uint16(decoder.ReadUint16())
	return _getconfigreply, nil
}

func NewGetConfigReply() *GetConfigReply {
	obj := &GetConfigReply{
		Header: NewHeader(8),
	}
	return obj
}

type GetConfigRequest struct {
	*Header
}

type IGetConfigRequest interface {
	IHeader
}

func (self *GetConfigRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.Header.Serialize(encoder); err != nil {
		return err
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeGetConfigRequest(parent *Header, decoder *goloxi.Decoder) (*GetConfigRequest, error) {
	_getconfigrequest := &GetConfigRequest{Header: parent}
	return _getconfigrequest, nil
}

func NewGetConfigRequest() *GetConfigRequest {
	obj := &GetConfigRequest{
		Header: NewHeader(7),
	}
	return obj
}

type GroupMod struct {
	*Header
	Command         GroupModCommand
	GroupType       GroupType
	GroupId         uint32
	BucketArrayLen  uint16
	CommandBucketId GroupBucket
	Buckets         []*Bucket
	Properties      []IGroupProp
}

type IGroupMod interface {
	IHeader
	GetCommand() GroupModCommand
	GetGroupType() GroupType
	GetGroupId() uint32
	GetBucketArrayLen() uint16
	GetCommandBucketId() GroupBucket
	GetBuckets() []*Bucket
	GetProperties() []IGroupProp
}

func (self *GroupMod) GetCommand() GroupModCommand {
	return self.Command
}

func (self *GroupMod) SetCommand(v GroupModCommand) {
	self.Command = v
}

func (self *GroupMod) GetGroupType() GroupType {
	return self.GroupType
}

func (self *GroupMod) SetGroupType(v GroupType) {
	self.GroupType = v
}

func (self *GroupMod) GetGroupId() uint32 {
	return self.GroupId
}

func (self *GroupMod) SetGroupId(v uint32) {
	self.GroupId = v
}

func (self *GroupMod) GetBucketArrayLen() uint16 {
	return self.BucketArrayLen
}

func (self *GroupMod) SetBucketArrayLen(v uint16) {
	self.BucketArrayLen = v
}

func (self *GroupMod) GetCommandBucketId() GroupBucket {
	return self.CommandBucketId
}

func (self *GroupMod) SetCommandBucketId(v GroupBucket) {
	self.CommandBucketId = v
}

func (self *GroupMod) GetBuckets() []*Bucket {
	return self.Buckets
}

func (self *GroupMod) SetBuckets(v []*Bucket) {
	self.Buckets = v
}

func (self *GroupMod) GetProperties() []IGroupProp {
	return self.Properties
}

func (self *GroupMod) SetProperties(v []IGroupProp) {
	self.Properties = v
}

func (self *GroupMod) Serialize(encoder *goloxi.Encoder) error {
	if err := self.Header.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint16(uint16(self.Command))
	encoder.PutUint8(uint8(self.GroupType))
	encoder.Write(bytes.Repeat([]byte{0}, 1))
	encoder.PutUint32(uint32(self.GroupId))
	encoder.PutUint16(uint16(self.BucketArrayLen))
	encoder.Write(bytes.Repeat([]byte{0}, 2))
	encoder.PutUint32(uint32(self.CommandBucketId))
	for _, obj := range self.Buckets {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	for _, obj := range self.Properties {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}

	return nil
}

func DecodeGroupMod(parent *Header, decoder *goloxi.Decoder) (IGroupMod, error) {
	_groupmod := &GroupMod{Header: parent}
	if decoder.Length() < 16 {
		return nil, fmt.Errorf("GroupMod packet too short: %d < 16", decoder.Length())
	}
	_groupmod.Command = GroupModCommand(decoder.ReadUint16())
	_groupmod.GroupType = GroupType(decoder.ReadByte())
	decoder.Skip(1)
	_groupmod.GroupId = uint32(decoder.ReadUint32())
	_groupmod.BucketArrayLen = uint16(decoder.ReadUint16())
	decoder.Skip(2)
	_groupmod.CommandBucketId = GroupBucket(decoder.ReadUint32())

	end := decoder.Offset() + int(_groupmod.BucketArrayLen)
	for decoder.Offset() < end {
		item, err := DecodeBucket(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_groupmod.Buckets = append(_groupmod.Buckets, item)
		}
	}

	for decoder.Length() >= 4 {
		item, err := DecodeGroupProp(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_groupmod.Properties = append(_groupmod.Properties, item)
		}
	}

	switch _groupmod.Command {
	case 0:
		return DecodeGroupAdd(_groupmod, decoder)
	case 1:
		return DecodeGroupModify(_groupmod, decoder)
	case 2:
		return DecodeGroupDelete(_groupmod, decoder)
	case 3:
		return DecodeGroupInsertBucket(_groupmod, decoder)
	case 5:
		return DecodeGroupRemoveBucket(_groupmod, decoder)
	default:
		return nil, fmt.Errorf("Invalid type '%d' for 'GroupMod'", _groupmod.Command)
	}
}

func NewGroupMod(_command GroupModCommand) *GroupMod {
	obj := &GroupMod{
		Header: NewHeader(15),
	}
	obj.Command = _command
	return obj
}

type GroupAdd struct {
	*GroupMod
}

type IGroupAdd interface {
	IGroupMod
}

func (self *GroupAdd) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.GroupMod.Serialize(encoder); err != nil {
		return err
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeGroupAdd(parent *GroupMod, decoder *goloxi.Decoder) (*GroupAdd, error) {
	_groupadd := &GroupAdd{GroupMod: parent}
	return _groupadd, nil
}

func NewGroupAdd() *GroupAdd {
	obj := &GroupAdd{
		GroupMod: NewGroupMod(0),
	}
	return obj
}

type GroupDelete struct {
	*GroupMod
}

type IGroupDelete interface {
	IGroupMod
}

func (self *GroupDelete) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.GroupMod.Serialize(encoder); err != nil {
		return err
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeGroupDelete(parent *GroupMod, decoder *goloxi.Decoder) (*GroupDelete, error) {
	_groupdelete := &GroupDelete{GroupMod: parent}
	return _groupdelete, nil
}

func NewGroupDelete() *GroupDelete {
	obj := &GroupDelete{
		GroupMod: NewGroupMod(2),
	}
	return obj
}

type GroupDescStatsReply struct {
	*StatsReply
	Entries []*GroupDescStatsEntry
}

type IGroupDescStatsReply interface {
	IStatsReply
	GetEntries() []*GroupDescStatsEntry
}

func (self *GroupDescStatsReply) GetEntries() []*GroupDescStatsEntry {
	return self.Entries
}

func (self *GroupDescStatsReply) SetEntries(v []*GroupDescStatsEntry) {
	self.Entries = v
}

func (self *GroupDescStatsReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsReply.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	for _, obj := range self.Entries {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeGroupDescStatsReply(parent *StatsReply, decoder *goloxi.Decoder) (*GroupDescStatsReply, error) {
	_groupdescstatsreply := &GroupDescStatsReply{StatsReply: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("GroupDescStatsReply packet too short: %d < 4", decoder.Length())
	}
	decoder.Skip(4)

	for decoder.Length() >= 16 {
		item, err := DecodeGroupDescStatsEntry(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_groupdescstatsreply.Entries = append(_groupdescstatsreply.Entries, item)
		}
	}
	return _groupdescstatsreply, nil
}

func NewGroupDescStatsReply() *GroupDescStatsReply {
	obj := &GroupDescStatsReply{
		StatsReply: NewStatsReply(7),
	}
	return obj
}

type GroupDescStatsRequest struct {
	*StatsRequest
	GroupId uint32
}

type IGroupDescStatsRequest interface {
	IStatsRequest
	GetGroupId() uint32
}

func (self *GroupDescStatsRequest) GetGroupId() uint32 {
	return self.GroupId
}

func (self *GroupDescStatsRequest) SetGroupId(v uint32) {
	self.GroupId = v
}

func (self *GroupDescStatsRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsRequest.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	encoder.PutUint32(uint32(self.GroupId))
	encoder.Write(bytes.Repeat([]byte{0}, 4))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeGroupDescStatsRequest(parent *StatsRequest, decoder *goloxi.Decoder) (*GroupDescStatsRequest, error) {
	_groupdescstatsrequest := &GroupDescStatsRequest{StatsRequest: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("GroupDescStatsRequest packet too short: %d < 4", decoder.Length())
	}
	decoder.Skip(4)
	_groupdescstatsrequest.GroupId = uint32(decoder.ReadUint32())
	decoder.Skip(4)
	return _groupdescstatsrequest, nil
}

func NewGroupDescStatsRequest() *GroupDescStatsRequest {
	obj := &GroupDescStatsRequest{
		StatsRequest: NewStatsRequest(7),
	}
	return obj
}

type GroupFeaturesStatsReply struct {
	*StatsReply
	Types             uint32
	Capabilities      GroupCapabilities
	MaxGroupsAll      uint32
	MaxGroupsSelect   uint32
	MaxGroupsIndirect uint32
	MaxGroupsFf       uint32
	ActionsAll        uint32
	ActionsSelect     uint32
	ActionsIndirect   uint32
	ActionsFf         uint32
}

type IGroupFeaturesStatsReply interface {
	IStatsReply
	GetTypes() uint32
	GetCapabilities() GroupCapabilities
	GetMaxGroupsAll() uint32
	GetMaxGroupsSelect() uint32
	GetMaxGroupsIndirect() uint32
	GetMaxGroupsFf() uint32
	GetActionsAll() uint32
	GetActionsSelect() uint32
	GetActionsIndirect() uint32
	GetActionsFf() uint32
}

func (self *GroupFeaturesStatsReply) GetTypes() uint32 {
	return self.Types
}

func (self *GroupFeaturesStatsReply) SetTypes(v uint32) {
	self.Types = v
}

func (self *GroupFeaturesStatsReply) GetCapabilities() GroupCapabilities {
	return self.Capabilities
}

func (self *GroupFeaturesStatsReply) SetCapabilities(v GroupCapabilities) {
	self.Capabilities = v
}

func (self *GroupFeaturesStatsReply) GetMaxGroupsAll() uint32 {
	return self.MaxGroupsAll
}

func (self *GroupFeaturesStatsReply) SetMaxGroupsAll(v uint32) {
	self.MaxGroupsAll = v
}

func (self *GroupFeaturesStatsReply) GetMaxGroupsSelect() uint32 {
	return self.MaxGroupsSelect
}

func (self *GroupFeaturesStatsReply) SetMaxGroupsSelect(v uint32) {
	self.MaxGroupsSelect = v
}

func (self *GroupFeaturesStatsReply) GetMaxGroupsIndirect() uint32 {
	return self.MaxGroupsIndirect
}

func (self *GroupFeaturesStatsReply) SetMaxGroupsIndirect(v uint32) {
	self.MaxGroupsIndirect = v
}

func (self *GroupFeaturesStatsReply) GetMaxGroupsFf() uint32 {
	return self.MaxGroupsFf
}

func (self *GroupFeaturesStatsReply) SetMaxGroupsFf(v uint32) {
	self.MaxGroupsFf = v
}

func (self *GroupFeaturesStatsReply) GetActionsAll() uint32 {
	return self.ActionsAll
}

func (self *GroupFeaturesStatsReply) SetActionsAll(v uint32) {
	self.ActionsAll = v
}

func (self *GroupFeaturesStatsReply) GetActionsSelect() uint32 {
	return self.ActionsSelect
}

func (self *GroupFeaturesStatsReply) SetActionsSelect(v uint32) {
	self.ActionsSelect = v
}

func (self *GroupFeaturesStatsReply) GetActionsIndirect() uint32 {
	return self.ActionsIndirect
}

func (self *GroupFeaturesStatsReply) SetActionsIndirect(v uint32) {
	self.ActionsIndirect = v
}

func (self *GroupFeaturesStatsReply) GetActionsFf() uint32 {
	return self.ActionsFf
}

func (self *GroupFeaturesStatsReply) SetActionsFf(v uint32) {
	self.ActionsFf = v
}

func (self *GroupFeaturesStatsReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsReply.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	encoder.PutUint32(uint32(self.Types))
	encoder.PutUint32(uint32(self.Capabilities))
	encoder.PutUint32(uint32(self.MaxGroupsAll))
	encoder.PutUint32(uint32(self.MaxGroupsSelect))
	encoder.PutUint32(uint32(self.MaxGroupsIndirect))
	encoder.PutUint32(uint32(self.MaxGroupsFf))
	encoder.PutUint32(uint32(self.ActionsAll))
	encoder.PutUint32(uint32(self.ActionsSelect))
	encoder.PutUint32(uint32(self.ActionsIndirect))
	encoder.PutUint32(uint32(self.ActionsFf))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeGroupFeaturesStatsReply(parent *StatsReply, decoder *goloxi.Decoder) (*GroupFeaturesStatsReply, error) {
	_groupfeaturesstatsreply := &GroupFeaturesStatsReply{StatsReply: parent}
	if decoder.Length() < 44 {
		return nil, fmt.Errorf("GroupFeaturesStatsReply packet too short: %d < 44", decoder.Length())
	}
	decoder.Skip(4)
	_groupfeaturesstatsreply.Types = uint32(decoder.ReadUint32())
	_groupfeaturesstatsreply.Capabilities = GroupCapabilities(decoder.ReadUint32())
	_groupfeaturesstatsreply.MaxGroupsAll = uint32(decoder.ReadUint32())
	_groupfeaturesstatsreply.MaxGroupsSelect = uint32(decoder.ReadUint32())
	_groupfeaturesstatsreply.MaxGroupsIndirect = uint32(decoder.ReadUint32())
	_groupfeaturesstatsreply.MaxGroupsFf = uint32(decoder.ReadUint32())
	_groupfeaturesstatsreply.ActionsAll = uint32(decoder.ReadUint32())
	_groupfeaturesstatsreply.ActionsSelect = uint32(decoder.ReadUint32())
	_groupfeaturesstatsreply.ActionsIndirect = uint32(decoder.ReadUint32())
	_groupfeaturesstatsreply.ActionsFf = uint32(decoder.ReadUint32())
	return _groupfeaturesstatsreply, nil
}

func NewGroupFeaturesStatsReply() *GroupFeaturesStatsReply {
	obj := &GroupFeaturesStatsReply{
		StatsReply: NewStatsReply(8),
	}
	return obj
}

type GroupFeaturesStatsRequest struct {
	*StatsRequest
}

type IGroupFeaturesStatsRequest interface {
	IStatsRequest
}

func (self *GroupFeaturesStatsRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsRequest.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeGroupFeaturesStatsRequest(parent *StatsRequest, decoder *goloxi.Decoder) (*GroupFeaturesStatsRequest, error) {
	_groupfeaturesstatsrequest := &GroupFeaturesStatsRequest{StatsRequest: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("GroupFeaturesStatsRequest packet too short: %d < 4", decoder.Length())
	}
	decoder.Skip(4)
	return _groupfeaturesstatsrequest, nil
}

func NewGroupFeaturesStatsRequest() *GroupFeaturesStatsRequest {
	obj := &GroupFeaturesStatsRequest{
		StatsRequest: NewStatsRequest(8),
	}
	return obj
}

type GroupInsertBucket struct {
	*GroupMod
}

type IGroupInsertBucket interface {
	IGroupMod
}

func (self *GroupInsertBucket) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.GroupMod.Serialize(encoder); err != nil {
		return err
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeGroupInsertBucket(parent *GroupMod, decoder *goloxi.Decoder) (*GroupInsertBucket, error) {
	_groupinsertbucket := &GroupInsertBucket{GroupMod: parent}
	return _groupinsertbucket, nil
}

func NewGroupInsertBucket() *GroupInsertBucket {
	obj := &GroupInsertBucket{
		GroupMod: NewGroupMod(3),
	}
	return obj
}

type GroupModFailedErrorMsg struct {
	*ErrorMsg
	Code GroupModFailedCode
	Data []byte
}

type IGroupModFailedErrorMsg interface {
	IErrorMsg
	GetCode() GroupModFailedCode
	GetData() []byte
}

func (self *GroupModFailedErrorMsg) GetCode() GroupModFailedCode {
	return self.Code
}

func (self *GroupModFailedErrorMsg) SetCode(v GroupModFailedCode) {
	self.Code = v
}

func (self *GroupModFailedErrorMsg) GetData() []byte {
	return self.Data
}

func (self *GroupModFailedErrorMsg) SetData(v []byte) {
	self.Data = v
}

func (self *GroupModFailedErrorMsg) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.ErrorMsg.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint16(uint16(self.Code))
	encoder.Write(self.Data)
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeGroupModFailedErrorMsg(parent *ErrorMsg, decoder *goloxi.Decoder) (*GroupModFailedErrorMsg, error) {
	_groupmodfailederrormsg := &GroupModFailedErrorMsg{ErrorMsg: parent}
	if decoder.Length() < 2 {
		return nil, fmt.Errorf("GroupModFailedErrorMsg packet too short: %d < 2", decoder.Length())
	}
	_groupmodfailederrormsg.Code = GroupModFailedCode(decoder.ReadUint16())
	_groupmodfailederrormsg.Data = decoder.Read(int(decoder.Length()))
	return _groupmodfailederrormsg, nil
}

func NewGroupModFailedErrorMsg() *GroupModFailedErrorMsg {
	obj := &GroupModFailedErrorMsg{
		ErrorMsg: NewErrorMsg(6),
	}
	return obj
}

type GroupModify struct {
	*GroupMod
}

type IGroupModify interface {
	IGroupMod
}

func (self *GroupModify) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.GroupMod.Serialize(encoder); err != nil {
		return err
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeGroupModify(parent *GroupMod, decoder *goloxi.Decoder) (*GroupModify, error) {
	_groupmodify := &GroupModify{GroupMod: parent}
	return _groupmodify, nil
}

func NewGroupModify() *GroupModify {
	obj := &GroupModify{
		GroupMod: NewGroupMod(1),
	}
	return obj
}

type GroupRemoveBucket struct {
	*GroupMod
}

type IGroupRemoveBucket interface {
	IGroupMod
}

func (self *GroupRemoveBucket) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.GroupMod.Serialize(encoder); err != nil {
		return err
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeGroupRemoveBucket(parent *GroupMod, decoder *goloxi.Decoder) (*GroupRemoveBucket, error) {
	_groupremovebucket := &GroupRemoveBucket{GroupMod: parent}
	return _groupremovebucket, nil
}

func NewGroupRemoveBucket() *GroupRemoveBucket {
	obj := &GroupRemoveBucket{
		GroupMod: NewGroupMod(5),
	}
	return obj
}

type GroupStatsReply struct {
	*StatsReply
	Entries []*GroupStatsEntry
}

type IGroupStatsReply interface {
	IStatsReply
	GetEntries() []*GroupStatsEntry
}

func (self *GroupStatsReply) GetEntries() []*GroupStatsEntry {
	return self.Entries
}

func (self *GroupStatsReply) SetEntries(v []*GroupStatsEntry) {
	self.Entries = v
}

func (self *GroupStatsReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsReply.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	for _, obj := range self.Entries {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeGroupStatsReply(parent *StatsReply, decoder *goloxi.Decoder) (*GroupStatsReply, error) {
	_groupstatsreply := &GroupStatsReply{StatsReply: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("GroupStatsReply packet too short: %d < 4", decoder.Length())
	}
	decoder.Skip(4)

	for decoder.Length() >= 40 {
		item, err := DecodeGroupStatsEntry(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_groupstatsreply.Entries = append(_groupstatsreply.Entries, item)
		}
	}
	return _groupstatsreply, nil
}

func NewGroupStatsReply() *GroupStatsReply {
	obj := &GroupStatsReply{
		StatsReply: NewStatsReply(6),
	}
	return obj
}

type GroupStatsRequest struct {
	*StatsRequest
	GroupId uint32
}

type IGroupStatsRequest interface {
	IStatsRequest
	GetGroupId() uint32
}

func (self *GroupStatsRequest) GetGroupId() uint32 {
	return self.GroupId
}

func (self *GroupStatsRequest) SetGroupId(v uint32) {
	self.GroupId = v
}

func (self *GroupStatsRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsRequest.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	encoder.PutUint32(uint32(self.GroupId))
	encoder.Write(bytes.Repeat([]byte{0}, 4))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeGroupStatsRequest(parent *StatsRequest, decoder *goloxi.Decoder) (*GroupStatsRequest, error) {
	_groupstatsrequest := &GroupStatsRequest{StatsRequest: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("GroupStatsRequest packet too short: %d < 4", decoder.Length())
	}
	decoder.Skip(4)
	_groupstatsrequest.GroupId = uint32(decoder.ReadUint32())
	decoder.Skip(4)
	return _groupstatsrequest, nil
}

func NewGroupStatsRequest() *GroupStatsRequest {
	obj := &GroupStatsRequest{
		StatsRequest: NewStatsRequest(6),
	}
	return obj
}

type Hello struct {
	*Header
	Elements []IHelloElem
}

type IHello interface {
	IHeader
	GetElements() []IHelloElem
}

func (self *Hello) GetElements() []IHelloElem {
	return self.Elements
}

func (self *Hello) SetElements(v []IHelloElem) {
	self.Elements = v
}

func (self *Hello) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.Header.Serialize(encoder); err != nil {
		return err
	}

	for _, obj := range self.Elements {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeHello(parent *Header, decoder *goloxi.Decoder) (*Hello, error) {
	_hello := &Hello{Header: parent}

	for decoder.Length() >= 4 {
		item, err := DecodeHelloElem(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_hello.Elements = append(_hello.Elements, item)
		}
	}
	return _hello, nil
}

func NewHello() *Hello {
	obj := &Hello{
		Header: NewHeader(0),
	}
	return obj
}

type HelloFailedErrorMsg struct {
	*ErrorMsg
	Code HelloFailedCode
	Data []byte
}

type IHelloFailedErrorMsg interface {
	IErrorMsg
	GetCode() HelloFailedCode
	GetData() []byte
}

func (self *HelloFailedErrorMsg) GetCode() HelloFailedCode {
	return self.Code
}

func (self *HelloFailedErrorMsg) SetCode(v HelloFailedCode) {
	self.Code = v
}

func (self *HelloFailedErrorMsg) GetData() []byte {
	return self.Data
}

func (self *HelloFailedErrorMsg) SetData(v []byte) {
	self.Data = v
}

func (self *HelloFailedErrorMsg) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.ErrorMsg.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint16(uint16(self.Code))
	encoder.Write(self.Data)
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeHelloFailedErrorMsg(parent *ErrorMsg, decoder *goloxi.Decoder) (*HelloFailedErrorMsg, error) {
	_hellofailederrormsg := &HelloFailedErrorMsg{ErrorMsg: parent}
	if decoder.Length() < 2 {
		return nil, fmt.Errorf("HelloFailedErrorMsg packet too short: %d < 2", decoder.Length())
	}
	_hellofailederrormsg.Code = HelloFailedCode(decoder.ReadUint16())
	_hellofailederrormsg.Data = decoder.Read(int(decoder.Length()))
	return _hellofailederrormsg, nil
}

func NewHelloFailedErrorMsg() *HelloFailedErrorMsg {
	obj := &HelloFailedErrorMsg{
		ErrorMsg: NewErrorMsg(0),
	}
	return obj
}

type MeterConfigStatsReply struct {
	*StatsReply
	Entries []*MeterConfig
}

type IMeterConfigStatsReply interface {
	IStatsReply
	GetEntries() []*MeterConfig
}

func (self *MeterConfigStatsReply) GetEntries() []*MeterConfig {
	return self.Entries
}

func (self *MeterConfigStatsReply) SetEntries(v []*MeterConfig) {
	self.Entries = v
}

func (self *MeterConfigStatsReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsReply.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	for _, obj := range self.Entries {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeMeterConfigStatsReply(parent *StatsReply, decoder *goloxi.Decoder) (*MeterConfigStatsReply, error) {
	_meterconfigstatsreply := &MeterConfigStatsReply{StatsReply: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("MeterConfigStatsReply packet too short: %d < 4", decoder.Length())
	}
	decoder.Skip(4)

	for decoder.Length() >= 8 {
		item, err := DecodeMeterConfig(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_meterconfigstatsreply.Entries = append(_meterconfigstatsreply.Entries, item)
		}
	}
	return _meterconfigstatsreply, nil
}

func NewMeterConfigStatsReply() *MeterConfigStatsReply {
	obj := &MeterConfigStatsReply{
		StatsReply: NewStatsReply(10),
	}
	return obj
}

type MeterConfigStatsRequest struct {
	*StatsRequest
	MeterId uint32
}

type IMeterConfigStatsRequest interface {
	IStatsRequest
	GetMeterId() uint32
}

func (self *MeterConfigStatsRequest) GetMeterId() uint32 {
	return self.MeterId
}

func (self *MeterConfigStatsRequest) SetMeterId(v uint32) {
	self.MeterId = v
}

func (self *MeterConfigStatsRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsRequest.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	encoder.PutUint32(uint32(self.MeterId))
	encoder.Write(bytes.Repeat([]byte{0}, 4))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeMeterConfigStatsRequest(parent *StatsRequest, decoder *goloxi.Decoder) (*MeterConfigStatsRequest, error) {
	_meterconfigstatsrequest := &MeterConfigStatsRequest{StatsRequest: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("MeterConfigStatsRequest packet too short: %d < 4", decoder.Length())
	}
	decoder.Skip(4)
	_meterconfigstatsrequest.MeterId = uint32(decoder.ReadUint32())
	decoder.Skip(4)
	return _meterconfigstatsrequest, nil
}

func NewMeterConfigStatsRequest() *MeterConfigStatsRequest {
	obj := &MeterConfigStatsRequest{
		StatsRequest: NewStatsRequest(10),
	}
	return obj
}

type MeterFeaturesStatsReply struct {
	*StatsReply
	Features MeterFeatures
}

type IMeterFeaturesStatsReply interface {
	IStatsReply
	GetFeatures() MeterFeatures
}

func (self *MeterFeaturesStatsReply) GetFeatures() MeterFeatures {
	return self.Features
}

func (self *MeterFeaturesStatsReply) SetFeatures(v MeterFeatures) {
	self.Features = v
}

func (self *MeterFeaturesStatsReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsReply.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	if err := self.Features.Serialize(encoder); err != nil {
		return err
	}

	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeMeterFeaturesStatsReply(parent *StatsReply, decoder *goloxi.Decoder) (*MeterFeaturesStatsReply, error) {
	_meterfeaturesstatsreply := &MeterFeaturesStatsReply{StatsReply: parent}
	if decoder.Length() < 28 {
		return nil, fmt.Errorf("MeterFeaturesStatsReply packet too short: %d < 28", decoder.Length())
	}
	decoder.Skip(4)
	if err := _meterfeaturesstatsreply.Features.Decode(decoder); err != nil {
		return nil, err
	}

	return _meterfeaturesstatsreply, nil
}

func NewMeterFeaturesStatsReply() *MeterFeaturesStatsReply {
	obj := &MeterFeaturesStatsReply{
		StatsReply: NewStatsReply(11),
	}
	return obj
}

type MeterFeaturesStatsRequest struct {
	*StatsRequest
}

type IMeterFeaturesStatsRequest interface {
	IStatsRequest
}

func (self *MeterFeaturesStatsRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsRequest.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeMeterFeaturesStatsRequest(parent *StatsRequest, decoder *goloxi.Decoder) (*MeterFeaturesStatsRequest, error) {
	_meterfeaturesstatsrequest := &MeterFeaturesStatsRequest{StatsRequest: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("MeterFeaturesStatsRequest packet too short: %d < 4", decoder.Length())
	}
	decoder.Skip(4)
	return _meterfeaturesstatsrequest, nil
}

func NewMeterFeaturesStatsRequest() *MeterFeaturesStatsRequest {
	obj := &MeterFeaturesStatsRequest{
		StatsRequest: NewStatsRequest(11),
	}
	return obj
}

type MeterMod struct {
	*Header
	Command MeterModCommand
	Flags   MeterFlags
	MeterId uint32
	Bands   []IMeterBand
}

type IMeterMod interface {
	IHeader
	GetCommand() MeterModCommand
	GetFlags() MeterFlags
	GetMeterId() uint32
	GetBands() []IMeterBand
}

func (self *MeterMod) GetCommand() MeterModCommand {
	return self.Command
}

func (self *MeterMod) SetCommand(v MeterModCommand) {
	self.Command = v
}

func (self *MeterMod) GetFlags() MeterFlags {
	return self.Flags
}

func (self *MeterMod) SetFlags(v MeterFlags) {
	self.Flags = v
}

func (self *MeterMod) GetMeterId() uint32 {
	return self.MeterId
}

func (self *MeterMod) SetMeterId(v uint32) {
	self.MeterId = v
}

func (self *MeterMod) GetBands() []IMeterBand {
	return self.Bands
}

func (self *MeterMod) SetBands(v []IMeterBand) {
	self.Bands = v
}

func (self *MeterMod) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.Header.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint16(uint16(self.Command))
	encoder.PutUint16(uint16(self.Flags))
	encoder.PutUint32(uint32(self.MeterId))
	for _, obj := range self.Bands {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeMeterMod(parent *Header, decoder *goloxi.Decoder) (*MeterMod, error) {
	_metermod := &MeterMod{Header: parent}
	if decoder.Length() < 8 {
		return nil, fmt.Errorf("MeterMod packet too short: %d < 8", decoder.Length())
	}
	_metermod.Command = MeterModCommand(decoder.ReadUint16())
	_metermod.Flags = MeterFlags(decoder.ReadUint16())
	_metermod.MeterId = uint32(decoder.ReadUint32())

	for decoder.Length() >= 4 {
		item, err := DecodeMeterBand(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_metermod.Bands = append(_metermod.Bands, item)
		}
	}
	return _metermod, nil
}

func NewMeterMod() *MeterMod {
	obj := &MeterMod{
		Header: NewHeader(29),
	}
	return obj
}

type MeterModFailedErrorMsg struct {
	*ErrorMsg
	Code MeterModFailedCode
	Data []byte
}

type IMeterModFailedErrorMsg interface {
	IErrorMsg
	GetCode() MeterModFailedCode
	GetData() []byte
}

func (self *MeterModFailedErrorMsg) GetCode() MeterModFailedCode {
	return self.Code
}

func (self *MeterModFailedErrorMsg) SetCode(v MeterModFailedCode) {
	self.Code = v
}

func (self *MeterModFailedErrorMsg) GetData() []byte {
	return self.Data
}

func (self *MeterModFailedErrorMsg) SetData(v []byte) {
	self.Data = v
}

func (self *MeterModFailedErrorMsg) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.ErrorMsg.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint16(uint16(self.Code))
	encoder.Write(self.Data)
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeMeterModFailedErrorMsg(parent *ErrorMsg, decoder *goloxi.Decoder) (*MeterModFailedErrorMsg, error) {
	_metermodfailederrormsg := &MeterModFailedErrorMsg{ErrorMsg: parent}
	if decoder.Length() < 2 {
		return nil, fmt.Errorf("MeterModFailedErrorMsg packet too short: %d < 2", decoder.Length())
	}
	_metermodfailederrormsg.Code = MeterModFailedCode(decoder.ReadUint16())
	_metermodfailederrormsg.Data = decoder.Read(int(decoder.Length()))
	return _metermodfailederrormsg, nil
}

func NewMeterModFailedErrorMsg() *MeterModFailedErrorMsg {
	obj := &MeterModFailedErrorMsg{
		ErrorMsg: NewErrorMsg(12),
	}
	return obj
}

type MeterStatsReply struct {
	*StatsReply
	Entries []*MeterStats
}

type IMeterStatsReply interface {
	IStatsReply
	GetEntries() []*MeterStats
}

func (self *MeterStatsReply) GetEntries() []*MeterStats {
	return self.Entries
}

func (self *MeterStatsReply) SetEntries(v []*MeterStats) {
	self.Entries = v
}

func (self *MeterStatsReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsReply.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	for _, obj := range self.Entries {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeMeterStatsReply(parent *StatsReply, decoder *goloxi.Decoder) (*MeterStatsReply, error) {
	_meterstatsreply := &MeterStatsReply{StatsReply: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("MeterStatsReply packet too short: %d < 4", decoder.Length())
	}
	decoder.Skip(4)

	for decoder.Length() >= 40 {
		item, err := DecodeMeterStats(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_meterstatsreply.Entries = append(_meterstatsreply.Entries, item)
		}
	}
	return _meterstatsreply, nil
}

func NewMeterStatsReply() *MeterStatsReply {
	obj := &MeterStatsReply{
		StatsReply: NewStatsReply(9),
	}
	return obj
}

type MeterStatsRequest struct {
	*StatsRequest
	MeterId uint32
}

type IMeterStatsRequest interface {
	IStatsRequest
	GetMeterId() uint32
}

func (self *MeterStatsRequest) GetMeterId() uint32 {
	return self.MeterId
}

func (self *MeterStatsRequest) SetMeterId(v uint32) {
	self.MeterId = v
}

func (self *MeterStatsRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsRequest.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	encoder.PutUint32(uint32(self.MeterId))
	encoder.Write(bytes.Repeat([]byte{0}, 4))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeMeterStatsRequest(parent *StatsRequest, decoder *goloxi.Decoder) (*MeterStatsRequest, error) {
	_meterstatsrequest := &MeterStatsRequest{StatsRequest: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("MeterStatsRequest packet too short: %d < 4", decoder.Length())
	}
	decoder.Skip(4)
	_meterstatsrequest.MeterId = uint32(decoder.ReadUint32())
	decoder.Skip(4)
	return _meterstatsrequest, nil
}

func NewMeterStatsRequest() *MeterStatsRequest {
	obj := &MeterStatsRequest{
		StatsRequest: NewStatsRequest(9),
	}
	return obj
}

type NiciraStatsReply struct {
	*ExperimenterStatsReply
}

type INiciraStatsReply interface {
	IExperimenterStatsReply
}

func (self *NiciraStatsReply) Serialize(encoder *goloxi.Encoder) error {
	if err := self.ExperimenterStatsReply.Serialize(encoder); err != nil {
		return err
	}

	return nil
}

func DecodeNiciraStatsReply(parent *ExperimenterStatsReply, decoder *goloxi.Decoder) (INiciraStatsReply, error) {
	_nicirastatsreply := &NiciraStatsReply{ExperimenterStatsReply: parent}
	if decoder.Length() < -4 {
		return nil, fmt.Errorf("NiciraStatsReply packet too short: %d < -4", decoder.Length())
	}

	switch _nicirastatsreply.Subtype {
	case 0:
		return DecodeNiciraFlowStatsReply(_nicirastatsreply, decoder)
	case 2:
		return DecodeNiciraFlowMonitorReply(_nicirastatsreply, decoder)
	default:
		return nil, fmt.Errorf("Invalid type '%d' for 'NiciraStatsReply'", _nicirastatsreply.Subtype)
	}
}

func NewNiciraStatsReply(_subtype uint32) *NiciraStatsReply {
	obj := &NiciraStatsReply{
		ExperimenterStatsReply: NewExperimenterStatsReply(8992),
	}
	obj.Subtype = _subtype
	return obj
}

type NiciraFlowMonitorReply struct {
	*NiciraStatsReply
	Updates []INiciraFlowUpdateEvent
}

type INiciraFlowMonitorReply interface {
	INiciraStatsReply
	GetUpdates() []INiciraFlowUpdateEvent
}

func (self *NiciraFlowMonitorReply) GetUpdates() []INiciraFlowUpdateEvent {
	return self.Updates
}

func (self *NiciraFlowMonitorReply) SetUpdates(v []INiciraFlowUpdateEvent) {
	self.Updates = v
}

func (self *NiciraFlowMonitorReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.NiciraStatsReply.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	for _, obj := range self.Updates {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeNiciraFlowMonitorReply(parent *NiciraStatsReply, decoder *goloxi.Decoder) (*NiciraFlowMonitorReply, error) {
	_niciraflowmonitorreply := &NiciraFlowMonitorReply{NiciraStatsReply: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("NiciraFlowMonitorReply packet too short: %d < 4", decoder.Length())
	}
	decoder.Skip(4)

	for decoder.Length() >= 4 {
		item, err := DecodeNiciraFlowUpdateEvent(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_niciraflowmonitorreply.Updates = append(_niciraflowmonitorreply.Updates, item)
		}
	}
	return _niciraflowmonitorreply, nil
}

func NewNiciraFlowMonitorReply() *NiciraFlowMonitorReply {
	obj := &NiciraFlowMonitorReply{
		NiciraStatsReply: NewNiciraStatsReply(2),
	}
	return obj
}

type NiciraFlowMonitorRequest struct {
	*ExperimenterStatsRequest
	MonitorId    uint32
	MonitorFlags NxFlowMonitorFlags
	OutPort      Port
	MatchLen     uint16
	TableId      uint8
	Match        NiciraMatch
}

type INiciraFlowMonitorRequest interface {
	IExperimenterStatsRequest
	GetMonitorId() uint32
	GetMonitorFlags() NxFlowMonitorFlags
	GetOutPort() Port
	GetMatchLen() uint16
	GetTableId() uint8
	GetMatch() NiciraMatch
}

func (self *NiciraFlowMonitorRequest) GetMonitorId() uint32 {
	return self.MonitorId
}

func (self *NiciraFlowMonitorRequest) SetMonitorId(v uint32) {
	self.MonitorId = v
}

func (self *NiciraFlowMonitorRequest) GetMonitorFlags() NxFlowMonitorFlags {
	return self.MonitorFlags
}

func (self *NiciraFlowMonitorRequest) SetMonitorFlags(v NxFlowMonitorFlags) {
	self.MonitorFlags = v
}

func (self *NiciraFlowMonitorRequest) GetOutPort() Port {
	return self.OutPort
}

func (self *NiciraFlowMonitorRequest) SetOutPort(v Port) {
	self.OutPort = v
}

func (self *NiciraFlowMonitorRequest) GetMatchLen() uint16 {
	return self.MatchLen
}

func (self *NiciraFlowMonitorRequest) SetMatchLen(v uint16) {
	self.MatchLen = v
}

func (self *NiciraFlowMonitorRequest) GetTableId() uint8 {
	return self.TableId
}

func (self *NiciraFlowMonitorRequest) SetTableId(v uint8) {
	self.TableId = v
}

func (self *NiciraFlowMonitorRequest) GetMatch() NiciraMatch {
	return self.Match
}

func (self *NiciraFlowMonitorRequest) SetMatch(v NiciraMatch) {
	self.Match = v
}

func (self *NiciraFlowMonitorRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.ExperimenterStatsRequest.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	encoder.PutUint32(uint32(self.MonitorId))
	encoder.PutUint16(uint16(self.MonitorFlags))
	self.OutPort.Serialize(encoder)
	encoder.PutUint16(uint16(self.MatchLen))
	encoder.PutUint8(uint8(self.TableId))
	encoder.Write(bytes.Repeat([]byte{0}, 5))
	if err := self.Match.Serialize(encoder); err != nil {
		return err
	}

	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeNiciraFlowMonitorRequest(parent *ExperimenterStatsRequest, decoder *goloxi.Decoder) (*NiciraFlowMonitorRequest, error) {
	_niciraflowmonitorrequest := &NiciraFlowMonitorRequest{ExperimenterStatsRequest: parent}
	if decoder.Length() < 22 {
		return nil, fmt.Errorf("NiciraFlowMonitorRequest packet too short: %d < 22", decoder.Length())
	}
	decoder.Skip(4)
	_niciraflowmonitorrequest.MonitorId = uint32(decoder.ReadUint32())
	_niciraflowmonitorrequest.MonitorFlags = NxFlowMonitorFlags(decoder.ReadUint16())
	_niciraflowmonitorrequest.OutPort.Decode(decoder)
	_niciraflowmonitorrequest.MatchLen = uint16(decoder.ReadUint16())
	_niciraflowmonitorrequest.TableId = uint8(decoder.ReadByte())
	decoder.Skip(5)
	if err := _niciraflowmonitorrequest.Match.Decode(decoder); err != nil {
		return nil, err
	}

	decoder.SkipAlign()
	return _niciraflowmonitorrequest, nil
}

func NewNiciraFlowMonitorRequest() *NiciraFlowMonitorRequest {
	obj := &NiciraFlowMonitorRequest{
		ExperimenterStatsRequest: NewExperimenterStatsRequest(8992),
	}
	return obj
}

type NiciraFlowStatsReply struct {
	*NiciraStatsReply
	Stats []*NiciraFlowStats
}

type INiciraFlowStatsReply interface {
	INiciraStatsReply
	GetStats() []*NiciraFlowStats
}

func (self *NiciraFlowStatsReply) GetStats() []*NiciraFlowStats {
	return self.Stats
}

func (self *NiciraFlowStatsReply) SetStats(v []*NiciraFlowStats) {
	self.Stats = v
}

func (self *NiciraFlowStatsReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.NiciraStatsReply.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	for _, obj := range self.Stats {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeNiciraFlowStatsReply(parent *NiciraStatsReply, decoder *goloxi.Decoder) (*NiciraFlowStatsReply, error) {
	_niciraflowstatsreply := &NiciraFlowStatsReply{NiciraStatsReply: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("NiciraFlowStatsReply packet too short: %d < 4", decoder.Length())
	}
	decoder.Skip(4)

	for decoder.Length() >= 48 {
		item, err := DecodeNiciraFlowStats(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_niciraflowstatsreply.Stats = append(_niciraflowstatsreply.Stats, item)
		}
	}
	return _niciraflowstatsreply, nil
}

func NewNiciraFlowStatsReply() *NiciraFlowStatsReply {
	obj := &NiciraFlowStatsReply{
		NiciraStatsReply: NewNiciraStatsReply(0),
	}
	return obj
}

type NiciraFlowStatsRequest struct {
	*ExperimenterStatsRequest
	OutPort  Port
	MatchLen uint16
	TableId  uint8
}

type INiciraFlowStatsRequest interface {
	IExperimenterStatsRequest
	GetOutPort() Port
	GetMatchLen() uint16
	GetTableId() uint8
}

func (self *NiciraFlowStatsRequest) GetOutPort() Port {
	return self.OutPort
}

func (self *NiciraFlowStatsRequest) SetOutPort(v Port) {
	self.OutPort = v
}

func (self *NiciraFlowStatsRequest) GetMatchLen() uint16 {
	return self.MatchLen
}

func (self *NiciraFlowStatsRequest) SetMatchLen(v uint16) {
	self.MatchLen = v
}

func (self *NiciraFlowStatsRequest) GetTableId() uint8 {
	return self.TableId
}

func (self *NiciraFlowStatsRequest) SetTableId(v uint8) {
	self.TableId = v
}

func (self *NiciraFlowStatsRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.ExperimenterStatsRequest.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	self.OutPort.Serialize(encoder)
	encoder.PutUint16(uint16(self.MatchLen))
	encoder.PutUint8(uint8(self.TableId))
	encoder.Write(bytes.Repeat([]byte{0}, 3))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeNiciraFlowStatsRequest(parent *ExperimenterStatsRequest, decoder *goloxi.Decoder) (*NiciraFlowStatsRequest, error) {
	_niciraflowstatsrequest := &NiciraFlowStatsRequest{ExperimenterStatsRequest: parent}
	if decoder.Length() < 14 {
		return nil, fmt.Errorf("NiciraFlowStatsRequest packet too short: %d < 14", decoder.Length())
	}
	decoder.Skip(4)
	_niciraflowstatsrequest.OutPort.Decode(decoder)
	_niciraflowstatsrequest.MatchLen = uint16(decoder.ReadUint16())
	_niciraflowstatsrequest.TableId = uint8(decoder.ReadByte())
	decoder.Skip(3)
	return _niciraflowstatsrequest, nil
}

func NewNiciraFlowStatsRequest() *NiciraFlowStatsRequest {
	obj := &NiciraFlowStatsRequest{
		ExperimenterStatsRequest: NewExperimenterStatsRequest(8992),
	}
	return obj
}

type NiciraHeader struct {
	*Experimenter
}

type INiciraHeader interface {
	IExperimenter
}

func (self *NiciraHeader) Serialize(encoder *goloxi.Encoder) error {
	if err := self.Experimenter.Serialize(encoder); err != nil {
		return err
	}

	return nil
}

func DecodeNiciraHeader(parent *Experimenter, decoder *goloxi.Decoder) (INiciraHeader, error) {
	_niciraheader := &NiciraHeader{Experimenter: parent}
	return _niciraheader, nil
}

func NewNiciraHeader(_subtype uint32) *NiciraHeader {
	obj := &NiciraHeader{
		Experimenter: NewExperimenter(8992),
	}
	obj.Subtype = _subtype
	return obj
}

type PacketIn struct {
	*Header
	BufferId uint32
	TotalLen uint16
	Reason   uint8
	TableId  uint8
	Cookie   uint64
	Match    Match
	Data     []byte
}

type IPacketIn interface {
	IHeader
	GetBufferId() uint32
	GetTotalLen() uint16
	GetReason() uint8
	GetTableId() uint8
	GetCookie() uint64
	GetMatch() Match
	GetData() []byte
}

func (self *PacketIn) GetBufferId() uint32 {
	return self.BufferId
}

func (self *PacketIn) SetBufferId(v uint32) {
	self.BufferId = v
}

func (self *PacketIn) GetTotalLen() uint16 {
	return self.TotalLen
}

func (self *PacketIn) SetTotalLen(v uint16) {
	self.TotalLen = v
}

func (self *PacketIn) GetReason() uint8 {
	return self.Reason
}

func (self *PacketIn) SetReason(v uint8) {
	self.Reason = v
}

func (self *PacketIn) GetTableId() uint8 {
	return self.TableId
}

func (self *PacketIn) SetTableId(v uint8) {
	self.TableId = v
}

func (self *PacketIn) GetCookie() uint64 {
	return self.Cookie
}

func (self *PacketIn) SetCookie(v uint64) {
	self.Cookie = v
}

func (self *PacketIn) GetMatch() Match {
	return self.Match
}

func (self *PacketIn) SetMatch(v Match) {
	self.Match = v
}

func (self *PacketIn) GetData() []byte {
	return self.Data
}

func (self *PacketIn) SetData(v []byte) {
	self.Data = v
}

func (self *PacketIn) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.Header.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint32(uint32(self.BufferId))
	encoder.PutUint16(uint16(self.TotalLen))
	encoder.PutUint8(uint8(self.Reason))
	encoder.PutUint8(uint8(self.TableId))
	encoder.PutUint64(uint64(self.Cookie))
	if err := self.Match.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 2))
	encoder.Write(self.Data)
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodePacketIn(parent *Header, decoder *goloxi.Decoder) (*PacketIn, error) {
	_packetin := &PacketIn{Header: parent}
	if decoder.Length() < 26 {
		return nil, fmt.Errorf("PacketIn packet too short: %d < 26", decoder.Length())
	}
	_packetin.BufferId = uint32(decoder.ReadUint32())
	_packetin.TotalLen = uint16(decoder.ReadUint16())
	_packetin.Reason = uint8(decoder.ReadByte())
	_packetin.TableId = uint8(decoder.ReadByte())
	_packetin.Cookie = uint64(decoder.ReadUint64())
	if err := _packetin.Match.Decode(decoder); err != nil {
		return nil, err
	}

	decoder.SkipAlign()
	decoder.Skip(2)
	_packetin.Data = decoder.Read(int(decoder.Length()))
	return _packetin, nil
}

func NewPacketIn() *PacketIn {
	obj := &PacketIn{
		Header: NewHeader(10),
	}
	return obj
}

type PacketOut struct {
	*Header
	BufferId   uint32
	ActionsLen uint16
	Match      Match
	Actions    []goloxi.IAction
	Data       []byte
}

type IPacketOut interface {
	IHeader
	GetBufferId() uint32
	GetActionsLen() uint16
	GetMatch() Match
	GetActions() []goloxi.IAction
	GetData() []byte
}

func (self *PacketOut) GetBufferId() uint32 {
	return self.BufferId
}

func (self *PacketOut) SetBufferId(v uint32) {
	self.BufferId = v
}

func (self *PacketOut) GetActionsLen() uint16 {
	return self.ActionsLen
}

func (self *PacketOut) SetActionsLen(v uint16) {
	self.ActionsLen = v
}

func (self *PacketOut) GetMatch() Match {
	return self.Match
}

func (self *PacketOut) SetMatch(v Match) {
	self.Match = v
}

func (self *PacketOut) GetActions() []goloxi.IAction {
	return self.Actions
}

func (self *PacketOut) SetActions(v []goloxi.IAction) {
	self.Actions = v
}

func (self *PacketOut) GetData() []byte {
	return self.Data
}

func (self *PacketOut) SetData(v []byte) {
	self.Data = v
}

func (self *PacketOut) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.Header.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint32(uint32(self.BufferId))
	encoder.PutUint16(uint16(self.ActionsLen))
	encoder.Write(bytes.Repeat([]byte{0}, 2))
	if err := self.Match.Serialize(encoder); err != nil {
		return err
	}

	for _, obj := range self.Actions {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	encoder.Write(self.Data)
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodePacketOut(parent *Header, decoder *goloxi.Decoder) (*PacketOut, error) {
	_packetout := &PacketOut{Header: parent}
	if decoder.Length() < 16 {
		return nil, fmt.Errorf("PacketOut packet too short: %d < 16", decoder.Length())
	}
	_packetout.BufferId = uint32(decoder.ReadUint32())
	_packetout.ActionsLen = uint16(decoder.ReadUint16())
	decoder.Skip(2)
	if err := _packetout.Match.Decode(decoder); err != nil {
		return nil, err
	}

	decoder.SkipAlign()

	end := decoder.Offset() + int(_packetout.ActionsLen)
	for decoder.Offset() < end {
		item, err := DecodeAction(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_packetout.Actions = append(_packetout.Actions, item)
		}
	}
	_packetout.Data = decoder.Read(int(decoder.Length()))
	return _packetout, nil
}

func NewPacketOut() *PacketOut {
	obj := &PacketOut{
		Header: NewHeader(13),
	}
	return obj
}

type PortDescStatsReply struct {
	*StatsReply
	Entries []*PortDesc
}

type IPortDescStatsReply interface {
	IStatsReply
	GetEntries() []*PortDesc
}

func (self *PortDescStatsReply) GetEntries() []*PortDesc {
	return self.Entries
}

func (self *PortDescStatsReply) SetEntries(v []*PortDesc) {
	self.Entries = v
}

func (self *PortDescStatsReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsReply.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	for _, obj := range self.Entries {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodePortDescStatsReply(parent *StatsReply, decoder *goloxi.Decoder) (*PortDescStatsReply, error) {
	_portdescstatsreply := &PortDescStatsReply{StatsReply: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("PortDescStatsReply packet too short: %d < 4", decoder.Length())
	}
	decoder.Skip(4)

	for decoder.Length() >= 40 {
		item := &PortDesc{}
		if err := item.Decode(decoder); err != nil {
			return nil, err
		}
		if item != nil {
			_portdescstatsreply.Entries = append(_portdescstatsreply.Entries, item)
		}
	}
	return _portdescstatsreply, nil
}

func NewPortDescStatsReply() *PortDescStatsReply {
	obj := &PortDescStatsReply{
		StatsReply: NewStatsReply(13),
	}
	return obj
}

type PortDescStatsRequest struct {
	*StatsRequest
	PortNo Port
}

type IPortDescStatsRequest interface {
	IStatsRequest
	GetPortNo() Port
}

func (self *PortDescStatsRequest) GetPortNo() Port {
	return self.PortNo
}

func (self *PortDescStatsRequest) SetPortNo(v Port) {
	self.PortNo = v
}

func (self *PortDescStatsRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsRequest.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	self.PortNo.Serialize(encoder)
	encoder.Write(bytes.Repeat([]byte{0}, 4))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodePortDescStatsRequest(parent *StatsRequest, decoder *goloxi.Decoder) (*PortDescStatsRequest, error) {
	_portdescstatsrequest := &PortDescStatsRequest{StatsRequest: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("PortDescStatsRequest packet too short: %d < 4", decoder.Length())
	}
	decoder.Skip(4)
	_portdescstatsrequest.PortNo.Decode(decoder)
	decoder.Skip(4)
	return _portdescstatsrequest, nil
}

func NewPortDescStatsRequest() *PortDescStatsRequest {
	obj := &PortDescStatsRequest{
		StatsRequest: NewStatsRequest(13),
	}
	return obj
}

type PortMod struct {
	*Header
	PortNo     Port
	HwAddr     net.HardwareAddr
	Config     PortConfig
	Mask       PortConfig
	Properties []IPortModProp
}

type IPortMod interface {
	IHeader
	GetPortNo() Port
	GetHwAddr() net.HardwareAddr
	GetConfig() PortConfig
	GetMask() PortConfig
	GetProperties() []IPortModProp
}

func (self *PortMod) GetPortNo() Port {
	return self.PortNo
}

func (self *PortMod) SetPortNo(v Port) {
	self.PortNo = v
}

func (self *PortMod) GetHwAddr() net.HardwareAddr {
	return self.HwAddr
}

func (self *PortMod) SetHwAddr(v net.HardwareAddr) {
	self.HwAddr = v
}

func (self *PortMod) GetConfig() PortConfig {
	return self.Config
}

func (self *PortMod) SetConfig(v PortConfig) {
	self.Config = v
}

func (self *PortMod) GetMask() PortConfig {
	return self.Mask
}

func (self *PortMod) SetMask(v PortConfig) {
	self.Mask = v
}

func (self *PortMod) GetProperties() []IPortModProp {
	return self.Properties
}

func (self *PortMod) SetProperties(v []IPortModProp) {
	self.Properties = v
}

func (self *PortMod) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.Header.Serialize(encoder); err != nil {
		return err
	}

	self.PortNo.Serialize(encoder)
	encoder.Write(bytes.Repeat([]byte{0}, 4))
	encoder.Write(self.HwAddr)
	encoder.Write(bytes.Repeat([]byte{0}, 2))
	encoder.PutUint32(uint32(self.Config))
	encoder.PutUint32(uint32(self.Mask))
	for _, obj := range self.Properties {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodePortMod(parent *Header, decoder *goloxi.Decoder) (*PortMod, error) {
	_portmod := &PortMod{Header: parent}
	if decoder.Length() < 24 {
		return nil, fmt.Errorf("PortMod packet too short: %d < 24", decoder.Length())
	}
	_portmod.PortNo.Decode(decoder)
	decoder.Skip(4)
	_portmod.HwAddr = net.HardwareAddr(decoder.Read(6))
	decoder.Skip(2)
	_portmod.Config = PortConfig(decoder.ReadUint32())
	_portmod.Mask = PortConfig(decoder.ReadUint32())

	for decoder.Length() >= 4 {
		item, err := DecodePortModProp(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_portmod.Properties = append(_portmod.Properties, item)
		}
	}
	return _portmod, nil
}

func NewPortMod() *PortMod {
	obj := &PortMod{
		Header: NewHeader(16),
	}
	return obj
}

type PortModFailedErrorMsg struct {
	*ErrorMsg
	Code PortModFailedCode
	Data []byte
}

type IPortModFailedErrorMsg interface {
	IErrorMsg
	GetCode() PortModFailedCode
	GetData() []byte
}

func (self *PortModFailedErrorMsg) GetCode() PortModFailedCode {
	return self.Code
}

func (self *PortModFailedErrorMsg) SetCode(v PortModFailedCode) {
	self.Code = v
}

func (self *PortModFailedErrorMsg) GetData() []byte {
	return self.Data
}

func (self *PortModFailedErrorMsg) SetData(v []byte) {
	self.Data = v
}

func (self *PortModFailedErrorMsg) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.ErrorMsg.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint16(uint16(self.Code))
	encoder.Write(self.Data)
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodePortModFailedErrorMsg(parent *ErrorMsg, decoder *goloxi.Decoder) (*PortModFailedErrorMsg, error) {
	_portmodfailederrormsg := &PortModFailedErrorMsg{ErrorMsg: parent}
	if decoder.Length() < 2 {
		return nil, fmt.Errorf("PortModFailedErrorMsg packet too short: %d < 2", decoder.Length())
	}
	_portmodfailederrormsg.Code = PortModFailedCode(decoder.ReadUint16())
	_portmodfailederrormsg.Data = decoder.Read(int(decoder.Length()))
	return _portmodfailederrormsg, nil
}

func NewPortModFailedErrorMsg() *PortModFailedErrorMsg {
	obj := &PortModFailedErrorMsg{
		ErrorMsg: NewErrorMsg(7),
	}
	return obj
}

type PortStatsReply struct {
	*StatsReply
	Entries []*PortStatsEntry
}

type IPortStatsReply interface {
	IStatsReply
	GetEntries() []*PortStatsEntry
}

func (self *PortStatsReply) GetEntries() []*PortStatsEntry {
	return self.Entries
}

func (self *PortStatsReply) SetEntries(v []*PortStatsEntry) {
	self.Entries = v
}

func (self *PortStatsReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsReply.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	for _, obj := range self.Entries {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodePortStatsReply(parent *StatsReply, decoder *goloxi.Decoder) (*PortStatsReply, error) {
	_portstatsreply := &PortStatsReply{StatsReply: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("PortStatsReply packet too short: %d < 4", decoder.Length())
	}
	decoder.Skip(4)

	for decoder.Length() >= 80 {
		item, err := DecodePortStatsEntry(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_portstatsreply.Entries = append(_portstatsreply.Entries, item)
		}
	}
	return _portstatsreply, nil
}

func NewPortStatsReply() *PortStatsReply {
	obj := &PortStatsReply{
		StatsReply: NewStatsReply(4),
	}
	return obj
}

type PortStatsRequest struct {
	*StatsRequest
	PortNo Port
}

type IPortStatsRequest interface {
	IStatsRequest
	GetPortNo() Port
}

func (self *PortStatsRequest) GetPortNo() Port {
	return self.PortNo
}

func (self *PortStatsRequest) SetPortNo(v Port) {
	self.PortNo = v
}

func (self *PortStatsRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsRequest.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	self.PortNo.Serialize(encoder)
	encoder.Write(bytes.Repeat([]byte{0}, 4))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodePortStatsRequest(parent *StatsRequest, decoder *goloxi.Decoder) (*PortStatsRequest, error) {
	_portstatsrequest := &PortStatsRequest{StatsRequest: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("PortStatsRequest packet too short: %d < 4", decoder.Length())
	}
	decoder.Skip(4)
	_portstatsrequest.PortNo.Decode(decoder)
	decoder.Skip(4)
	return _portstatsrequest, nil
}

func NewPortStatsRequest() *PortStatsRequest {
	obj := &PortStatsRequest{
		StatsRequest: NewStatsRequest(4),
	}
	return obj
}

type PortStatus struct {
	*Header
	Reason PortReason
	Desc   PortDesc
}

type IPortStatus interface {
	IHeader
	GetReason() PortReason
	GetDesc() PortDesc
}

func (self *PortStatus) GetReason() PortReason {
	return self.Reason
}

func (self *PortStatus) SetReason(v PortReason) {
	self.Reason = v
}

func (self *PortStatus) GetDesc() PortDesc {
	return self.Desc
}

func (self *PortStatus) SetDesc(v PortDesc) {
	self.Desc = v
}

func (self *PortStatus) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.Header.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint8(uint8(self.Reason))
	encoder.Write(bytes.Repeat([]byte{0}, 7))
	if err := self.Desc.Serialize(encoder); err != nil {
		return err
	}

	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodePortStatus(parent *Header, decoder *goloxi.Decoder) (*PortStatus, error) {
	_portstatus := &PortStatus{Header: parent}
	if decoder.Length() < 48 {
		return nil, fmt.Errorf("PortStatus packet too short: %d < 48", decoder.Length())
	}
	_portstatus.Reason = PortReason(decoder.ReadByte())
	decoder.Skip(7)
	if err := _portstatus.Desc.Decode(decoder); err != nil {
		return nil, err
	}

	return _portstatus, nil
}

func NewPortStatus() *PortStatus {
	obj := &PortStatus{
		Header: NewHeader(12),
	}
	return obj
}

type QueueDescStatsReply struct {
	*StatsReply
	Entries []*QueueDesc
}

type IQueueDescStatsReply interface {
	IStatsReply
	GetEntries() []*QueueDesc
}

func (self *QueueDescStatsReply) GetEntries() []*QueueDesc {
	return self.Entries
}

func (self *QueueDescStatsReply) SetEntries(v []*QueueDesc) {
	self.Entries = v
}

func (self *QueueDescStatsReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsReply.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	for _, obj := range self.Entries {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeQueueDescStatsReply(parent *StatsReply, decoder *goloxi.Decoder) (*QueueDescStatsReply, error) {
	_queuedescstatsreply := &QueueDescStatsReply{StatsReply: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("QueueDescStatsReply packet too short: %d < 4", decoder.Length())
	}
	decoder.Skip(4)

	for decoder.Length() >= 16 {
		item, err := DecodeQueueDesc(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_queuedescstatsreply.Entries = append(_queuedescstatsreply.Entries, item)
		}
	}
	return _queuedescstatsreply, nil
}

func NewQueueDescStatsReply() *QueueDescStatsReply {
	obj := &QueueDescStatsReply{
		StatsReply: NewStatsReply(15),
	}
	return obj
}

type QueueDescStatsRequest struct {
	*StatsRequest
	PortNo  Port
	QueueId uint32
}

type IQueueDescStatsRequest interface {
	IStatsRequest
	GetPortNo() Port
	GetQueueId() uint32
}

func (self *QueueDescStatsRequest) GetPortNo() Port {
	return self.PortNo
}

func (self *QueueDescStatsRequest) SetPortNo(v Port) {
	self.PortNo = v
}

func (self *QueueDescStatsRequest) GetQueueId() uint32 {
	return self.QueueId
}

func (self *QueueDescStatsRequest) SetQueueId(v uint32) {
	self.QueueId = v
}

func (self *QueueDescStatsRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsRequest.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	self.PortNo.Serialize(encoder)
	encoder.PutUint32(uint32(self.QueueId))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeQueueDescStatsRequest(parent *StatsRequest, decoder *goloxi.Decoder) (*QueueDescStatsRequest, error) {
	_queuedescstatsrequest := &QueueDescStatsRequest{StatsRequest: parent}
	if decoder.Length() < 12 {
		return nil, fmt.Errorf("QueueDescStatsRequest packet too short: %d < 12", decoder.Length())
	}
	decoder.Skip(4)
	_queuedescstatsrequest.PortNo.Decode(decoder)
	_queuedescstatsrequest.QueueId = uint32(decoder.ReadUint32())
	return _queuedescstatsrequest, nil
}

func NewQueueDescStatsRequest() *QueueDescStatsRequest {
	obj := &QueueDescStatsRequest{
		StatsRequest: NewStatsRequest(15),
	}
	return obj
}

type QueueOpFailedErrorMsg struct {
	*ErrorMsg
	Code QueueOpFailedCode
	Data []byte
}

type IQueueOpFailedErrorMsg interface {
	IErrorMsg
	GetCode() QueueOpFailedCode
	GetData() []byte
}

func (self *QueueOpFailedErrorMsg) GetCode() QueueOpFailedCode {
	return self.Code
}

func (self *QueueOpFailedErrorMsg) SetCode(v QueueOpFailedCode) {
	self.Code = v
}

func (self *QueueOpFailedErrorMsg) GetData() []byte {
	return self.Data
}

func (self *QueueOpFailedErrorMsg) SetData(v []byte) {
	self.Data = v
}

func (self *QueueOpFailedErrorMsg) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.ErrorMsg.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint16(uint16(self.Code))
	encoder.Write(self.Data)
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeQueueOpFailedErrorMsg(parent *ErrorMsg, decoder *goloxi.Decoder) (*QueueOpFailedErrorMsg, error) {
	_queueopfailederrormsg := &QueueOpFailedErrorMsg{ErrorMsg: parent}
	if decoder.Length() < 2 {
		return nil, fmt.Errorf("QueueOpFailedErrorMsg packet too short: %d < 2", decoder.Length())
	}
	_queueopfailederrormsg.Code = QueueOpFailedCode(decoder.ReadUint16())
	_queueopfailederrormsg.Data = decoder.Read(int(decoder.Length()))
	return _queueopfailederrormsg, nil
}

func NewQueueOpFailedErrorMsg() *QueueOpFailedErrorMsg {
	obj := &QueueOpFailedErrorMsg{
		ErrorMsg: NewErrorMsg(9),
	}
	return obj
}

type QueueStatsReply struct {
	*StatsReply
	Entries []*QueueStatsEntry
}

type IQueueStatsReply interface {
	IStatsReply
	GetEntries() []*QueueStatsEntry
}

func (self *QueueStatsReply) GetEntries() []*QueueStatsEntry {
	return self.Entries
}

func (self *QueueStatsReply) SetEntries(v []*QueueStatsEntry) {
	self.Entries = v
}

func (self *QueueStatsReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsReply.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	for _, obj := range self.Entries {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeQueueStatsReply(parent *StatsReply, decoder *goloxi.Decoder) (*QueueStatsReply, error) {
	_queuestatsreply := &QueueStatsReply{StatsReply: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("QueueStatsReply packet too short: %d < 4", decoder.Length())
	}
	decoder.Skip(4)

	for decoder.Length() >= 48 {
		item, err := DecodeQueueStatsEntry(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_queuestatsreply.Entries = append(_queuestatsreply.Entries, item)
		}
	}
	return _queuestatsreply, nil
}

func NewQueueStatsReply() *QueueStatsReply {
	obj := &QueueStatsReply{
		StatsReply: NewStatsReply(5),
	}
	return obj
}

type QueueStatsRequest struct {
	*StatsRequest
	PortNo  Port
	QueueId uint32
}

type IQueueStatsRequest interface {
	IStatsRequest
	GetPortNo() Port
	GetQueueId() uint32
}

func (self *QueueStatsRequest) GetPortNo() Port {
	return self.PortNo
}

func (self *QueueStatsRequest) SetPortNo(v Port) {
	self.PortNo = v
}

func (self *QueueStatsRequest) GetQueueId() uint32 {
	return self.QueueId
}

func (self *QueueStatsRequest) SetQueueId(v uint32) {
	self.QueueId = v
}

func (self *QueueStatsRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsRequest.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	self.PortNo.Serialize(encoder)
	encoder.PutUint32(uint32(self.QueueId))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeQueueStatsRequest(parent *StatsRequest, decoder *goloxi.Decoder) (*QueueStatsRequest, error) {
	_queuestatsrequest := &QueueStatsRequest{StatsRequest: parent}
	if decoder.Length() < 12 {
		return nil, fmt.Errorf("QueueStatsRequest packet too short: %d < 12", decoder.Length())
	}
	decoder.Skip(4)
	_queuestatsrequest.PortNo.Decode(decoder)
	_queuestatsrequest.QueueId = uint32(decoder.ReadUint32())
	return _queuestatsrequest, nil
}

func NewQueueStatsRequest() *QueueStatsRequest {
	obj := &QueueStatsRequest{
		StatsRequest: NewStatsRequest(5),
	}
	return obj
}

type Requestforward struct {
	*Header
	Request IHeader
}

type IRequestforward interface {
	IHeader
	GetRequest() IHeader
}

func (self *Requestforward) GetRequest() IHeader {
	return self.Request
}

func (self *Requestforward) SetRequest(v IHeader) {
	self.Request = v
}

func (self *Requestforward) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.Header.Serialize(encoder); err != nil {
		return err
	}

	self.Request.Serialize(encoder)
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeRequestforward(parent *Header, decoder *goloxi.Decoder) (*Requestforward, error) {
	_requestforward := &Requestforward{Header: parent}
	if decoder.Length() < 8 {
		return nil, fmt.Errorf("Requestforward packet too short: %d < 8", decoder.Length())
	}
	if obj, err := DecodeHeader(decoder); err != nil {
		return nil, err
	} else {
		_requestforward.Request = obj
	}

	return _requestforward, nil
}

func NewRequestforward() *Requestforward {
	obj := &Requestforward{
		Header: NewHeader(32),
	}
	return obj
}

type RoleReply struct {
	*Header
	Role         ControllerRole
	ShortId      uint16
	GenerationId uint64
}

type IRoleReply interface {
	IHeader
	GetRole() ControllerRole
	GetShortId() uint16
	GetGenerationId() uint64
}

func (self *RoleReply) GetRole() ControllerRole {
	return self.Role
}

func (self *RoleReply) SetRole(v ControllerRole) {
	self.Role = v
}

func (self *RoleReply) GetShortId() uint16 {
	return self.ShortId
}

func (self *RoleReply) SetShortId(v uint16) {
	self.ShortId = v
}

func (self *RoleReply) GetGenerationId() uint64 {
	return self.GenerationId
}

func (self *RoleReply) SetGenerationId(v uint64) {
	self.GenerationId = v
}

func (self *RoleReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.Header.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint32(uint32(self.Role))
	encoder.PutUint16(uint16(self.ShortId))
	encoder.Write(bytes.Repeat([]byte{0}, 2))
	encoder.PutUint64(uint64(self.GenerationId))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeRoleReply(parent *Header, decoder *goloxi.Decoder) (*RoleReply, error) {
	_rolereply := &RoleReply{Header: parent}
	if decoder.Length() < 16 {
		return nil, fmt.Errorf("RoleReply packet too short: %d < 16", decoder.Length())
	}
	_rolereply.Role = ControllerRole(decoder.ReadUint32())
	_rolereply.ShortId = uint16(decoder.ReadUint16())
	decoder.Skip(2)
	_rolereply.GenerationId = uint64(decoder.ReadUint64())
	return _rolereply, nil
}

func NewRoleReply() *RoleReply {
	obj := &RoleReply{
		Header: NewHeader(25),
	}
	return obj
}

type RoleRequest struct {
	*Header
	Role         ControllerRole
	ShortId      uint16
	GenerationId uint64
}

type IRoleRequest interface {
	IHeader
	GetRole() ControllerRole
	GetShortId() uint16
	GetGenerationId() uint64
}

func (self *RoleRequest) GetRole() ControllerRole {
	return self.Role
}

func (self *RoleRequest) SetRole(v ControllerRole) {
	self.Role = v
}

func (self *RoleRequest) GetShortId() uint16 {
	return self.ShortId
}

func (self *RoleRequest) SetShortId(v uint16) {
	self.ShortId = v
}

func (self *RoleRequest) GetGenerationId() uint64 {
	return self.GenerationId
}

func (self *RoleRequest) SetGenerationId(v uint64) {
	self.GenerationId = v
}

func (self *RoleRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.Header.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint32(uint32(self.Role))
	encoder.PutUint16(uint16(self.ShortId))
	encoder.Write(bytes.Repeat([]byte{0}, 2))
	encoder.PutUint64(uint64(self.GenerationId))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeRoleRequest(parent *Header, decoder *goloxi.Decoder) (*RoleRequest, error) {
	_rolerequest := &RoleRequest{Header: parent}
	if decoder.Length() < 16 {
		return nil, fmt.Errorf("RoleRequest packet too short: %d < 16", decoder.Length())
	}
	_rolerequest.Role = ControllerRole(decoder.ReadUint32())
	_rolerequest.ShortId = uint16(decoder.ReadUint16())
	decoder.Skip(2)
	_rolerequest.GenerationId = uint64(decoder.ReadUint64())
	return _rolerequest, nil
}

func NewRoleRequest() *RoleRequest {
	obj := &RoleRequest{
		Header: NewHeader(24),
	}
	return obj
}

type RoleRequestFailedErrorMsg struct {
	*ErrorMsg
	Code RoleRequestFailedCode
	Data []byte
}

type IRoleRequestFailedErrorMsg interface {
	IErrorMsg
	GetCode() RoleRequestFailedCode
	GetData() []byte
}

func (self *RoleRequestFailedErrorMsg) GetCode() RoleRequestFailedCode {
	return self.Code
}

func (self *RoleRequestFailedErrorMsg) SetCode(v RoleRequestFailedCode) {
	self.Code = v
}

func (self *RoleRequestFailedErrorMsg) GetData() []byte {
	return self.Data
}

func (self *RoleRequestFailedErrorMsg) SetData(v []byte) {
	self.Data = v
}

func (self *RoleRequestFailedErrorMsg) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.ErrorMsg.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint16(uint16(self.Code))
	encoder.Write(self.Data)
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeRoleRequestFailedErrorMsg(parent *ErrorMsg, decoder *goloxi.Decoder) (*RoleRequestFailedErrorMsg, error) {
	_rolerequestfailederrormsg := &RoleRequestFailedErrorMsg{ErrorMsg: parent}
	if decoder.Length() < 2 {
		return nil, fmt.Errorf("RoleRequestFailedErrorMsg packet too short: %d < 2", decoder.Length())
	}
	_rolerequestfailederrormsg.Code = RoleRequestFailedCode(decoder.ReadUint16())
	_rolerequestfailederrormsg.Data = decoder.Read(int(decoder.Length()))
	return _rolerequestfailederrormsg, nil
}

func NewRoleRequestFailedErrorMsg() *RoleRequestFailedErrorMsg {
	obj := &RoleRequestFailedErrorMsg{
		ErrorMsg: NewErrorMsg(11),
	}
	return obj
}

type RoleStatus struct {
	*Header
	Role         ControllerRole
	Reason       ControllerRoleReason
	GenerationId uint64
	Properties   []IRoleProp
}

type IRoleStatus interface {
	IHeader
	GetRole() ControllerRole
	GetReason() ControllerRoleReason
	GetGenerationId() uint64
	GetProperties() []IRoleProp
}

func (self *RoleStatus) GetRole() ControllerRole {
	return self.Role
}

func (self *RoleStatus) SetRole(v ControllerRole) {
	self.Role = v
}

func (self *RoleStatus) GetReason() ControllerRoleReason {
	return self.Reason
}

func (self *RoleStatus) SetReason(v ControllerRoleReason) {
	self.Reason = v
}

func (self *RoleStatus) GetGenerationId() uint64 {
	return self.GenerationId
}

func (self *RoleStatus) SetGenerationId(v uint64) {
	self.GenerationId = v
}

func (self *RoleStatus) GetProperties() []IRoleProp {
	return self.Properties
}

func (self *RoleStatus) SetProperties(v []IRoleProp) {
	self.Properties = v
}

func (self *RoleStatus) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.Header.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint32(uint32(self.Role))
	encoder.PutUint8(uint8(self.Reason))
	encoder.Write(bytes.Repeat([]byte{0}, 3))
	encoder.PutUint64(uint64(self.GenerationId))
	for _, obj := range self.Properties {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeRoleStatus(parent *Header, decoder *goloxi.Decoder) (*RoleStatus, error) {
	_rolestatus := &RoleStatus{Header: parent}
	if decoder.Length() < 16 {
		return nil, fmt.Errorf("RoleStatus packet too short: %d < 16", decoder.Length())
	}
	_rolestatus.Role = ControllerRole(decoder.ReadUint32())
	_rolestatus.Reason = ControllerRoleReason(decoder.ReadByte())
	decoder.Skip(3)
	_rolestatus.GenerationId = uint64(decoder.ReadUint64())

	for decoder.Length() >= 4 {
		item, err := DecodeRoleProp(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_rolestatus.Properties = append(_rolestatus.Properties, item)
		}
	}
	return _rolestatus, nil
}

func NewRoleStatus() *RoleStatus {
	obj := &RoleStatus{
		Header: NewHeader(30),
	}
	return obj
}

type SetConfig struct {
	*Header
	Flags       ConfigFlags
	MissSendLen uint16
}

type ISetConfig interface {
	IHeader
	GetFlags() ConfigFlags
	GetMissSendLen() uint16
}

func (self *SetConfig) GetFlags() ConfigFlags {
	return self.Flags
}

func (self *SetConfig) SetFlags(v ConfigFlags) {
	self.Flags = v
}

func (self *SetConfig) GetMissSendLen() uint16 {
	return self.MissSendLen
}

func (self *SetConfig) SetMissSendLen(v uint16) {
	self.MissSendLen = v
}

func (self *SetConfig) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.Header.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint16(uint16(self.Flags))
	encoder.PutUint16(uint16(self.MissSendLen))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeSetConfig(parent *Header, decoder *goloxi.Decoder) (*SetConfig, error) {
	_setconfig := &SetConfig{Header: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("SetConfig packet too short: %d < 4", decoder.Length())
	}
	_setconfig.Flags = ConfigFlags(decoder.ReadUint16())
	_setconfig.MissSendLen = uint16(decoder.ReadUint16())
	return _setconfig, nil
}

func NewSetConfig() *SetConfig {
	obj := &SetConfig{
		Header: NewHeader(9),
	}
	return obj
}

type SwitchConfigFailedErrorMsg struct {
	*ErrorMsg
	Code SwitchConfigFailedCode
	Data []byte
}

type ISwitchConfigFailedErrorMsg interface {
	IErrorMsg
	GetCode() SwitchConfigFailedCode
	GetData() []byte
}

func (self *SwitchConfigFailedErrorMsg) GetCode() SwitchConfigFailedCode {
	return self.Code
}

func (self *SwitchConfigFailedErrorMsg) SetCode(v SwitchConfigFailedCode) {
	self.Code = v
}

func (self *SwitchConfigFailedErrorMsg) GetData() []byte {
	return self.Data
}

func (self *SwitchConfigFailedErrorMsg) SetData(v []byte) {
	self.Data = v
}

func (self *SwitchConfigFailedErrorMsg) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.ErrorMsg.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint16(uint16(self.Code))
	encoder.Write(self.Data)
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeSwitchConfigFailedErrorMsg(parent *ErrorMsg, decoder *goloxi.Decoder) (*SwitchConfigFailedErrorMsg, error) {
	_switchconfigfailederrormsg := &SwitchConfigFailedErrorMsg{ErrorMsg: parent}
	if decoder.Length() < 2 {
		return nil, fmt.Errorf("SwitchConfigFailedErrorMsg packet too short: %d < 2", decoder.Length())
	}
	_switchconfigfailederrormsg.Code = SwitchConfigFailedCode(decoder.ReadUint16())
	_switchconfigfailederrormsg.Data = decoder.Read(int(decoder.Length()))
	return _switchconfigfailederrormsg, nil
}

func NewSwitchConfigFailedErrorMsg() *SwitchConfigFailedErrorMsg {
	obj := &SwitchConfigFailedErrorMsg{
		ErrorMsg: NewErrorMsg(10),
	}
	return obj
}

type TableDescStatsReply struct {
	*StatsReply
	Entries []*TableDesc
}

type ITableDescStatsReply interface {
	IStatsReply
	GetEntries() []*TableDesc
}

func (self *TableDescStatsReply) GetEntries() []*TableDesc {
	return self.Entries
}

func (self *TableDescStatsReply) SetEntries(v []*TableDesc) {
	self.Entries = v
}

func (self *TableDescStatsReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsReply.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	for _, obj := range self.Entries {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeTableDescStatsReply(parent *StatsReply, decoder *goloxi.Decoder) (*TableDescStatsReply, error) {
	_tabledescstatsreply := &TableDescStatsReply{StatsReply: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("TableDescStatsReply packet too short: %d < 4", decoder.Length())
	}
	decoder.Skip(4)

	for decoder.Length() >= 8 {
		item := &TableDesc{}
		if err := item.Decode(decoder); err != nil {
			return nil, err
		}
		if item != nil {
			_tabledescstatsreply.Entries = append(_tabledescstatsreply.Entries, item)
		}
	}
	return _tabledescstatsreply, nil
}

func NewTableDescStatsReply() *TableDescStatsReply {
	obj := &TableDescStatsReply{
		StatsReply: NewStatsReply(14),
	}
	return obj
}

type TableDescStatsRequest struct {
	*StatsRequest
}

type ITableDescStatsRequest interface {
	IStatsRequest
}

func (self *TableDescStatsRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsRequest.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeTableDescStatsRequest(parent *StatsRequest, decoder *goloxi.Decoder) (*TableDescStatsRequest, error) {
	_tabledescstatsrequest := &TableDescStatsRequest{StatsRequest: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("TableDescStatsRequest packet too short: %d < 4", decoder.Length())
	}
	decoder.Skip(4)
	return _tabledescstatsrequest, nil
}

func NewTableDescStatsRequest() *TableDescStatsRequest {
	obj := &TableDescStatsRequest{
		StatsRequest: NewStatsRequest(14),
	}
	return obj
}

type TableFeaturesFailedErrorMsg struct {
	*ErrorMsg
	Code TableFeaturesFailedCode
	Data []byte
}

type ITableFeaturesFailedErrorMsg interface {
	IErrorMsg
	GetCode() TableFeaturesFailedCode
	GetData() []byte
}

func (self *TableFeaturesFailedErrorMsg) GetCode() TableFeaturesFailedCode {
	return self.Code
}

func (self *TableFeaturesFailedErrorMsg) SetCode(v TableFeaturesFailedCode) {
	self.Code = v
}

func (self *TableFeaturesFailedErrorMsg) GetData() []byte {
	return self.Data
}

func (self *TableFeaturesFailedErrorMsg) SetData(v []byte) {
	self.Data = v
}

func (self *TableFeaturesFailedErrorMsg) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.ErrorMsg.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint16(uint16(self.Code))
	encoder.Write(self.Data)
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeTableFeaturesFailedErrorMsg(parent *ErrorMsg, decoder *goloxi.Decoder) (*TableFeaturesFailedErrorMsg, error) {
	_tablefeaturesfailederrormsg := &TableFeaturesFailedErrorMsg{ErrorMsg: parent}
	if decoder.Length() < 2 {
		return nil, fmt.Errorf("TableFeaturesFailedErrorMsg packet too short: %d < 2", decoder.Length())
	}
	_tablefeaturesfailederrormsg.Code = TableFeaturesFailedCode(decoder.ReadUint16())
	_tablefeaturesfailederrormsg.Data = decoder.Read(int(decoder.Length()))
	return _tablefeaturesfailederrormsg, nil
}

func NewTableFeaturesFailedErrorMsg() *TableFeaturesFailedErrorMsg {
	obj := &TableFeaturesFailedErrorMsg{
		ErrorMsg: NewErrorMsg(13),
	}
	return obj
}

type TableFeaturesStatsReply struct {
	*StatsReply
	Entries []*TableFeatures
}

type ITableFeaturesStatsReply interface {
	IStatsReply
	GetEntries() []*TableFeatures
}

func (self *TableFeaturesStatsReply) GetEntries() []*TableFeatures {
	return self.Entries
}

func (self *TableFeaturesStatsReply) SetEntries(v []*TableFeatures) {
	self.Entries = v
}

func (self *TableFeaturesStatsReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsReply.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	for _, obj := range self.Entries {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeTableFeaturesStatsReply(parent *StatsReply, decoder *goloxi.Decoder) (*TableFeaturesStatsReply, error) {
	_tablefeaturesstatsreply := &TableFeaturesStatsReply{StatsReply: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("TableFeaturesStatsReply packet too short: %d < 4", decoder.Length())
	}
	decoder.Skip(4)

	for decoder.Length() >= 64 {
		item, err := DecodeTableFeatures(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_tablefeaturesstatsreply.Entries = append(_tablefeaturesstatsreply.Entries, item)
		}
	}
	return _tablefeaturesstatsreply, nil
}

func NewTableFeaturesStatsReply() *TableFeaturesStatsReply {
	obj := &TableFeaturesStatsReply{
		StatsReply: NewStatsReply(12),
	}
	return obj
}

type TableFeaturesStatsRequest struct {
	*StatsRequest
	Entries []*TableFeatures
}

type ITableFeaturesStatsRequest interface {
	IStatsRequest
	GetEntries() []*TableFeatures
}

func (self *TableFeaturesStatsRequest) GetEntries() []*TableFeatures {
	return self.Entries
}

func (self *TableFeaturesStatsRequest) SetEntries(v []*TableFeatures) {
	self.Entries = v
}

func (self *TableFeaturesStatsRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsRequest.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	for _, obj := range self.Entries {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeTableFeaturesStatsRequest(parent *StatsRequest, decoder *goloxi.Decoder) (*TableFeaturesStatsRequest, error) {
	_tablefeaturesstatsrequest := &TableFeaturesStatsRequest{StatsRequest: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("TableFeaturesStatsRequest packet too short: %d < 4", decoder.Length())
	}
	decoder.Skip(4)

	for decoder.Length() >= 64 {
		item, err := DecodeTableFeatures(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_tablefeaturesstatsrequest.Entries = append(_tablefeaturesstatsrequest.Entries, item)
		}
	}
	return _tablefeaturesstatsrequest, nil
}

func NewTableFeaturesStatsRequest() *TableFeaturesStatsRequest {
	obj := &TableFeaturesStatsRequest{
		StatsRequest: NewStatsRequest(12),
	}
	return obj
}

type TableMod struct {
	*Header
	TableId    uint8
	Config     uint32
	Properties []ITableModProp
}

type ITableMod interface {
	IHeader
	GetTableId() uint8
	GetConfig() uint32
	GetProperties() []ITableModProp
}

func (self *TableMod) GetTableId() uint8 {
	return self.TableId
}

func (self *TableMod) SetTableId(v uint8) {
	self.TableId = v
}

func (self *TableMod) GetConfig() uint32 {
	return self.Config
}

func (self *TableMod) SetConfig(v uint32) {
	self.Config = v
}

func (self *TableMod) GetProperties() []ITableModProp {
	return self.Properties
}

func (self *TableMod) SetProperties(v []ITableModProp) {
	self.Properties = v
}

func (self *TableMod) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.Header.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint8(uint8(self.TableId))
	encoder.Write(bytes.Repeat([]byte{0}, 3))
	encoder.PutUint32(uint32(self.Config))
	for _, obj := range self.Properties {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeTableMod(parent *Header, decoder *goloxi.Decoder) (*TableMod, error) {
	_tablemod := &TableMod{Header: parent}
	if decoder.Length() < 8 {
		return nil, fmt.Errorf("TableMod packet too short: %d < 8", decoder.Length())
	}
	_tablemod.TableId = uint8(decoder.ReadByte())
	decoder.Skip(3)
	_tablemod.Config = uint32(decoder.ReadUint32())

	for decoder.Length() >= 4 {
		item, err := DecodeTableModProp(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_tablemod.Properties = append(_tablemod.Properties, item)
		}
	}
	return _tablemod, nil
}

func NewTableMod() *TableMod {
	obj := &TableMod{
		Header: NewHeader(17),
	}
	return obj
}

type TableModFailedErrorMsg struct {
	*ErrorMsg
	Code TableModFailedCode
	Data []byte
}

type ITableModFailedErrorMsg interface {
	IErrorMsg
	GetCode() TableModFailedCode
	GetData() []byte
}

func (self *TableModFailedErrorMsg) GetCode() TableModFailedCode {
	return self.Code
}

func (self *TableModFailedErrorMsg) SetCode(v TableModFailedCode) {
	self.Code = v
}

func (self *TableModFailedErrorMsg) GetData() []byte {
	return self.Data
}

func (self *TableModFailedErrorMsg) SetData(v []byte) {
	self.Data = v
}

func (self *TableModFailedErrorMsg) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.ErrorMsg.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint16(uint16(self.Code))
	encoder.Write(self.Data)
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeTableModFailedErrorMsg(parent *ErrorMsg, decoder *goloxi.Decoder) (*TableModFailedErrorMsg, error) {
	_tablemodfailederrormsg := &TableModFailedErrorMsg{ErrorMsg: parent}
	if decoder.Length() < 2 {
		return nil, fmt.Errorf("TableModFailedErrorMsg packet too short: %d < 2", decoder.Length())
	}
	_tablemodfailederrormsg.Code = TableModFailedCode(decoder.ReadUint16())
	_tablemodfailederrormsg.Data = decoder.Read(int(decoder.Length()))
	return _tablemodfailederrormsg, nil
}

func NewTableModFailedErrorMsg() *TableModFailedErrorMsg {
	obj := &TableModFailedErrorMsg{
		ErrorMsg: NewErrorMsg(8),
	}
	return obj
}

type TableStatsReply struct {
	*StatsReply
	Entries []*TableStatsEntry
}

type ITableStatsReply interface {
	IStatsReply
	GetEntries() []*TableStatsEntry
}

func (self *TableStatsReply) GetEntries() []*TableStatsEntry {
	return self.Entries
}

func (self *TableStatsReply) SetEntries(v []*TableStatsEntry) {
	self.Entries = v
}

func (self *TableStatsReply) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsReply.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	for _, obj := range self.Entries {
		if err := obj.Serialize(encoder); err != nil {
			return err
		}
	}
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeTableStatsReply(parent *StatsReply, decoder *goloxi.Decoder) (*TableStatsReply, error) {
	_tablestatsreply := &TableStatsReply{StatsReply: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("TableStatsReply packet too short: %d < 4", decoder.Length())
	}
	decoder.Skip(4)

	for decoder.Length() >= 24 {
		item, err := DecodeTableStatsEntry(decoder)
		if err != nil {
			return nil, err
		}
		if item != nil {
			_tablestatsreply.Entries = append(_tablestatsreply.Entries, item)
		}
	}
	return _tablestatsreply, nil
}

func NewTableStatsReply() *TableStatsReply {
	obj := &TableStatsReply{
		StatsReply: NewStatsReply(3),
	}
	return obj
}

type TableStatsRequest struct {
	*StatsRequest
}

type ITableStatsRequest interface {
	IStatsRequest
}

func (self *TableStatsRequest) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.StatsRequest.Serialize(encoder); err != nil {
		return err
	}

	encoder.Write(bytes.Repeat([]byte{0}, 4))
	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeTableStatsRequest(parent *StatsRequest, decoder *goloxi.Decoder) (*TableStatsRequest, error) {
	_tablestatsrequest := &TableStatsRequest{StatsRequest: parent}
	if decoder.Length() < 4 {
		return nil, fmt.Errorf("TableStatsRequest packet too short: %d < 4", decoder.Length())
	}
	decoder.Skip(4)
	return _tablestatsrequest, nil
}

func NewTableStatsRequest() *TableStatsRequest {
	obj := &TableStatsRequest{
		StatsRequest: NewStatsRequest(3),
	}
	return obj
}

type TableStatus struct {
	*Header
	Reason TableReason
	Table  TableDesc
}

type ITableStatus interface {
	IHeader
	GetReason() TableReason
	GetTable() TableDesc
}

func (self *TableStatus) GetReason() TableReason {
	return self.Reason
}

func (self *TableStatus) SetReason(v TableReason) {
	self.Reason = v
}

func (self *TableStatus) GetTable() TableDesc {
	return self.Table
}

func (self *TableStatus) SetTable(v TableDesc) {
	self.Table = v
}

func (self *TableStatus) Serialize(encoder *goloxi.Encoder) error {
	startIndex := len(encoder.Bytes())
	if err := self.Header.Serialize(encoder); err != nil {
		return err
	}

	encoder.PutUint8(uint8(self.Reason))
	encoder.Write(bytes.Repeat([]byte{0}, 7))
	if err := self.Table.Serialize(encoder); err != nil {
		return err
	}

	length := len(encoder.Bytes()) - startIndex

	binary.BigEndian.PutUint16(encoder.Bytes()[startIndex+2:startIndex+4], uint16(length))

	return nil
}

func DecodeTableStatus(parent *Header, decoder *goloxi.Decoder) (*TableStatus, error) {
	_tablestatus := &TableStatus{Header: parent}
	if decoder.Length() < 16 {
		return nil, fmt.Errorf("TableStatus packet too short: %d < 16", decoder.Length())
	}
	_tablestatus.Reason = TableReason(decoder.ReadByte())
	decoder.Skip(7)
	if err := _tablestatus.Table.Decode(decoder); err != nil {
		return nil, err
	}

	return _tablestatus, nil
}

func NewTableStatus() *TableStatus {
	obj := &TableStatus{
		Header: NewHeader(31),
	}
	return obj
}
