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