func (dev *vxlanDevice) DelRoute(subnet ip.IP4Net) error { route := &netlink.Route{ Scope: netlink.SCOPE_UNIVERSE, Dst: subnet.ToIPNet(), Gw: subnet.IP.ToIP(), } log.Infof("calling RouteDel: %s", subnet) return netlink.RouteDel(route) }
func setupIpMasq(localNet ip.IP4Net, overlayNet ip.IP4Net) error { ipt, err := ip.NewIPTables() if err != nil { return err } err = ipt.ClearChain("nat", "FLANNEL") if err != nil { return fmt.Errorf("Failed to create/clear FLANNEL chain in NAT table: %v", err) } rules := [][]string{ {"FLANNEL", "-s", localNet.String(), "-o", "lo", "-j", "ACCEPT"}, {"FLANNEL", "-s", localNet.String(), "!", "-d", overlayNet.String(), "-j", "MASQUERADE"}, {"POSTROUTING", "-s", localNet.String(), "-j", "FLANNEL"}, } for _, args := range rules { log.Info("Adding iptables rule: ", strings.Join(args, " ")) if err := ipt.AppendUnique("nat", args...); err != nil { return fmt.Errorf("Failed to insert IP masquerade rule: %v", err) } } return nil }
func (sm *SubnetManager) allocateSubnet() (ip.IP4Net, error) { log.Infof("Picking subnet in range %s ... %s", sm.config.SubnetMin, sm.config.SubnetMax) var bag []ip.IP4 sn := ip.IP4Net{IP: sm.config.SubnetMin, PrefixLen: sm.config.SubnetLen} OuterLoop: for ; sn.IP <= sm.config.SubnetMax && len(bag) < 100; sn = sn.Next() { for _, l := range sm.leases { if sn.Overlaps(l.Network) { continue OuterLoop } } bag = append(bag, sn.IP) } if len(bag) == 0 { return ip.IP4Net{}, errors.New("out of subnets") } else { i := randInt(0, len(bag)) return ip.IP4Net{IP: bag[i], PrefixLen: sm.config.SubnetLen}, nil } }
func (dev *vxlanDevice) Configure(ipn ip.IP4Net) error { if err := setAddr4(dev.link, ipn.ToIPNet()); err != nil { return err } if err := netlink.LinkSetUp(dev.link); err != nil { return fmt.Errorf("failed to set interface %s to UP state: %s", dev.link.Attrs().Name, err) } // explicitly add a route since there might be a route for a subnet already // installed by Docker and then it won't get auto added route := netlink.Route{ LinkIndex: dev.link.Attrs().Index, Scope: netlink.SCOPE_UNIVERSE, Dst: ipn.Network().ToIPNet(), } if err := netlink.RouteAdd(&route); err != nil && err != syscall.EEXIST { return fmt.Errorf("failed to add route (%s -> %s): %v", ipn.Network().String(), dev.link.Attrs().Name, err) } return nil }