@@ -82,6 +82,9 @@ func collectCreateContainerResult(request *CreateContainerRequest) *result {
8282 if request .Container .Linux .Namespaces == nil {
8383 request .Container .Linux .Namespaces = []* LinuxNamespace {}
8484 }
85+ if request .Container .Linux .NetDevices == nil {
86+ request .Container .Linux .NetDevices = map [string ]* LinuxNetDevice {}
87+ }
8588
8689 return & result {
8790 request : resultRequest {
@@ -104,6 +107,7 @@ func collectCreateContainerResult(request *CreateContainerRequest) *result {
104107 Unified : map [string ]string {},
105108 },
106109 Namespaces : []* LinuxNamespace {},
110+ NetDevices : map [string ]* LinuxNetDevice {},
107111 },
108112 },
109113 },
@@ -238,6 +242,9 @@ func (r *result) adjust(rpl *ContainerAdjustment, plugin string) error {
238242 if err := r .adjustSysctl (rpl .Linux .Sysctl , plugin ); err != nil {
239243 return err
240244 }
245+ if err := r .adjustLinuxNetDevices (rpl .Linux .NetDevices , plugin ); err != nil {
246+ return err
247+ }
241248 }
242249 if err := r .adjustRlimits (rpl .Rlimits , plugin ); err != nil {
243250 return err
@@ -960,6 +967,41 @@ func (r *result) adjustRlimits(rlimits []*POSIXRlimit, plugin string) error {
960967 return nil
961968}
962969
970+ func (r * result ) adjustLinuxNetDevices (devices map [string ]* LinuxNetDevice , plugin string ) error {
971+ if len (devices ) == 0 {
972+ return nil
973+ }
974+
975+ create , id := r .request .create , r .request .create .Container .Id
976+ del := map [string ]struct {}{}
977+ for k := range devices {
978+ if key , marked := IsMarkedForRemoval (k ); marked {
979+ del [key ] = struct {}{}
980+ delete (devices , k )
981+ }
982+ }
983+
984+ for k , v := range devices {
985+ if _ , ok := del [k ]; ok {
986+ r .owners .ClearLinuxNetDevice (id , k , plugin )
987+ delete (create .Container .Linux .NetDevices , k )
988+ r .reply .adjust .Linux .NetDevices [MarkForRemoval (k )] = nil
989+ }
990+ if err := r .owners .ClaimLinuxNetDevice (id , k , plugin ); err != nil {
991+ return err
992+ }
993+ create .Container .Linux .NetDevices [k ] = v
994+ r .reply .adjust .Linux .NetDevices [k ] = v
995+ delete (del , k )
996+ }
997+
998+ for k := range del {
999+ r .reply .adjust .Linux .NetDevices [MarkForRemoval (k )] = nil
1000+ }
1001+
1002+ return nil
1003+ }
1004+
9631005func (r * result ) updateResources (reply , u * ContainerUpdate , plugin string ) error {
9641006 if u .Linux == nil || u .Linux .Resources == nil {
9651007 return nil
0 commit comments