( br batchReader, conn *net.UDPConn, rxOffload bool, bufs [][]byte, sizes []int, eps []Endpoint, )
| 229 | } |
| 230 | |
| 231 | func (s *StdNetBind) receiveIP( |
| 232 | br batchReader, |
| 233 | conn *net.UDPConn, |
| 234 | rxOffload bool, |
| 235 | bufs [][]byte, |
| 236 | sizes []int, |
| 237 | eps []Endpoint, |
| 238 | ) (n int, err error) { |
| 239 | msgs := s.getMessages() |
| 240 | for i := range bufs { |
| 241 | (*msgs)[i].Buffers[0] = bufs[i] |
| 242 | (*msgs)[i].OOB = (*msgs)[i].OOB[:cap((*msgs)[i].OOB)] |
| 243 | } |
| 244 | defer s.putMessages(msgs) |
| 245 | var numMsgs int |
| 246 | if runtime.GOOS == "linux" || runtime.GOOS == "android" { |
| 247 | if rxOffload { |
| 248 | readAt := len(*msgs) - (IdealBatchSize / udpSegmentMaxDatagrams) |
| 249 | numMsgs, err = br.ReadBatch((*msgs)[readAt:], 0) |
| 250 | if err != nil { |
| 251 | return 0, err |
| 252 | } |
| 253 | numMsgs, err = splitCoalescedMessages(*msgs, readAt, getGSOSize) |
| 254 | if err != nil { |
| 255 | return 0, err |
| 256 | } |
| 257 | } else { |
| 258 | numMsgs, err = br.ReadBatch(*msgs, 0) |
| 259 | if err != nil { |
| 260 | return 0, err |
| 261 | } |
| 262 | } |
| 263 | perf.RecvBatchSize.Add(float64(numMsgs)) |
| 264 | } else { |
| 265 | msg := &(*msgs)[0] |
| 266 | msg.N, msg.NN, _, msg.Addr, err = conn.ReadMsgUDP(msg.Buffers[0], msg.OOB) |
| 267 | if err != nil { |
| 268 | return 0, err |
| 269 | } |
| 270 | numMsgs = 1 |
| 271 | } |
| 272 | perf.RecvsPerSecond.Add(1) |
| 273 | for i := 0; i < numMsgs; i++ { |
| 274 | msg := &(*msgs)[i] |
| 275 | sizes[i] = msg.N |
| 276 | if sizes[i] == 0 { |
| 277 | continue |
| 278 | } |
| 279 | addrPort := msg.Addr.(*net.UDPAddr).AddrPort() |
| 280 | ep := &StdNetEndpoint{AddrPort: addrPort} // TODO: remove allocation |
| 281 | getSrcFromControl(msg.OOB[:msg.NN], ep) |
| 282 | eps[i] = ep |
| 283 | } |
| 284 | return numMsgs, nil |
| 285 | } |
| 286 | |
| 287 | func (s *StdNetBind) makeReceiveIPv4(pc *ipv4.PacketConn, conn *net.UDPConn, rxOffload bool) ReceiveFunc { |
| 288 | return func(bufs [][]byte, sizes []int, eps []Endpoint) (n int, err error) { |
no test coverage detected