From fc9cdb1042163c8b992a6fb0e025d47d62e9356e Mon Sep 17 00:00:00 2001 From: ksubrmnn Date: Mon, 4 Feb 2019 13:19:51 -0800 Subject: [PATCH] Enable local host to local pod connectivity in Windows VXLAN --- backend/vxlan/device_windows.go | 26 +++++++++++++++++++++++++- backend/vxlan/vxlan_windows.go | 5 +++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/backend/vxlan/device_windows.go b/backend/vxlan/device_windows.go index b77cb810b4..fc8d1a9744 100644 --- a/backend/vxlan/device_windows.go +++ b/backend/vxlan/device_windows.go @@ -18,6 +18,7 @@ import ( "encoding/json" "fmt" "github.com/Microsoft/hcsshim" + "github.com/Microsoft/hcsshim/hcn" "github.com/buger/jsonparser" "github.com/coreos/flannel/pkg/ip" log "github.com/golang/glog" @@ -129,7 +130,30 @@ func ensureNetwork(expectedNetwork *hcsshim.HNSNetwork, expectedVSID int64, expe } log.Infof("Created HNSNetwork %s", networkName) - return newNetwork, nil + existingNetwork = newNetwork + } + + existingNetworkV2, err := hcn.GetNetworkByID(existingNetwork.Id) + if err != nil { + return nil, errors.Annotatef(err, "Could not find vxlan0 in V2") + } + + addHostRoute := true + for _, policy := range existingNetworkV2.Policies { + if policy.Type == hcn.HostRoute { + addHostRoute = false + } + } + if addHostRoute { + hostRoutePolicy := hcn.NetworkPolicy{ + Type: hcn.HostRoute, + Settings: []byte("{}"), + } + + networkRequest := hcn.PolicyNetworkRequest{ + Policies: []hcn.NetworkPolicy{hostRoutePolicy}, + } + existingNetworkV2.AddPolicy(networkRequest) } return existingNetwork, nil diff --git a/backend/vxlan/vxlan_windows.go b/backend/vxlan/vxlan_windows.go index ca02d6e63d..9928b7c1aa 100644 --- a/backend/vxlan/vxlan_windows.go +++ b/backend/vxlan/vxlan_windows.go @@ -127,6 +127,11 @@ func (be *VXLANBackend) RegisterNetwork(ctx context.Context, wg sync.WaitGroup, return nil, fmt.Errorf("Cannot get HNS networks [%+v]", err) } + err = hcn.RemoteSubnetSupported() + if err != nil { + return nil, err + } + var remoteDrMac string var providerAddress string for _, hnsNetwork := range hnsNetworks {