return atomic.LoadInt32(&elem.dropped) == AtomicTrue
}
-func (device *Device) addToInboundAndDecryptionQueues(inboundQueue chan *QueueInboundElement, decryptionQueue chan *QueueInboundElement, elem *QueueInboundElement) bool {
- select {
- case inboundQueue <- elem:
- select {
- case decryptionQueue <- elem:
- return true
- default:
- elem.Drop()
- elem.Unlock()
- return false
- }
- default:
- device.PutInboundElement(elem)
- return false
- }
-}
-
func (device *Device) addToHandshakeQueue(queue chan QueueHandshakeElement, elem QueueHandshakeElement) bool {
select {
case queue <- elem:
peer.queue.RLock()
if peer.isRunning.Get() {
- if device.addToInboundAndDecryptionQueues(peer.queue.inbound, device.queue.decryption.c, elem) {
- buffer = device.GetMessageBuffer()
- }
+ peer.queue.inbound <- elem
+ device.queue.decryption.c <- elem
+ buffer = device.GetMessageBuffer()
} else {
device.PutInboundElement(elem)
}
}
}
-func addToOutboundAndEncryptionQueues(outboundQueue chan *QueueOutboundElement, encryptionQueue chan *QueueOutboundElement, elem *QueueOutboundElement) {
- select {
- case outboundQueue <- elem:
- select {
- case encryptionQueue <- elem:
- return
- default:
- elem.Drop()
- elem.peer.device.PutMessageBuffer(elem.buffer)
- elem.Unlock()
- }
- default:
- elem.peer.device.PutMessageBuffer(elem.buffer)
- elem.peer.device.PutOutboundElement(elem)
- }
-}
-
/* Queues a keepalive if no packets are queued for peer
*/
func (peer *Peer) SendKeepalive() bool {
elem.Lock()
// add to parallel and sequential queue
- addToOutboundAndEncryptionQueues(peer.queue.outbound, device.queue.encryption.c, elem)
+ peer.queue.outbound <- elem
+ device.queue.encryption.c <- elem
}
}
}