@@ -7,8 +7,10 @@ import (
7
7
"encoding/json"
8
8
"fmt"
9
9
"net"
10
+ "strconv"
10
11
"strings"
11
12
13
+ "github.com/Microsoft/hcsshim/hcn"
12
14
network "github.com/Microsoft/windows-container-networking/network"
13
15
cniSkel "github.com/containernetworking/cni/pkg/skel"
14
16
cniTypes "github.com/containernetworking/cni/pkg/types"
@@ -68,6 +70,7 @@ type NetworkConfig struct {
68
70
Type string `json:"type"` // As per SPEC, Type is Name of the Binary
69
71
Ipam IpamConfig `json:"ipam"`
70
72
DNS cniTypes.DNS `json:"dns"`
73
+ OptionalFlags OptionalFlags `json:"optionalFlags"`
71
74
RuntimeConfig RuntimeConfig `json:"runtimeConfig"`
72
75
AdditionalArgs []KVP
73
76
}
@@ -100,6 +103,11 @@ type K8SPodEnvArgs struct {
100
103
K8S_POD_INFRA_CONTAINER_ID cniTypes.UnmarshallableString `json:"K8S_POD_INFRA_CONTAINER_ID,omitempty"`
101
104
}
102
105
106
+ type OptionalFlags struct {
107
+ LocalRoutePortMapping bool `json:"localRoutedPortMapping"`
108
+ AllowAclPortMapping bool `json:"allowAclPortMapping"`
109
+ }
110
+
103
111
func (r * Result ) Print () {
104
112
fmt .Printf (r .String ())
105
113
}
@@ -243,6 +251,41 @@ func (config *NetworkConfig) GetNetworkInfo(podNamespace string) *network.Networ
243
251
return ninfo
244
252
}
245
253
254
+ // getInACLRule generates an In ACLs for mapped ports
255
+ func getInACLRule (mapping * PortMapping , aclPriority uint16 ) (* network.Policy , error ) {
256
+
257
+ var err error
258
+
259
+ in := hcn.AclPolicySetting {
260
+ Protocols : mapping .Protocol ,
261
+ Action : hcn .ActionTypeAllow ,
262
+ Direction : hcn .DirectionTypeIn ,
263
+ LocalPorts : strconv .Itoa (mapping .ContainerPort ),
264
+ Priority : aclPriority ,
265
+ }
266
+
267
+ rawJSON , err := json .Marshal (in )
268
+ if err != nil {
269
+ return nil , fmt .Errorf ("failed marshalling acl: %v" , err )
270
+ }
271
+
272
+ inPol := hcn.EndpointPolicy {
273
+ Type : hcn .ACL ,
274
+ Settings : rawJSON ,
275
+ }
276
+
277
+ rawData , err := json .Marshal (inPol )
278
+ inPolicy := network.Policy {
279
+ Type : network .EndpointPolicy ,
280
+ Data : rawData }
281
+
282
+ if err != nil {
283
+ return nil , fmt .Errorf ("failed marshalling acl: %v" , err )
284
+ }
285
+
286
+ return & inPolicy , nil
287
+ }
288
+
246
289
// GetEndpointInfo constructs endpoint info using endpoint id, containerid and netns
247
290
func (config * NetworkConfig ) GetEndpointInfo (
248
291
networkInfo * network.NetworkInfo ,
@@ -269,13 +312,27 @@ func (config *NetworkConfig) GetEndpointInfo(
269
312
270
313
runtimeConf := config .RuntimeConfig
271
314
logrus .Debugf ("Parsing port mappings from %+v" , runtimeConf .PortMappings )
315
+
316
+ flags := uint32 (0 )
317
+ if config .OptionalFlags .LocalRoutePortMapping {
318
+ flags = 1
319
+ }
320
+ var aclPriority uint16 = 1000
272
321
for _ , mapping := range runtimeConf .PortMappings {
273
- policy , err := network .GetPortMappingPolicy (mapping .HostPort , mapping .ContainerPort , mapping .Protocol )
322
+ policy , err := network .GetPortMappingPolicy (mapping .HostPort , mapping .ContainerPort , mapping .Protocol , flags )
274
323
if err != nil {
275
324
return nil , fmt .Errorf ("failed during GetEndpointInfo from netconf: %v" , err )
276
325
}
277
326
logrus .Debugf ("Created raw policy from mapping: %+v --- %+v" , mapping , policy )
278
327
epInfo .Policies = append (epInfo .Policies , policy )
328
+
329
+ if config .OptionalFlags .AllowAclPortMapping {
330
+ pol , err := getInACLRule (& mapping , aclPriority )
331
+ if err != nil {
332
+ return nil , fmt .Errorf ("failed getInACLRule: %v" , err )
333
+ }
334
+ epInfo .Policies = append (epInfo .Policies , * pol )
335
+ }
279
336
}
280
337
281
338
return epInfo , nil
0 commit comments