in cni/network/invoker_cns.go [382:473]
func configureDefaultAddResult(info *IPResultInfo, addConfig *IPAMAddConfig, addResult *IPAMAddResult, overlayMode bool, key string) error {
// set the NC Primary IP in options
// SNATIPKey is not set for ipv6
if net.ParseIP(info.ncPrimaryIP).To4() != nil {
addConfig.options[network.SNATIPKey] = info.ncPrimaryIP
}
ip, ncIPNet, err := net.ParseCIDR(info.podIPAddress + "/" + fmt.Sprint(info.ncSubnetPrefix))
if ip == nil || err != nil {
return errors.Wrap(err, "Unable to parse IP from response: "+info.podIPAddress+" with err %w")
}
ncgw := net.ParseIP(info.ncGatewayIPAddress)
if ncgw == nil {
// TODO: Remove v4overlay and dualstackoverlay options, after 'overlay' rolls out in AKS-RP
if !overlayMode {
return errors.Wrap(errInvalidArgs, "%w: Gateway address "+info.ncGatewayIPAddress+" from response is invalid")
}
if net.ParseIP(info.podIPAddress).To4() != nil { //nolint:gocritic
ncgw, err = getOverlayGateway(ncIPNet)
if err != nil {
return err
}
} else if net.ParseIP(info.podIPAddress).To16() != nil {
ncgw = net.ParseIP(overlayGatewayV6IP)
} else {
return errors.Wrap(err, "No podIPAddress is found: %w")
}
}
// get the name of the primary IP address
_, hostIPNet, err := net.ParseCIDR(info.hostSubnet)
if err != nil {
return errors.Wrap(err, "unable to parse hostSubnet")
}
if ip := net.ParseIP(info.podIPAddress); ip != nil {
defaultRouteDstPrefix := network.Ipv4DefaultRouteDstPrefix
if ip.To4() == nil {
defaultRouteDstPrefix = network.Ipv6DefaultRouteDstPrefix
addResult.ipv6Enabled = true
}
ipConfigs := addResult.interfaceInfo[key].IPConfigs
ipConfigs = append(ipConfigs,
&network.IPConfig{
Address: net.IPNet{
IP: ip,
Mask: ncIPNet.Mask,
},
Gateway: ncgw,
})
routes, getRoutesErr := getRoutes(info.routes, info.skipDefaultRoutes)
if getRoutesErr != nil {
return getRoutesErr
}
resRoute := addResult.interfaceInfo[key].Routes
if len(routes) > 0 {
resRoute = append(resRoute, routes...)
} else { // add default routes if none are provided
resRoute = append(resRoute, network.RouteInfo{
Dst: defaultRouteDstPrefix,
Gw: ncgw,
})
}
// if we have multiple infra ip result infos, we effectively append routes and ip configs to that same interface info each time
// the host subnet prefix (in ipv4 or ipv6) will always refer to the same interface regardless of which ip result info we look at
addResult.interfaceInfo[key] = network.InterfaceInfo{
NICType: cns.InfraNIC,
SkipDefaultRoutes: info.skipDefaultRoutes,
IPConfigs: ipConfigs,
Routes: resRoute,
HostSubnetPrefix: *hostIPNet,
EndpointPolicies: info.endpointPolicies,
}
}
// set subnet prefix for host vm
// setHostOptions will execute if IPAM mode is not v4 overlay and not dualStackOverlay mode
// TODO: Remove v4overlay and dualstackoverlay options, after 'overlay' rolls out in AKS-RP
if !overlayMode {
if err := setHostOptions(ncIPNet, addConfig.options, info); err != nil {
return err
}
}
return nil
}