()
| 299 | } |
| 300 | |
| 301 | func (peer *Peer) SendStagedPackets() { |
| 302 | top: |
| 303 | if len(peer.queue.staged) == 0 || !peer.device.isUp() { |
| 304 | return |
| 305 | } |
| 306 | |
| 307 | keypair := peer.keypairs.Current() |
| 308 | if keypair == nil || keypair.sendNonce.Load() >= RejectAfterMessages || time.Since(keypair.created) >= RejectAfterTime { |
| 309 | peer.SendHandshakeInitiation(false) |
| 310 | return |
| 311 | } |
| 312 | |
| 313 | for { |
| 314 | var elemsContainerOOO *QueueOutboundElementsContainer |
| 315 | select { |
| 316 | case elemsContainer := <-peer.queue.staged: |
| 317 | i := 0 |
| 318 | for _, elem := range elemsContainer.elems { |
| 319 | elem.peer = peer |
| 320 | elem.nonce = keypair.sendNonce.Add(1) - 1 |
| 321 | if elem.nonce >= RejectAfterMessages { |
| 322 | keypair.sendNonce.Store(RejectAfterMessages) |
| 323 | if elemsContainerOOO == nil { |
| 324 | elemsContainerOOO = peer.device.GetOutboundElementsContainer() |
| 325 | } |
| 326 | elemsContainerOOO.elems = append(elemsContainerOOO.elems, elem) |
| 327 | continue |
| 328 | } else { |
| 329 | elemsContainer.elems[i] = elem |
| 330 | i++ |
| 331 | } |
| 332 | |
| 333 | elem.keypair = keypair |
| 334 | } |
| 335 | elemsContainer.Lock() |
| 336 | elemsContainer.elems = elemsContainer.elems[:i] |
| 337 | |
| 338 | if elemsContainerOOO != nil { |
| 339 | peer.StagePackets(elemsContainerOOO) // XXX: Out of order, but we can't front-load go chans |
| 340 | } |
| 341 | |
| 342 | if len(elemsContainer.elems) == 0 { |
| 343 | peer.device.PutOutboundElementsContainer(elemsContainer) |
| 344 | goto top |
| 345 | } |
| 346 | |
| 347 | // add to parallel and sequential queue |
| 348 | if peer.isRunning.Load() { |
| 349 | peer.queue.outbound.c <- elemsContainer |
| 350 | peer.device.queue.encryption.c <- elemsContainer |
| 351 | } else { |
| 352 | for _, elem := range elemsContainer.elems { |
| 353 | peer.device.PutMessageBuffer(elem.buffer) |
| 354 | peer.device.PutOutboundElement(elem) |
| 355 | } |
| 356 | peer.device.PutOutboundElementsContainer(elemsContainer) |
| 357 | } |
| 358 |
no test coverage detected