1 //go:build windows 2 3 package hcn 4 5 import ( 6 "encoding/json" 7 "fmt" 8 "syscall" 9 10 "github.com/Microsoft/go-winio/pkg/guid" 11 ) 12 13 //go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go hcn.go 14 15 /// HNS V1 API 16 17 //sys SetCurrentThreadCompartmentId(compartmentId uint32) (hr error) = iphlpapi.SetCurrentThreadCompartmentId 18 //sys _hnsCall(method string, path string, object string, response **uint16) (hr error) = vmcompute.HNSCall? 19 20 /// HCN V2 API 21 22 // Network 23 //sys hcnEnumerateNetworks(query string, networks **uint16, result **uint16) (hr error) = computenetwork.HcnEnumerateNetworks? 24 //sys hcnCreateNetwork(id *_guid, settings string, network *hcnNetwork, result **uint16) (hr error) = computenetwork.HcnCreateNetwork? 25 //sys hcnOpenNetwork(id *_guid, network *hcnNetwork, result **uint16) (hr error) = computenetwork.HcnOpenNetwork? 26 //sys hcnModifyNetwork(network hcnNetwork, settings string, result **uint16) (hr error) = computenetwork.HcnModifyNetwork? 27 //sys hcnQueryNetworkProperties(network hcnNetwork, query string, properties **uint16, result **uint16) (hr error) = computenetwork.HcnQueryNetworkProperties? 28 //sys hcnDeleteNetwork(id *_guid, result **uint16) (hr error) = computenetwork.HcnDeleteNetwork? 29 //sys hcnCloseNetwork(network hcnNetwork) (hr error) = computenetwork.HcnCloseNetwork? 30 31 // Endpoint 32 //sys hcnEnumerateEndpoints(query string, endpoints **uint16, result **uint16) (hr error) = computenetwork.HcnEnumerateEndpoints? 33 //sys hcnCreateEndpoint(network hcnNetwork, id *_guid, settings string, endpoint *hcnEndpoint, result **uint16) (hr error) = computenetwork.HcnCreateEndpoint? 34 //sys hcnOpenEndpoint(id *_guid, endpoint *hcnEndpoint, result **uint16) (hr error) = computenetwork.HcnOpenEndpoint? 35 //sys hcnModifyEndpoint(endpoint hcnEndpoint, settings string, result **uint16) (hr error) = computenetwork.HcnModifyEndpoint? 36 //sys hcnQueryEndpointProperties(endpoint hcnEndpoint, query string, properties **uint16, result **uint16) (hr error) = computenetwork.HcnQueryEndpointProperties? 37 //sys hcnDeleteEndpoint(id *_guid, result **uint16) (hr error) = computenetwork.HcnDeleteEndpoint? 38 //sys hcnCloseEndpoint(endpoint hcnEndpoint) (hr error) = computenetwork.HcnCloseEndpoint? 39 40 // Namespace 41 //sys hcnEnumerateNamespaces(query string, namespaces **uint16, result **uint16) (hr error) = computenetwork.HcnEnumerateNamespaces? 42 //sys hcnCreateNamespace(id *_guid, settings string, namespace *hcnNamespace, result **uint16) (hr error) = computenetwork.HcnCreateNamespace? 43 //sys hcnOpenNamespace(id *_guid, namespace *hcnNamespace, result **uint16) (hr error) = computenetwork.HcnOpenNamespace? 44 //sys hcnModifyNamespace(namespace hcnNamespace, settings string, result **uint16) (hr error) = computenetwork.HcnModifyNamespace? 45 //sys hcnQueryNamespaceProperties(namespace hcnNamespace, query string, properties **uint16, result **uint16) (hr error) = computenetwork.HcnQueryNamespaceProperties? 46 //sys hcnDeleteNamespace(id *_guid, result **uint16) (hr error) = computenetwork.HcnDeleteNamespace? 47 //sys hcnCloseNamespace(namespace hcnNamespace) (hr error) = computenetwork.HcnCloseNamespace? 48 49 // LoadBalancer 50 //sys hcnEnumerateLoadBalancers(query string, loadBalancers **uint16, result **uint16) (hr error) = computenetwork.HcnEnumerateLoadBalancers? 51 //sys hcnCreateLoadBalancer(id *_guid, settings string, loadBalancer *hcnLoadBalancer, result **uint16) (hr error) = computenetwork.HcnCreateLoadBalancer? 52 //sys hcnOpenLoadBalancer(id *_guid, loadBalancer *hcnLoadBalancer, result **uint16) (hr error) = computenetwork.HcnOpenLoadBalancer? 53 //sys hcnModifyLoadBalancer(loadBalancer hcnLoadBalancer, settings string, result **uint16) (hr error) = computenetwork.HcnModifyLoadBalancer? 54 //sys hcnQueryLoadBalancerProperties(loadBalancer hcnLoadBalancer, query string, properties **uint16, result **uint16) (hr error) = computenetwork.HcnQueryLoadBalancerProperties? 55 //sys hcnDeleteLoadBalancer(id *_guid, result **uint16) (hr error) = computenetwork.HcnDeleteLoadBalancer? 56 //sys hcnCloseLoadBalancer(loadBalancer hcnLoadBalancer) (hr error) = computenetwork.HcnCloseLoadBalancer? 57 58 // SDN Routes 59 //sys hcnEnumerateRoutes(query string, routes **uint16, result **uint16) (hr error) = computenetwork.HcnEnumerateSdnRoutes? 60 //sys hcnCreateRoute(id *_guid, settings string, route *hcnRoute, result **uint16) (hr error) = computenetwork.HcnCreateSdnRoute? 61 //sys hcnOpenRoute(id *_guid, route *hcnRoute, result **uint16) (hr error) = computenetwork.HcnOpenSdnRoute? 62 //sys hcnModifyRoute(route hcnRoute, settings string, result **uint16) (hr error) = computenetwork.HcnModifySdnRoute? 63 //sys hcnQueryRouteProperties(route hcnRoute, query string, properties **uint16, result **uint16) (hr error) = computenetwork.HcnQuerySdnRouteProperties? 64 //sys hcnDeleteRoute(id *_guid, result **uint16) (hr error) = computenetwork.HcnDeleteSdnRoute? 65 //sys hcnCloseRoute(route hcnRoute) (hr error) = computenetwork.HcnCloseSdnRoute? 66 67 type _guid = guid.GUID 68 69 type hcnNetwork syscall.Handle 70 type hcnEndpoint syscall.Handle 71 type hcnNamespace syscall.Handle 72 type hcnLoadBalancer syscall.Handle 73 type hcnRoute syscall.Handle 74 75 // SchemaVersion for HCN Objects/Queries. 76 type SchemaVersion = Version // hcnglobals.go 77 78 // HostComputeQueryFlags are passed in to a HostComputeQuery to determine which 79 // properties of an object are returned. 80 type HostComputeQueryFlags uint32 81 82 var ( 83 // HostComputeQueryFlagsNone returns an object with the standard properties. 84 HostComputeQueryFlagsNone HostComputeQueryFlags 85 // HostComputeQueryFlagsDetailed returns an object with all properties. 86 HostComputeQueryFlagsDetailed HostComputeQueryFlags = 1 87 ) 88 89 // HostComputeQuery is the format for HCN queries. 90 type HostComputeQuery struct { 91 SchemaVersion SchemaVersion `json:""` 92 Flags HostComputeQueryFlags `json:",omitempty"` 93 Filter string `json:",omitempty"` 94 } 95 96 type ExtraParams struct { 97 Resources json.RawMessage `json:",omitempty"` 98 SharedContainers json.RawMessage `json:",omitempty"` 99 LayeredOn string `json:",omitempty"` 100 SwitchGuid string `json:",omitempty"` 101 UtilityVM string `json:",omitempty"` 102 VirtualMachine string `json:",omitempty"` 103 } 104 105 type Health struct { 106 Data interface{} `json:",omitempty"` 107 Extra ExtraParams `json:",omitempty"` 108 } 109 110 // defaultQuery generates HCN Query. 111 // Passed into get/enumerate calls to filter results. 112 func defaultQuery() HostComputeQuery { 113 query := HostComputeQuery{ 114 SchemaVersion: SchemaVersion{ 115 Major: 2, 116 Minor: 0, 117 }, 118 Flags: HostComputeQueryFlagsNone, 119 } 120 return query 121 } 122 123 // PlatformDoesNotSupportError happens when users are attempting to use a newer shim on an older OS 124 func platformDoesNotSupportError(featureName string) error { 125 return fmt.Errorf("platform does not support feature %s", featureName) 126 } 127 128 // V2ApiSupported returns an error if the HCN version does not support the V2 Apis. 129 func V2ApiSupported() error { 130 supported, err := GetCachedSupportedFeatures() 131 if err != nil { 132 return err 133 } 134 if supported.Api.V2 { 135 return nil 136 } 137 return platformDoesNotSupportError("V2 Api/Schema") 138 } 139 140 func V2SchemaVersion() SchemaVersion { 141 return SchemaVersion{ 142 Major: 2, 143 Minor: 0, 144 } 145 } 146 147 // RemoteSubnetSupported returns an error if the HCN version does not support Remote Subnet policies. 148 func RemoteSubnetSupported() error { 149 supported, err := GetCachedSupportedFeatures() 150 if err != nil { 151 return err 152 } 153 if supported.RemoteSubnet { 154 return nil 155 } 156 return platformDoesNotSupportError("Remote Subnet") 157 } 158 159 // HostRouteSupported returns an error if the HCN version does not support Host Route policies. 160 func HostRouteSupported() error { 161 supported, err := GetCachedSupportedFeatures() 162 if err != nil { 163 return err 164 } 165 if supported.HostRoute { 166 return nil 167 } 168 return platformDoesNotSupportError("Host Route") 169 } 170 171 // DSRSupported returns an error if the HCN version does not support Direct Server Return. 172 func DSRSupported() error { 173 supported, err := GetCachedSupportedFeatures() 174 if err != nil { 175 return err 176 } 177 if supported.DSR { 178 return nil 179 } 180 return platformDoesNotSupportError("Direct Server Return (DSR)") 181 } 182 183 // Slash32EndpointPrefixesSupported returns an error if the HCN version does not support configuring endpoints with /32 prefixes. 184 func Slash32EndpointPrefixesSupported() error { 185 supported, err := GetCachedSupportedFeatures() 186 if err != nil { 187 return err 188 } 189 if supported.Slash32EndpointPrefixes { 190 return nil 191 } 192 return platformDoesNotSupportError("Slash 32 Endpoint prefixes") 193 } 194 195 // AclSupportForProtocol252Supported returns an error if the HCN version does not support HNS ACL Policies to support protocol 252 for VXLAN. 196 func AclSupportForProtocol252Supported() error { 197 supported, err := GetCachedSupportedFeatures() 198 if err != nil { 199 return err 200 } 201 if supported.AclSupportForProtocol252 { 202 return nil 203 } 204 return platformDoesNotSupportError("HNS ACL Policies to support protocol 252 for VXLAN") 205 } 206 207 // SessionAffinitySupported returns an error if the HCN version does not support Session Affinity. 208 func SessionAffinitySupported() error { 209 supported, err := GetCachedSupportedFeatures() 210 if err != nil { 211 return err 212 } 213 if supported.SessionAffinity { 214 return nil 215 } 216 return platformDoesNotSupportError("Session Affinity") 217 } 218 219 // IPv6DualStackSupported returns an error if the HCN version does not support IPv6DualStack. 220 func IPv6DualStackSupported() error { 221 supported, err := GetCachedSupportedFeatures() 222 if err != nil { 223 return err 224 } 225 if supported.IPv6DualStack { 226 return nil 227 } 228 return platformDoesNotSupportError("IPv6 DualStack") 229 } 230 231 // L4proxySupported returns an error if the HCN version does not support L4Proxy 232 func L4proxyPolicySupported() error { 233 supported, err := GetCachedSupportedFeatures() 234 if err != nil { 235 return err 236 } 237 if supported.L4Proxy { 238 return nil 239 } 240 return platformDoesNotSupportError("L4ProxyPolicy") 241 } 242 243 // L4WfpProxySupported returns an error if the HCN version does not support L4WfpProxy 244 func L4WfpProxyPolicySupported() error { 245 supported, err := GetCachedSupportedFeatures() 246 if err != nil { 247 return err 248 } 249 if supported.L4WfpProxy { 250 return nil 251 } 252 return platformDoesNotSupportError("L4WfpProxyPolicy") 253 } 254 255 // SetPolicySupported returns an error if the HCN version does not support SetPolicy. 256 func SetPolicySupported() error { 257 supported, err := GetCachedSupportedFeatures() 258 if err != nil { 259 return err 260 } 261 if supported.SetPolicy { 262 return nil 263 } 264 return platformDoesNotSupportError("SetPolicy") 265 } 266 267 // VxlanPortSupported returns an error if the HCN version does not support configuring the VXLAN TCP port. 268 func VxlanPortSupported() error { 269 supported, err := GetCachedSupportedFeatures() 270 if err != nil { 271 return err 272 } 273 if supported.VxlanPort { 274 return nil 275 } 276 return platformDoesNotSupportError("VXLAN port configuration") 277 } 278 279 // TierAclPolicySupported returns an error if the HCN version does not support configuring the TierAcl. 280 func TierAclPolicySupported() error { 281 supported, err := GetCachedSupportedFeatures() 282 if err != nil { 283 return err 284 } 285 if supported.TierAcl { 286 return nil 287 } 288 return platformDoesNotSupportError("TierAcl") 289 } 290 291 // NetworkACLPolicySupported returns an error if the HCN version does not support NetworkACLPolicy 292 func NetworkACLPolicySupported() error { 293 supported, err := GetCachedSupportedFeatures() 294 if err != nil { 295 return err 296 } 297 if supported.NetworkACL { 298 return nil 299 } 300 return platformDoesNotSupportError("NetworkACL") 301 } 302 303 // NestedIpSetSupported returns an error if the HCN version does not support NestedIpSet 304 func NestedIpSetSupported() error { 305 supported, err := GetCachedSupportedFeatures() 306 if err != nil { 307 return err 308 } 309 if supported.NestedIpSet { 310 return nil 311 } 312 return platformDoesNotSupportError("NestedIpSet") 313 } 314 315 // RequestType are the different operations performed to settings. 316 // Used to update the settings of Endpoint/Namespace objects. 317 type RequestType string 318 319 var ( 320 // RequestTypeAdd adds the provided settings object. 321 RequestTypeAdd RequestType = "Add" 322 // RequestTypeRemove removes the provided settings object. 323 RequestTypeRemove RequestType = "Remove" 324 // RequestTypeUpdate replaces settings with the ones provided. 325 RequestTypeUpdate RequestType = "Update" 326 // RequestTypeRefresh refreshes the settings provided. 327 RequestTypeRefresh RequestType = "Refresh" 328 ) 329