@@ -146,6 +146,7 @@ func (p *cniPlugin) CmdAdd(args *skel.CmdArgs) error {
146
146
if err != nil {
147
147
return fmt .Errorf ("failed to convert IPAM result: %v" , err )
148
148
}
149
+ defaultGW := result020 .IP4 .Gateway
149
150
result020 .IP4 .Gateway = nil
150
151
151
152
result030 , err := current .NewResultFromResult (result020 )
@@ -164,7 +165,7 @@ func (p *cniPlugin) CmdAdd(args *skel.CmdArgs) error {
164
165
}
165
166
result030 .IPs [0 ].Interface = current .Int (0 )
166
167
167
- err = ns .WithNetNSPath (args .Netns , func (ns.NetNS ) error {
168
+ err = ns .WithNetNSPath (args .Netns , func (hostNS ns.NetNS ) error {
168
169
// Set up eth0
169
170
if err := ip .SetHWAddrByIP (args .IfName , result030 .IPs [0 ].Address .IP , nil ); err != nil {
170
171
return fmt .Errorf ("failed to set pod interface MAC address: %v" , err )
@@ -186,9 +187,37 @@ func (p *cniPlugin) CmdAdd(args *skel.CmdArgs) error {
186
187
link , err = netlink .LinkByName ("macvlan0" )
187
188
if err == nil {
188
189
err = netlink .LinkSetUp (link )
190
+ if err != nil {
191
+ return fmt .Errorf ("failed to enable macvlan device: %v" , err )
192
+ }
193
+
194
+ // A macvlan can't reach its parent interface's IP, so we need to
195
+ // add a route to that via the SDN
196
+ var addrs []netlink.Addr
197
+ err = hostNS .Do (func (ns.NetNS ) error {
198
+ parent , err := netlink .LinkByIndex (link .Attrs ().ParentIndex )
199
+ if err != nil {
200
+ return err
201
+ }
202
+ addrs , err = netlink .AddrList (parent , netlink .FAMILY_V4 )
203
+ return err
204
+ })
189
205
if err != nil {
190
206
return fmt .Errorf ("failed to configure macvlan device: %v" , err )
191
207
}
208
+ for _ , addr := range addrs {
209
+ route := & netlink.Route {
210
+ Dst : & net.IPNet {
211
+ IP : addr .IP ,
212
+ Mask : net .CIDRMask (32 , 32 ),
213
+ },
214
+ Gw : defaultGW ,
215
+ }
216
+ err = netlink .RouteAdd (route )
217
+ if err != nil {
218
+ return fmt .Errorf ("failed to configure macvlan device: %v" )
219
+ }
220
+ }
192
221
}
193
222
194
223
return nil
0 commit comments