Further updates, notify sessions about updated MTU from API call

This commit is contained in:
Neil Alexander 2019-11-21 09:54:36 +00:00
parent d1c445dc41
commit 7c18c6806d
No known key found for this signature in database
GPG Key ID: A02A2019A2BB0944
3 changed files with 22 additions and 13 deletions

View File

@ -233,6 +233,12 @@ func (tun *TunAdapter) UpdateConfig(config *config.NodeConfig) {
// Replace the active configuration with the supplied one // Replace the active configuration with the supplied one
tun.config.Replace(*config) tun.config.Replace(*config)
// If the MTU has changed in the TUN/TAP module then this is where we would
// tell the router so that updated session pings can be sent. However, we
// don't currently update the MTU of the adapter once it has been created so
// this doesn't actually happen in the real world yet.
// tun.core.SetMaximumSessionMTU(...)
// Notify children about the configuration change // Notify children about the configuration change
tun.Act(nil, tun.ckr.configure) tun.Act(nil, tun.ckr.configure)
} }

View File

@ -364,19 +364,23 @@ func (c *Core) SetNodeInfo(nodeinfo interface{}, nodeinfoprivacy bool) {
} }
// GetMaximumSessionMTU returns the maximum allowed session MTU size. // GetMaximumSessionMTU returns the maximum allowed session MTU size.
func (c *Core) GetMaximumSessionMTU(mtu uint16) uint16 { func (c *Core) GetMaximumSessionMTU() uint16 {
mtu := 0 var mtu uint16
phony.Block(c.router, func() { phony.Block(&c.router, func() {
mtu = c.router.sessions.myMaximumMTU mtu = c.router.sessions.myMaximumMTU
}) })
return mtu return mtu
} }
// SetMaximumSessionMTU sets the maximum allowed session MTU size. The default // SetMaximumSessionMTU sets the maximum allowed session MTU size. The default
// value is 65535 bytes. // value is 65535 bytes. Session pings will be sent to update all open sessions
// if the MTU has changed.
func (c *Core) SetMaximumSessionMTU(mtu uint16) { func (c *Core) SetMaximumSessionMTU(mtu uint16) {
phony.Block(c.router, func() { phony.Block(&c.router, func() {
if c.router.sessions.myMaximumMTU != mtu {
c.router.sessions.myMaximumMTU = mtu c.router.sessions.myMaximumMTU = mtu
c.router.sessions.reconfigure()
}
}) })
} }

View File

@ -55,10 +55,6 @@ type sessionInfo struct {
callbacks []chan func() // Finished work from crypto workers callbacks []chan func() // Finished work from crypto workers
} }
func (sinfo *sessionInfo) reconfigure() {
// This is where reconfiguration would go, if we had anything to do
}
// Represents a session ping/pong packet, andincludes information like public keys, a session handle, coords, a timestamp to prevent replays, and the tun/tap MTU. // Represents a session ping/pong packet, andincludes information like public keys, a session handle, coords, a timestamp to prevent replays, and the tun/tap MTU.
type sessionPing struct { type sessionPing struct {
SendPermPub crypto.BoxPubKey // Sender's permanent key SendPermPub crypto.BoxPubKey // Sender's permanent key
@ -138,9 +134,12 @@ func (ss *sessions) init(r *router) {
} }
func (ss *sessions) reconfigure() { func (ss *sessions) reconfigure() {
ss.router.Act(nil, func() {
for _, session := range ss.sinfos { for _, session := range ss.sinfos {
session.reconfigure() session.myMTU = ss.myMaximumMTU
session.ping(ss.router)
} }
})
} }
// Determines whether the session with a given publickey is allowed based on // Determines whether the session with a given publickey is allowed based on