func NetInit(stn *SandboxNetwork, htn *HostNetwork, log *logging.Logger) error { if os.Getpid() == 1 { panic(errors.New("Cannot use NetInit from child.")) } // Seed random number generator (poorly but we're not doing crypto) rand.Seed(time.Now().Unix() ^ int64(os.Getpid())) log.Info("Configuring host veth pair '%s' with: %s", stn.VethHost, stn.Ip+"/"+htn.Class) /* // Fetch the bridge from the ifname br, err := tenus.BridgeFromName(ozDefaultInterfaceBridge) if err != nil { return fmt.Errorf("Unable to attach to bridge interface %, %s.", ozDefaultInterfaceBridge, err) } */ // Make sure the bridge is configured and the link is up // This really shouldn't be needed, but Network-Manager is a PITA // and even if you actualy ignore the interface there's a race // between the interface being created and setting it's hwaddr //if err := htn.configureBridgeInterface(log); err != nil { // return fmt.Errorf("Unable to reconfigure bridge: %+v", err) //} // Create the veth pair veth, err := tenus.NewVethPairWithOptions(stn.VethHost, tenus.VethOptions{PeerName: stn.VethGuest}) if err != nil { return fmt.Errorf("Unable to create veth pair %s, %s.", stn.VethHost, err) } // Fetch the newly created hostside veth vethIf, err := net.InterfaceByName(stn.VethHost) if err != nil { return fmt.Errorf("Unable to fetch veth pair %s, %s.", stn.VethHost, err) } // Add the host side veth to the bridge if err := htn.Interface.AddSlaveIfc(vethIf); err != nil { return fmt.Errorf("Unable to add veth pair %s to bridge, %s.", stn.VethHost, err) } // Bring the host side veth interface up if err := veth.SetLinkUp(); err != nil { return fmt.Errorf("Unable to bring veth pair %s up, %s.", stn.VethHost, err) } stn.Veth = veth return nil }
func NetInit(stn *SandboxNetwork, htn *HostNetwork, log *logging.Logger) error { if os.Getpid() == 1 { panic(errors.New("Cannot use NetInit from child.")) } // Seed random number generator (poorly but we're not doing crypto) rand.Seed(time.Now().Unix() ^ int64(os.Getpid())) log.Info("Configuring host veth pair '%s' with: %s", stn.VethHost, stn.Ip+"/"+htn.Class) // Create the veth pair veth, err := tenus.NewVethPairWithOptions(stn.VethHost, tenus.VethOptions{PeerName: stn.VethGuest}) if err != nil { return fmt.Errorf("Unable to create veth pair %s, %s.", stn.VethHost, err) } // Fetch the newly created hostside veth vethIf, err := net.InterfaceByName(stn.VethHost) if err != nil { return fmt.Errorf("Unable to fetch veth pair %s, %s.", stn.VethHost, err) } // Add the host side veth to the bridge if err := htn.Interface.AddSlaveIfc(vethIf); err != nil { return fmt.Errorf("Unable to add veth pair %s to bridge, %s.", stn.VethHost, err) } // Bring the host side veth interface up if err := veth.SetLinkUp(); err != nil { return fmt.Errorf("Unable to bring veth pair %s up, %s.", stn.VethHost, err) } stn.Veth = veth return nil }
func main() { // CREATE BRIDGE AND BRING IT UP br, err := tenus.NewBridgeWithName("mybridge") if err != nil { log.Fatal(err) } ip, ipNet, err := net.ParseCIDR("10.0.41.1/16") if err != nil { log.Fatal(err) } if err := br.SetLinkIp(ip, ipNet); err != nil { fmt.Println(err) } if err = br.SetLinkUp(); err != nil { fmt.Println(err) } // CREATE VETH PAIR veth, err := tenus.NewVethPairWithOptions("myveth01", tenus.VethOptions{PeerName: "myveth02"}) if err != nil { log.Fatal(err) } // ASSIGN AN IP TO MYVETH01 ip, ipNet, err = net.ParseCIDR("10.0.41.2/16") if err != nil { log.Fatal(err) } if err = veth.SetLinkIp(ip, ipNet); err != nil { fmt.Println(err) } // ASSIGN AN IP TO MYVETH02 ip, ipNet, err = net.ParseCIDR("10.0.41.3/16") if err != nil { log.Fatal(err) } if err := veth.SetPeerLinkIp(ip, ipNet); err != nil { fmt.Println(err) } // ADD MYVETH01 INTERFACE TO THE MYBRIDGE BRIDGE AND BRING IT UP // we could also simply do myveth01 := veth.NetInterface() myveth01, err := net.InterfaceByName("myveth01") if err != nil { log.Fatal(err) } if err = br.AddSlaveIfc(myveth01); err != nil { fmt.Println(err) } if err = veth.SetLinkUp(); err != nil { fmt.Println(err) } // ADD MYVETH02 INTERFACE TO THE MYBRIDGE BRIDGE AND BRING IT UP // we could also simply do myveth01 := veth.NetInterface() myveth02, err := net.InterfaceByName("myveth02") if err != nil { log.Fatal(err) } if err = br.AddSlaveIfc(myveth02); err != nil { fmt.Println(err) } if err = veth.SetPeerLinkUp(); err != nil { fmt.Println(err) } // CREATE MACVLAN INTERFACE AND BRING IT UP macvlan, err := tenus.NewMacVlanLinkWithOptions("eth0", tenus.MacVlanOptions{Mode: "bridge", MacVlanDev: "macvlan01"}) if err != nil { log.Fatal(err) } if err := macvlan.SetLinkUp(); err != nil { fmt.Println(err) } // CREATE VLAN INTERFACE AND BRING IT UP vlan, err := tenus.NewVlanLinkWithOptions("eth1", tenus.VlanOptions{Id: 10, VlanDev: "vlan01"}) if err != nil { log.Fatal(err) } if err = vlan.SetLinkUp(); err != nil { fmt.Println(err) } }
func main() { // CREATE BRIDGE AND BRING IT UP br, err := tenus.NewBridgeWithName("vethbridge") if err != nil { log.Fatal(err) } brIp, brIpNet, err := net.ParseCIDR("10.0.41.1/16") if err != nil { log.Fatal(err) } if err := br.SetLinkIp(brIp, brIpNet); err != nil { fmt.Println(err) } if err = br.SetLinkUp(); err != nil { fmt.Println(err) } // CREATE VETH PAIR veth, err := tenus.NewVethPairWithOptions("myveth01", tenus.VethOptions{PeerName: "myveth02"}) if err != nil { log.Fatal(err) } // ASSIGN IP ADDRESS TO THE HOST VETH INTERFACE vethHostIp, vethHostIpNet, err := net.ParseCIDR("10.0.41.2/16") if err != nil { log.Fatal(err) } if err := veth.SetLinkIp(vethHostIp, vethHostIpNet); err != nil { fmt.Println(err) } // ADD MYVETH01 INTERFACE TO THE MYBRIDGE BRIDGE myveth01, err := net.InterfaceByName("myveth01") if err != nil { log.Fatal(err) } if err = br.AddSlaveIfc(myveth01); err != nil { fmt.Println(err) } if err = veth.SetLinkUp(); err != nil { fmt.Println(err) } // PASS VETH PEER INTERFACE TO A RUNNING DOCKER BY PID pid, err := tenus.DockerPidByName("vethdckr", "/var/run/docker.sock") if err != nil { fmt.Println(err) } if err := veth.SetPeerLinkNsPid(pid); err != nil { log.Fatal(err) } // ALLOCATE AND SET IP FOR THE NEW DOCKER INTERFACE vethGuestIp, vethGuestIpNet, err := net.ParseCIDR("10.0.41.5/16") if err != nil { log.Fatal(err) } if err := veth.SetPeerLinkNetInNs(pid, vethGuestIp, vethGuestIpNet, nil); err != nil { log.Fatal(err) } }