import (
"fmt"
+ "net"
"os"
+ "os/exec"
"github.com/containernetworking/cni/pkg/invoke"
"github.com/containernetworking/cni/pkg/ip"
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