func (c *controller) handleKeyChange(keys []*types.EncryptionKey) error { drvEnc := discoverapi.DriverEncryptionUpdate{} a := c.agent // Find the deleted key. If the deleted key was the primary key, // a new primary key should be set before removing if from keyring. deleted := []byte{} j := len(c.keys) for i := 0; i < j; { same := false for _, key := range keys { if same = key.LamportTime == c.keys[i].LamportTime; same { break } } if !same { cKey := c.keys[i] if cKey.Subsystem == subsysGossip { deleted = cKey.Key } if cKey.Subsystem == subsysIPSec { drvEnc.Prune = cKey.Key drvEnc.PruneTag = cKey.LamportTime } c.keys[i], c.keys[j-1] = c.keys[j-1], c.keys[i] c.keys[j-1] = nil j-- } i++ } c.keys = c.keys[:j] // Find the new key and add it to the key ring for _, key := range keys { same := false for _, cKey := range c.keys { if same = cKey.LamportTime == key.LamportTime; same { break } } if !same { c.keys = append(c.keys, key) if key.Subsystem == subsysGossip { a.networkDB.SetKey(key.Key) } if key.Subsystem == subsysIPSec { drvEnc.Key = key.Key drvEnc.Tag = key.LamportTime } } } key, tag := c.getPrimaryKeyTag(subsysGossip) a.networkDB.SetPrimaryKey(key) key, tag = c.getPrimaryKeyTag(subsysIPSec) drvEnc.Primary = key drvEnc.PrimaryTag = tag if len(deleted) > 0 { a.networkDB.RemoveKey(deleted) } c.drvRegistry.WalkDrivers(func(name string, driver driverapi.Driver, capability driverapi.Capability) bool { err := driver.DiscoverNew(discoverapi.EncryptionKeysUpdate, drvEnc) if err != nil { logrus.Warnf("Failed to update datapath keys in driver %s: %v", name, err) } return false }) return nil }
func (c *controller) handleKeyChangeV1(keys []*types.EncryptionKey) error { drvEnc := discoverapi.DriverEncryptionUpdate{} // Find the new key and add it to the key ring a := c.agent for _, key := range keys { same := false for _, cKey := range c.keys { if same = cKey.LamportTime == key.LamportTime; same { break } } if !same { c.keys = append(c.keys, key) if key.Subsystem == subsysGossip { a.networkDB.SetKey(key.Key) } if key.Subsystem == subsysGossip /*subsysIPSec*/ { drvEnc.Key = key.Key drvEnc.Tag = key.LamportTime } break } } // Find the deleted key. If the deleted key was the primary key, // a new primary key should be set before removing if from keyring. deleted := []byte{} for i, cKey := range c.keys { same := false for _, key := range keys { if same = key.LamportTime == cKey.LamportTime; same { break } } if !same { if cKey.Subsystem == subsysGossip { deleted = cKey.Key } if cKey.Subsystem == subsysGossip /*subsysIPSec*/ { drvEnc.Prune = cKey.Key drvEnc.PruneTag = cKey.LamportTime } c.keys = append(c.keys[:i], c.keys[i+1:]...) break } } sort.Sort(ByTime(c.keys)) for _, key := range c.keys { if key.Subsystem == subsysGossip { a.networkDB.SetPrimaryKey(key.Key) break } } for _, key := range c.keys { if key.Subsystem == subsysGossip /*subsysIPSec*/ { drvEnc.Primary = key.Key drvEnc.PrimaryTag = key.LamportTime break } } if len(deleted) > 0 { a.networkDB.RemoveKey(deleted) } c.drvRegistry.WalkDrivers(func(name string, driver driverapi.Driver, capability driverapi.Capability) bool { err := driver.DiscoverNew(discoverapi.EncryptionKeysUpdate, drvEnc) if err != nil { logrus.Warnf("Failed to update datapath keys in driver %s: %v", name, err) } return false }) return nil }