Merge branch 'master' of https://github.com/containernetworking/cni into tcrules
authorMichael Cambria <michael.cambria@verizon.com>
Tue, 14 Feb 2017 21:03:57 +0000 (16:03 -0500)
committerMichael Cambria <michael.cambria@verizon.com>
Tue, 14 Feb 2017 21:03:57 +0000 (16:03 -0500)
Conflicts:
pkg/ipam/ipam.go

1  2 
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
+               }
        }
  
-       for _, r := range res.IP4.Routes {
 +/*
 + * 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.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