github.com/contiv/libOpenflow@v0.0.0-20210609050114-d967b14cc688/openflow13/port.go (about)

     1  package openflow13
     2  
     3  import (
     4  	"encoding/binary"
     5  	"net"
     6  
     7  	"github.com/contiv/libOpenflow/common"
     8  )
     9  
    10  // ofp_port 1.3
    11  type PhyPort struct {
    12  	PortNo uint32
    13  	pad    []byte // 4 bytes
    14  	HWAddr net.HardwareAddr
    15  	pad2   []byte // 2 bytes for 64bit alignment
    16  	Name   []byte // Size 16
    17  
    18  	Config uint32
    19  	State  uint32
    20  
    21  	Curr       uint32
    22  	Advertised uint32
    23  	Supported  uint32
    24  	Peer       uint32
    25  
    26  	CurrSpeed uint32
    27  	MaxSpeed  uint32
    28  }
    29  
    30  func NewPhyPort() *PhyPort {
    31  	p := new(PhyPort)
    32  	p.HWAddr = make([]byte, ETH_ALEN)
    33  	p.Name = make([]byte, 16)
    34  	return p
    35  }
    36  
    37  func (p *PhyPort) Len() (n uint16) {
    38  	n += 4
    39  	n += 6 // padding
    40  	n += uint16(len(p.HWAddr) + len(p.Name))
    41  	n += 32
    42  	return
    43  }
    44  
    45  func (p *PhyPort) MarshalBinary() (data []byte, err error) {
    46  	data = make([]byte, int(p.Len()))
    47  	binary.BigEndian.PutUint32(data, p.PortNo)
    48  	n := 4
    49  	copy(data[n:], p.pad)
    50  	n += 4
    51  	copy(data[n:], p.HWAddr)
    52  	n += len(p.HWAddr)
    53  	copy(data[n:], p.pad2)
    54  	n += 2
    55  	copy(data[n:], p.Name)
    56  	n += len(p.Name)
    57  
    58  	binary.BigEndian.PutUint32(data[n:], p.Config)
    59  	n += 4
    60  	binary.BigEndian.PutUint32(data[n:], p.State)
    61  	n += 4
    62  	binary.BigEndian.PutUint32(data[n:], p.Curr)
    63  	n += 4
    64  	binary.BigEndian.PutUint32(data[n:], p.Advertised)
    65  	n += 4
    66  	binary.BigEndian.PutUint32(data[n:], p.Supported)
    67  	n += 4
    68  	binary.BigEndian.PutUint32(data[n:], p.Peer)
    69  	n += 4
    70  	binary.BigEndian.PutUint32(data[n:], p.CurrSpeed)
    71  	n += 4
    72  	binary.BigEndian.PutUint32(data[n:], p.MaxSpeed)
    73  	n += 4
    74  	return
    75  }
    76  
    77  func (p *PhyPort) UnmarshalBinary(data []byte) error {
    78  	p.PortNo = binary.BigEndian.Uint32(data)
    79  	n := 4
    80  	copy(p.pad, data[n:n+4])
    81  	n += 4
    82  	copy(p.HWAddr, data[n:n+6])
    83  	n += 6
    84  	copy(p.pad2, data[n:n+2])
    85  	n += 2
    86  	copy(p.Name, data[n:n+16])
    87  	n += 16
    88  
    89  	p.Config = binary.BigEndian.Uint32(data[n:])
    90  	n += 4
    91  	p.State = binary.BigEndian.Uint32(data[n:])
    92  	n += 4
    93  	p.Curr = binary.BigEndian.Uint32(data[n:])
    94  	n += 4
    95  	p.Advertised = binary.BigEndian.Uint32(data[n:])
    96  	n += 4
    97  	p.Supported = binary.BigEndian.Uint32(data[n:])
    98  	n += 4
    99  	p.Peer = binary.BigEndian.Uint32(data[n:])
   100  	n += 4
   101  	p.CurrSpeed = binary.BigEndian.Uint32(data[n:])
   102  	n += 4
   103  	p.MaxSpeed = binary.BigEndian.Uint32(data[n:])
   104  	n += 4
   105  	return nil
   106  }
   107  
   108  // ofp_port_mod 1.3
   109  type PortMod struct {
   110  	common.Header
   111  	PortNo uint32
   112  	pad    []byte // 4 bytes
   113  	HWAddr []uint8
   114  	pad2   []byte // 2 bytes for 64byte alignment
   115  
   116  	Config    uint32
   117  	Mask      uint32
   118  	Advertise uint32
   119  	pad3      []uint8 // Size 4
   120  }
   121  
   122  func NewPortMod(port int) *PortMod {
   123  	p := new(PortMod)
   124  	p.Header.Type = Type_PortMod
   125  	p.PortNo = uint32(port)
   126  	p.HWAddr = make([]byte, ETH_ALEN)
   127  	p.pad = make([]byte, 4)
   128  	p.pad2 = make([]byte, 2)
   129  	p.pad3 = make([]byte, 4)
   130  	return p
   131  }
   132  
   133  func (p *PortMod) Len() (n uint16) {
   134  	return p.Header.Len() + 4 + 4 + ETH_ALEN + 2 + 12 + 4
   135  }
   136  
   137  func (p *PortMod) MarshalBinary() (data []byte, err error) {
   138  	p.Header.Length = p.Len()
   139  	data, err = p.Header.MarshalBinary()
   140  
   141  	b := make([]byte, 32)
   142  	n := 0
   143  	binary.BigEndian.PutUint32(b[n:], p.PortNo)
   144  	n += 4
   145  	copy(b[n:], p.pad)
   146  	n += 4
   147  	copy(b[n:], p.HWAddr)
   148  	n += ETH_ALEN
   149  	copy(b[n:], p.pad2)
   150  	n += 2
   151  	binary.BigEndian.PutUint32(b[n:], p.Config)
   152  	n += 4
   153  	binary.BigEndian.PutUint32(b[n:], p.Mask)
   154  	n += 4
   155  	binary.BigEndian.PutUint32(b[n:], p.Advertise)
   156  	n += 4
   157  	copy(b[n:], p.pad3)
   158  	n += 4
   159  	data = append(data, b...)
   160  	return
   161  }
   162  
   163  func (p *PortMod) UnmarshalBinary(data []byte) error {
   164  	err := p.Header.UnmarshalBinary(data)
   165  	n := int(p.Header.Len())
   166  
   167  	p.PortNo = binary.BigEndian.Uint32(data[n:])
   168  	n += 4
   169  	copy(p.pad, data[n:n+4])
   170  	n += 4
   171  	copy(p.HWAddr, data[n:])
   172  	n += len(p.HWAddr)
   173  	copy(p.pad2, data[n:n+2])
   174  	n += 2
   175  	p.Config = binary.BigEndian.Uint32(data[n:])
   176  	n += 4
   177  	p.Mask = binary.BigEndian.Uint32(data[n:])
   178  	n += 4
   179  	p.Advertise = binary.BigEndian.Uint32(data[n:])
   180  	n += 4
   181  	copy(p.pad3, data[n:])
   182  	n += 4
   183  	return err
   184  }
   185  
   186  const (
   187  	ETH_ALEN          = 6
   188  	MAX_PORT_NAME_LEN = 16
   189  )
   190  
   191  // ofp_port_config 1.3
   192  const (
   193  	PC_PORT_DOWN = 1 << 0
   194  
   195  	PC_NO_RECV      = 1 << 2
   196  	PC_NO_FWD       = 1 << 5
   197  	PC_NO_PACKET_IN = 1 << 6
   198  )
   199  
   200  // ofp_port_state 1.3
   201  const (
   202  	PS_LINK_DOWN = 1 << 0
   203  	PS_BLOCKED   = 1 << 1
   204  	PS_LIVE      = 1 << 2
   205  )
   206  
   207  // ofp_port_no 1.3
   208  const (
   209  	P_MAX = 0xffffff00
   210  
   211  	P_IN_PORT = 0xfffffff8
   212  	P_TABLE   = 0xfffffff9
   213  
   214  	P_NORMAL = 0xfffffffa
   215  	P_FLOOD  = 0xfffffffb
   216  
   217  	P_ALL        = 0xfffffffc
   218  	P_CONTROLLER = 0xfffffffd
   219  	P_LOCAL      = 0xfffffffe
   220  	P_ANY        = 0xffffffff
   221  )
   222  
   223  // ofp_port_features 1.3
   224  const (
   225  	PF_10MB_HD  = 1 << 0
   226  	PF_10MB_FD  = 1 << 1
   227  	PF_100MB_HD = 1 << 2
   228  	PF_100MB_FD = 1 << 3
   229  	PF_1GB_HD   = 1 << 4
   230  	PF_1GB_FD   = 1 << 5
   231  	PF_10GB_FD  = 1 << 6
   232  	PF_40GB_FD  = 1 << 7
   233  	PF_100GB_FD = 1 << 8
   234  	PF_1TB_FD   = 1 << 9
   235  	PF_OTHER    = 1 << 10
   236  
   237  	PF_COPPER     = 1 << 11
   238  	PF_FIBER      = 1 << 12
   239  	PF_AUTONEG    = 1 << 13
   240  	PF_PAUSE      = 1 << 14
   241  	PF_PAUSE_ASYM = 1 << 15
   242  )
   243  
   244  // END: 13 - 7.2.1