func (rb *HostgwBackend) Init(extIface *net.Interface, extIP net.IP, httpPort string, ipMasq bool) (*backend.SubnetDef, error) { rb.extIface = extIface rb.extIP = extIP attrs := subnet.LeaseAttrs{ PublicIP: ip.FromIP(extIP), BackendType: "host-gw", HTTPPort: httpPort, } sn, err := rb.sm.AcquireLease(&attrs, rb.stop) if err != nil { if err == task.ErrCanceled { return nil, err } else { return nil, fmt.Errorf("Failed to acquire lease: %v", err) } } if ipMasq { if err := setupIpMasq(sn, rb.sm.GetConfig().Network); err != nil { return nil, fmt.Errorf("Failed to configure ip-masq: %v", err) } } /* NB: docker will create the local route to `sn` */ return &backend.SubnetDef{ Net: sn, MTU: extIface.MTU, }, nil }
/// Implementation func parseSubnetKey(s string) (ip.IP4Net, error) { if parts := subnetRegex.FindStringSubmatch(s); len(parts) == 3 { snIp := net.ParseIP(parts[1]).To4() prefixLen, err := strconv.ParseUint(parts[2], 10, 5) if snIp != nil && err == nil { return ip.IP4Net{IP: ip.FromIP(snIp), PrefixLen: uint(prefixLen)}, nil } } return ip.IP4Net{}, errors.New("Error parsing IP Subnet") }
func (m *UdpBackend) Init(extIface *net.Interface, extIP net.IP, httpPort string, ipMasq bool) (*backend.SubnetDef, error) { // Parse our configuration if len(m.rawCfg) > 0 { if err := json.Unmarshal(m.rawCfg, &m.cfg); err != nil { return nil, fmt.Errorf("error decoding UDP backend config: %v", err) } } // Acquire the lease form subnet manager attrs := subnet.LeaseAttrs{ PublicIP: ip.FromIP(extIP), HTTPPort: httpPort, } sn, err := m.sm.AcquireLease(&attrs, m.stop) if err != nil { if err == task.ErrCanceled { return nil, err } else { return nil, fmt.Errorf("failed to acquire lease: %v", err) } } // Tunnel's subnet is that of the whole overlay network (e.g. /16) // and not that of the individual host (e.g. /24) m.tunNet = ip.IP4Net{ IP: sn.IP, PrefixLen: m.sm.GetConfig().Network.PrefixLen, } // TUN MTU will be smaller b/c of encap (IP+UDP hdrs) m.mtu = extIface.MTU - encapOverhead if err = m.initTun(ipMasq); err != nil { return nil, err } m.conn, err = net.ListenUDP("udp4", &net.UDPAddr{Port: m.cfg.Port}) if err != nil { return nil, fmt.Errorf("failed to start listening on UDP socket: %v", err) } m.ctl, m.ctl2, err = newCtlSockets() if err != nil { return nil, fmt.Errorf("failed to create control socket: %v", err) } return &backend.SubnetDef{ Net: sn, MTU: m.mtu, }, nil }
func (m *AllocBackend) Init(extIface *net.Interface, extIP net.IP, httpPort string, ipMasq bool) (*backend.SubnetDef, error) { attrs := subnet.LeaseAttrs{ PublicIP: ip.FromIP(extIP), HTTPPort: httpPort, } sn, err := m.sm.AcquireLease(&attrs, m.stop) if err != nil { if err == task.ErrCanceled { return nil, err } else { return nil, fmt.Errorf("failed to acquire lease: %v", err) } } return &backend.SubnetDef{ Net: sn, MTU: extIface.MTU, }, nil }