func configureDefaultAddResult()

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
}