isUp AtomicBool // device is (going) up
isClosed AtomicBool // device is closed? (acting as guard)
log *Logger
- ipcSetMu sync.Mutex // serializes UAPI set operations
// synchronized resources (locks acquired in order)
device tun.Device
mtu int32
}
+
+ ipcMutex sync.RWMutex
}
// An encryptionQueue is a channel of QueueOutboundElements awaiting encryption.
// IpcGetOperation implements the WireGuard configuration protocol "get" operation.
// See https://www.wireguard.com/xplatform/#configuration-protocol for details.
func (device *Device) IpcGetOperation(w io.Writer) error {
+ device.ipcMutex.RLock()
+ defer device.ipcMutex.RUnlock()
+
buf := byteBufferPool.Get().(*bytes.Buffer)
buf.Reset()
defer byteBufferPool.Put(buf)
// IpcSetOperation implements the WireGuard configuration protocol "set" operation.
// See https://www.wireguard.com/xplatform/#configuration-protocol for details.
func (device *Device) IpcSetOperation(r io.Reader) (err error) {
- device.ipcSetMu.Lock()
- defer device.ipcSetMu.Unlock()
+ device.ipcMutex.Lock()
+ defer device.ipcMutex.Unlock()
defer func() {
if err != nil {