From: Michael Cambria Date: Tue, 14 Feb 2017 21:03:57 +0000 (-0500) Subject: Merge branch 'master' of https://github.com/containernetworking/cni into tcrules X-Git-Url: https://git.halfball.org/?a=commitdiff_plain;h=e7c1812e2451f92400f2aa3f03cab30bcc5e5085;p=cni.git Merge branch 'master' of https://github.com/containernetworking/cni into tcrules Conflicts: pkg/ipam/ipam.go --- e7c1812e2451f92400f2aa3f03cab30bcc5e5085 diff --cc pkg/ipam/ipam.go index 8d3fe05,b76780f..46477b9 --- a/pkg/ipam/ipam.go +++ b/pkg/ipam/ipam.go @@@ -16,8 -16,8 +16,9 @@@ package ipa import ( "fmt" + "net" "os" + "os/exec" "github.com/containernetworking/cni/pkg/invoke" "github.com/containernetworking/cni/pkg/ip" @@@ -46,67 -51,35 +52,86 @@@ func ConfigureIface(ifName string, res return fmt.Errorf("failed to set %q UP: %v", ifName, err) } - // TODO(eyakubovich): IPv6 - addr := &netlink.Addr{IPNet: &res.IP4.IP, Label: ""} - if err = netlink.AddrAdd(link, addr); err != nil { - return fmt.Errorf("failed to add IP addr to %q: %v", ifName, err) + var v4gw, v6gw net.IP + for _, ipc := range res.IPs { + if int(ipc.Interface) >= len(res.Interfaces) || res.Interfaces[ipc.Interface].Name != ifName { + // IP address is for a different interface + return fmt.Errorf("failed to add IP addr %v to %q: invalid interface index", ipc, ifName) + } + + addr := &netlink.Addr{IPNet: &ipc.Address, Label: ""} + if err = netlink.AddrAdd(link, addr); err != nil { + return fmt.Errorf("failed to add IP addr %v to %q: %v", ipc, ifName, err) + } + + gwIsV4 := ipc.Gateway.To4() != nil + if gwIsV4 && v4gw == nil { + v4gw = ipc.Gateway + } else if !gwIsV4 && v6gw == nil { + v6gw = ipc.Gateway + } } +/* + * Begin + */ + var ( + cmdOut []byte + result string + ) + + cmdName := "tc" + cmdArgs := []string{"qdisc", "add", "dev", ifName, "ingress"} + if cmdOut, err = exec.Command(cmdName, cmdArgs...).Output(); err != nil { + return fmt.Errorf("There was an error adding qdisc to %q: %v", ifName, err) + } + + // cmdName = "tc" + cmdArgs = []string{"-s", "qdisc", "show", "dev", ifName} + if cmdOut, err = exec.Command(cmdName, cmdArgs...).Output(); err != nil { + return fmt.Errorf("There was an error showing qdisc on %q: %v", ifName, err) + } + result = string(cmdOut) + fmt.Println("The result of qdisc show is: ",result) + + // cmdName = "tc" + cmdArgs = []string{"filter", "add", "dev", ifName, "parent", "ffff:", "protocol", "ip", "prio", "2", "u32", "match", "ip", "src", "10.37.2.1/32", "flowid", ":10", "action", "pass" } + if cmdOut, err = exec.Command(cmdName, cmdArgs...).Output(); err != nil { + return fmt.Errorf("There was an error adding tc filter to %q: %v", ifName, err) + } + + // cmdName = "tc" + cmdArgs = []string{"filter", "add", "dev", ifName, "parent", "ffff:", "protocol", "ip", "prio", "2", "u32", "match", "ip", "src", "10.37.3.1/32", "flowid", ":10", "action", "drop" } + if cmdOut, err = exec.Command(cmdName, cmdArgs...).Output(); err != nil { + return fmt.Errorf("There was an error adding tc filter to %q: %v", ifName, err) + } + + // cmdName = "tc" + cmdArgs = []string{"-s", "filter", "show", "dev", ifName, "parent", "ffff:"} + if cmdOut, err = exec.Command(cmdName, cmdArgs...).Output(); err != nil { + return fmt.Errorf("There was an error showing tc filter on %q: %v", ifName, err) + } + result = string(cmdOut) + fmt.Println("The result of show filter is: ", result) + + /* + * Example of getting an environment variable supplied to plugin + */ + mccval := os.Getenv("MCCVAL") + fmt.Println("mccval is: ", mccval) +/* + * End + */ + - for _, r := range res.IP4.Routes { + for _, r := range res.Routes { + routeIsV4 := r.Dst.IP.To4() != nil gw := r.GW if gw == nil { - gw = res.IP4.Gateway + if routeIsV4 && v4gw != nil { + gw = v4gw + } else if !routeIsV4 && v6gw != nil { + gw = v6gw + } } if err = ip.AddRoute(&r.Dst, gw, link); err != nil { // we skip over duplicate routes as we assume the first one wins