diff --git a/src/switch/cmd/ned-server/main.go b/src/switch/cmd/ned-server/main.go index 8ebb070f6c9b4343435a29ad35c2fbe825b94454..e1626f51b18b9442fdd9451d8abab23ef482f96a 100644 --- a/src/switch/cmd/ned-server/main.go +++ b/src/switch/cmd/ned-server/main.go @@ -49,8 +49,7 @@ func main() { fmt.Println("Initializing switch, connected to controller: ", settings.ControllerIP) - nedBridgeName, _ := utils.GenerateBridgeName(settings.NedName) - bridge, err := inits.InitializeSwitch(nedBridgeName, settings.ControllerIP) + bridge, err := inits.InitializeSwitch(settings.NedName, settings.ControllerIP) if err != nil { log.Fatalf("error initializing ned: %v", err) } @@ -112,6 +111,12 @@ func (s *server) AttachInterface(ctx context.Context, req *nedpb.AttachInterface // Create a new interface and attach it to the bridge newPort, err := AddInterfaceToBridge(interfaceName) + if err != nil { + return nil, fmt.Errorf("failed to create interface: %v", err) + } + + err = s.Bridge.AddPort(newPort) + if err != nil { return nil, fmt.Errorf("failed to add interface to bridge: %v", err) } @@ -137,14 +142,13 @@ func (s *server) AttachInterface(ctx context.Context, req *nedpb.AttachInterface func AddInterfaceToBridge(bridgeName string) (string, error) { // Generate unique interface names timestamp := time.Now().UnixNano() - vethName := fmt.Sprintf("veth%d", timestamp) - peerName := fmt.Sprintf("vpeer%d", timestamp) + vethName, _ := utils.GenerateInterfaceName("veth", fmt.Sprintf("%s%d", bridgeName, timestamp)) + peerName, _ := utils.GenerateInterfaceName("vpeer", fmt.Sprintf("%s%d", bridgeName, timestamp)) // Create the veth pair if err := exec.Command("ip", "link", "add", vethName, "type", "veth", "peer", "name", peerName).Run(); err != nil { return "", fmt.Errorf("failed to create veth pair: %v", err) } - // Set both interfaces up if err := exec.Command("ip", "link", "set", vethName, "up").Run(); err != nil { return "", fmt.Errorf("failed to set %s up: %v", vethName, err) @@ -153,12 +157,11 @@ func AddInterfaceToBridge(bridgeName string) (string, error) { return "", fmt.Errorf("failed to set %s up: %v", peerName, err) } - // Add one end to the Linux bridge - if err := exec.Command("ip", "link", "set", vethName, "master", bridgeName).Run(); err != nil { - return "", fmt.Errorf("failed to add %s to bridge %s: %v", vethName, bridgeName, err) + if err := exec.Command("ip", "link", "set", peerName, "master", bridgeName).Run(); err != nil { + return "", fmt.Errorf("failed to add %s to bridge %s: %v", peerName, bridgeName, err) } - return peerName, nil + return vethName, nil } func takeArguments() (string, string, error) { diff --git a/src/switch/pkg/utils/utils.go b/src/switch/pkg/utils/utils.go index f897b0e968cdcd3819d7d0a4bf94b0be20b1a55d..d80daee0fa243990e41d251f64cb0a1a859a0a58 100644 --- a/src/switch/pkg/utils/utils.go +++ b/src/switch/pkg/utils/utils.go @@ -6,7 +6,7 @@ import ( "fmt" ) -func GenerateBridgeName(uniqueIdentifier string) (string, error) { +func GenerateInterfaceName(prefix, uniqueIdentifier string) (string, error) { // Create a SHA-256 hash of the input string hash := sha256.New() _, err := hash.Write([]byte(uniqueIdentifier)) @@ -20,5 +20,5 @@ func GenerateBridgeName(uniqueIdentifier string) (string, error) { digestedName := fullHash[:5] // Return the formatted bridge name - return fmt.Sprintf("br-%s", digestedName), nil + return fmt.Sprintf("%s%s", prefix, digestedName), nil }