func CreateDatapath(dpname string) error { dpif, err := odp.NewDpif() if err != nil { return err } defer dpif.Close() _, err = dpif.CreateDatapath(dpname) if err != nil && !odp.IsDatapathNameAlreadyExistsError(err) { return err } return nil }
func CreateDatapath(dpname string) (err error, supported bool) { dpif, err := odp.NewDpif() if err != nil { if odp.IsKernelLacksODPError(err) { return nil, false } return err, true } defer dpif.Close() dp, err := dpif.CreateDatapath(dpname) if err != nil && !odp.IsDatapathNameAlreadyExistsError(err) { return err, true } // Pick an ephemeral port number to use in probing for vxlan // support. udpconn, err := net.ListenUDP("udp4", nil) if err != nil { return err, true } // we leave the UDP socket open, so creating a vxlan vport on // the same port number should fail. But that's fine: It's // still sufficient to probe for support. portno := uint16(udpconn.LocalAddr().(*net.UDPAddr).Port) vpid, err := dp.CreateVport(odp.NewVxlanVportSpec( fmt.Sprintf("vxlan-%d", portno), portno)) if nlerr, ok := err.(odp.NetlinkError); ok { if syscall.Errno(nlerr) == syscall.EAFNOSUPPORT { dp.Delete() return fmt.Errorf("kernel does not have Open vSwitch VXLAN support"), false } } if err == nil { dp.DeleteVport(vpid) } udpconn.Close() return nil, true }
func addDatapath(f Flags) bool { args := f.Parse(1, 1) dpif, err := odp.NewDpif() if err != nil { return printErr("%s", err) } defer dpif.Close() _, err = dpif.CreateDatapath(args[0]) if err != nil { if odp.IsDatapathNameAlreadyExistsError(err) { return printErr("Network device named %s already exists", args[0]) } else { return printErr("%s", err) } } return true }