cni/network/network_linux.go (106 lines of code) (raw):
package network
import (
"net"
"strconv"
"github.com/Azure/azure-container-networking/cni"
"github.com/Azure/azure-container-networking/cns"
"github.com/Azure/azure-container-networking/network"
"github.com/Azure/azure-container-networking/network/policy"
cniTypesCurr "github.com/containernetworking/cni/pkg/types/100"
"go.uber.org/zap"
)
const (
snatInterface = "eth1"
infraInterface = "eth2"
)
const snatConfigFileName = "/tmp/snatConfig"
func addDefaultRoute(gwIPString string, epInfo *network.EndpointInfo, result *network.InterfaceInfo) {
_, defaultIPNet, _ := net.ParseCIDR("0.0.0.0/0")
dstIP := net.IPNet{IP: net.ParseIP("0.0.0.0"), Mask: defaultIPNet.Mask}
gwIP := net.ParseIP(gwIPString)
epInfo.Routes = append(epInfo.Routes, network.RouteInfo{Dst: dstIP, Gw: gwIP, DevName: snatInterface})
result.Routes = append(result.Routes, network.RouteInfo{Dst: dstIP, Gw: gwIP})
}
func addSnatForDNS(gwIPString string, epInfo *network.EndpointInfo, result *network.InterfaceInfo) {
_, dnsIPNet, _ := net.ParseCIDR("168.63.129.16/32")
gwIP := net.ParseIP(gwIPString)
epInfo.Routes = append(epInfo.Routes, network.RouteInfo{Dst: *dnsIPNet, Gw: gwIP, DevName: snatInterface})
result.Routes = append(result.Routes, network.RouteInfo{Dst: *dnsIPNet, Gw: gwIP})
}
// updates options field
func setNetworkOptions(cnsNwConfig *cns.GetNetworkContainerResponse, nwInfo *network.EndpointInfo) {
if cnsNwConfig != nil && cnsNwConfig.MultiTenancyInfo.ID != 0 {
logger.Info("Setting Network Options")
optionsMap := make(map[string]interface{})
optionsMap[network.VlanIDKey] = strconv.Itoa(cnsNwConfig.MultiTenancyInfo.ID)
optionsMap[network.SnatBridgeIPKey] = cnsNwConfig.LocalIPConfiguration.GatewayIPAddress + "/" + strconv.Itoa(int(cnsNwConfig.LocalIPConfiguration.IPSubnet.PrefixLength))
logger.Info("Add vlanIDkey and SnatBridgeIPKey to optionsMap", zap.String("vlanIDKey", network.VlanIDKey), zap.String("SnatBridgeIPKey", network.SnatBridgeIPKey))
nwInfo.Options[dockerNetworkOption] = optionsMap
}
}
// update epInfo data field, allow host to nc, allow nc to host, and network container id
func setEndpointOptions(cnsNwConfig *cns.GetNetworkContainerResponse, epInfo *network.EndpointInfo, vethName string) {
if cnsNwConfig != nil && cnsNwConfig.MultiTenancyInfo.ID != 0 {
logger.Info("Setting Endpoint Options")
epInfo.Data[network.VlanIDKey] = cnsNwConfig.MultiTenancyInfo.ID
epInfo.Data[network.LocalIPKey] = cnsNwConfig.LocalIPConfiguration.IPSubnet.IPAddress + "/" + strconv.Itoa(int(cnsNwConfig.LocalIPConfiguration.IPSubnet.PrefixLength))
epInfo.Data[network.SnatBridgeIPKey] = cnsNwConfig.LocalIPConfiguration.GatewayIPAddress + "/" + strconv.Itoa(int(cnsNwConfig.LocalIPConfiguration.IPSubnet.PrefixLength))
epInfo.AllowInboundFromHostToNC = cnsNwConfig.AllowHostToNCCommunication
epInfo.AllowInboundFromNCToHost = cnsNwConfig.AllowNCToHostCommunication
epInfo.NetworkContainerID = cnsNwConfig.NetworkContainerID
}
epInfo.Data[network.OptVethName] = vethName
}
func addSnatInterface(nwCfg *cni.NetworkConfig, result *cniTypesCurr.Result) {
if nwCfg != nil && nwCfg.MultiTenancy {
snatIface := &cniTypesCurr.Interface{
Name: snatInterface,
}
result.Interfaces = append(result.Interfaces, snatIface)
}
}
func setupInfraVnetRoutingForMultitenancy(
nwCfg *cni.NetworkConfig,
azIpamResult *cniTypesCurr.Result,
epInfo *network.EndpointInfo,
) {
if epInfo.EnableInfraVnet {
_, ipNet, _ := net.ParseCIDR(nwCfg.InfraVnetAddressSpace)
epInfo.Routes = append(epInfo.Routes, network.RouteInfo{Dst: *ipNet, Gw: azIpamResult.IPs[0].Gateway, DevName: infraInterface})
}
}
func getNetworkDNSSettings(nwCfg *cni.NetworkConfig, dns network.DNSInfo) (network.DNSInfo, error) {
var nwDNS network.DNSInfo
if len(nwCfg.DNS.Nameservers) > 0 {
nwDNS = network.DNSInfo{
Servers: nwCfg.DNS.Nameservers,
Suffix: nwCfg.DNS.Domain,
}
} else {
nwDNS = dns
}
return nwDNS, nil
}
func getEndpointDNSSettings(nwCfg *cni.NetworkConfig, dns network.DNSInfo, _ string) (network.DNSInfo, error) {
return getNetworkDNSSettings(nwCfg, dns)
}
func getEndpointPolicies(PolicyArgs) ([]policy.Policy, error) {
return nil, nil
}
// getPoliciesFromRuntimeCfg returns network policies from network config.
// getPoliciesFromRuntimeCfg is a dummy function for Linux platform.
func getPoliciesFromRuntimeCfg(_ *cni.NetworkConfig, _ bool) ([]policy.Policy, error) {
return nil, nil
}
func addIPV6EndpointPolicy(nwInfo network.NetworkInfo) (policy.Policy, error) {
return policy.Policy{}, nil
}
func (plugin *NetPlugin) getNetworkName(_ string, _ *network.InterfaceInfo, nwCfg *cni.NetworkConfig) (string, error) {
return nwCfg.Name, nil
}
func getNATInfo(_ *cni.NetworkConfig, _ interface{}, _ bool) (natInfo []policy.NATInfo) {
return natInfo
}
func platformInit(cniConfig *cni.NetworkConfig) {}
// isDualNicFeatureSupported returns if the dual nic feature is supported. Currently it's only supported for windows hnsv2 path
func (plugin *NetPlugin) isDualNicFeatureSupported(netNs string) bool {
return false
}
func getOverlayGateway(_ *net.IPNet) (net.IP, error) {
return net.ParseIP("169.254.1.1"), nil
}