// CreatePort creates a port in ovs switch func (sw *OvsSwitch) CreatePort(intfName, intfType string, cfgEp *OvsCfgEndpointState, pktTag int) error { // Ask OVSDB driver to add/delete the port err := sw.ovsdbDriver.CreatePort(intfName, intfType, cfgEp.ID, pktTag) if err != nil { return err } defer func() { if err != nil { sw.ovsdbDriver.DeletePort(intfName) } }() // Wait a little for OVS to create the interface time.Sleep(300 * time.Millisecond) if intfType != "internal" { log.Fatalf("Not expecting interface type :%s.", intfType) } // Set the interface mac address err = netutils.SetInterfaceMac(intfName, cfgEp.MacAddress) if err != nil { log.Errorf("Error setting interface Mac %s on port %s", cfgEp.MacAddress, intfName) return err } // Add the endpoint to ofnet if sw.netType == "vxlan" { // Get the openflow port number for the interface ofpPort, err := sw.ovsdbDriver.GetOfpPortNo(intfName) if err != nil { log.Errorf("Could not find the OVS port %s. Err: %v", intfName, err) return err } macAddr, _ := net.ParseMAC(cfgEp.MacAddress) // Build the endpoint info endpoint := ofnet.EndpointInfo{ PortNo: ofpPort, MacAddr: macAddr, Vlan: uint16(pktTag), IpAddr: net.ParseIP(cfgEp.IPAddress), } // Add the local port to ofnet err = sw.ofnetAgent.AddLocalEndpoint(endpoint) if err != nil { log.Errorf("Error adding local port %s to ofnet. Err: %v", intfName, err) return err } } return nil }
// CreatePort creates a port in ovs switch func (sw *OvsSwitch) CreatePort(intfName string, cfgEp *OvsCfgEndpointState, pktTag int) error { var ovsIntfType string // Get OVS port name ovsPortName := getOvsPostName(intfName) // Create Veth pairs if required if useVethPair { ovsIntfType = "" // Create a Veth pair err := createVethPair(intfName, ovsPortName) if err != nil { log.Errorf("Error creating veth pairs. Err: %v", err) return err } // Set the OVS side of the port as up err = setLinkUp(ovsPortName) if err != nil { log.Errorf("Error setting link %s up. Err: %v", ovsPortName, err) return err } } else { ovsIntfType = "internal" } // Ask OVSDB driver to add the port err := sw.ovsdbDriver.CreatePort(ovsPortName, ovsIntfType, cfgEp.ID, pktTag) if err != nil { return err } defer func() { if err != nil { sw.ovsdbDriver.DeletePort(intfName) } }() // Wait a little for OVS to create the interface time.Sleep(300 * time.Millisecond) // Set the interface mac address err = netutils.SetInterfaceMac(intfName, cfgEp.MacAddress) if err != nil { log.Errorf("Error setting interface Mac %s on port %s", cfgEp.MacAddress, intfName) return err } // Add the endpoint to ofnet if sw.netType == "vxlan" { // Get the openflow port number for the interface ofpPort, err := sw.ovsdbDriver.GetOfpPortNo(ovsPortName) if err != nil { log.Errorf("Could not find the OVS port %s. Err: %v", ovsPortName, err) return err } macAddr, _ := net.ParseMAC(cfgEp.MacAddress) // Build the endpoint info endpoint := ofnet.EndpointInfo{ PortNo: ofpPort, MacAddr: macAddr, Vlan: uint16(pktTag), IpAddr: net.ParseIP(cfgEp.IPAddress), } // Add the local port to ofnet err = sw.ofnetAgent.AddLocalEndpoint(endpoint) if err != nil { log.Errorf("Error adding local port %s to ofnet. Err: %v", ovsPortName, err) return err } } return nil }