[VOL-3489] Sending packet-in/out only to the master instance
Change-Id: Ibaf23d4d604f0d70547df7971792af322bc9e317
diff --git a/internal/pkg/openflow/client.go b/internal/pkg/openflow/client.go
index b7d5a28..c67a67a 100644
--- a/internal/pkg/openflow/client.go
+++ b/internal/pkg/openflow/client.go
@@ -90,6 +90,22 @@
}
}
+func (r ofcRole) String() string {
+ switch r {
+ case ofcRoleNone:
+ return "ofcRoleNone"
+ case ofcRoleEqual:
+ return "ofcRoleEqual"
+ case ofcRoleMaster:
+ return "ofcRoleMaster"
+ case ofcRoleSlave:
+ return "ofcRoleSlave"
+ default:
+ return "ofc-role-unknown"
+
+ }
+}
+
// OFClient the configuration and operational state of a connection to an
// openflow controller
type OFClient struct {
@@ -123,7 +139,7 @@
// UpdateRoles validates a role request and updates role state for connections where it changed
func (ofc *OFClient) UpdateRoles(ctx context.Context, from string, request *ofp.RoleRequest) bool {
- logger.Debug(ctx, "updating role", log.Fields{
+ logger.Debugw(ctx, "updating-role", log.Fields{
"from": from,
"to": request.Role,
"id": request.GenerationId})
@@ -150,9 +166,15 @@
for endpoint, connection := range ofc.connections {
if endpoint == from {
connection.role = ofcRoleMaster
+ logger.Infow(ctx, "updating-master", log.Fields{
+ "endpoint": endpoint,
+ })
} else if connection.role == ofcRoleMaster {
// the old master should be set to slave
connection.role = ofcRoleSlave
+ logger.Debugw(ctx, "updating-slave", log.Fields{
+ "endpoint": endpoint,
+ })
}
}
return true
@@ -228,8 +250,28 @@
}
func (ofc *OFClient) SendMessage(ctx context.Context, message Message) error {
- for _, connection := range ofc.connections {
- if connection.role == ofcRoleMaster || connection.role == ofcRoleEqual {
+
+ var toEqual bool
+ var msgType string
+
+ switch message.(type) {
+ case *ofp.PortStatus:
+ msgType = "PortStatus"
+ toEqual = true
+ case *ofp.PacketIn:
+ msgType = "PacketIn"
+ toEqual = false
+ default:
+ toEqual = true
+ }
+
+ for endpoint, connection := range ofc.connections {
+ if connection.role == ofcRoleMaster || (connection.role == ofcRoleEqual && toEqual) {
+ logger.Debugw(ctx, "sending-message", log.Fields{
+ "endpoint": endpoint,
+ "toEqual": toEqual,
+ "msgType": msgType,
+ })
err := connection.SendMessage(ctx, message)
if err != nil {
return err
diff --git a/internal/pkg/openflow/connection.go b/internal/pkg/openflow/connection.go
index 3908aeb..08f848a 100644
--- a/internal/pkg/openflow/connection.go
+++ b/internal/pkg/openflow/connection.go
@@ -492,7 +492,10 @@
// SendMessage queues a message to be sent to the openflow controller
func (ofc *OFConnection) SendMessage(ctx context.Context, message Message) error {
- logger.Debug(ctx, "queuing-message")
+ logger.Debugw(ctx, "queuing-message", log.Fields{
+ "endpoint": ofc.OFControllerEndPoint,
+ "role": ofc.role,
+ })
ofc.sendChannel <- message
return nil
}