@@ -146,6 +146,7 @@ func (p *cniPlugin) CmdAdd(args *skel.CmdArgs) error {
146146 if err != nil {
147147 return fmt .Errorf ("failed to convert IPAM result: %v" , err )
148148 }
149+ defaultGW := result020 .IP4 .Gateway
149150 result020 .IP4 .Gateway = nil
150151
151152 result030 , err := current .NewResultFromResult (result020 )
@@ -164,7 +165,7 @@ func (p *cniPlugin) CmdAdd(args *skel.CmdArgs) error {
164165 }
165166 result030 .IPs [0 ].Interface = current .Int (0 )
166167
167- err = ns .WithNetNSPath (args .Netns , func (ns.NetNS ) error {
168+ err = ns .WithNetNSPath (args .Netns , func (hostNS ns.NetNS ) error {
168169 // Set up eth0
169170 if err := ip .SetHWAddrByIP (args .IfName , result030 .IPs [0 ].Address .IP , nil ); err != nil {
170171 return fmt .Errorf ("failed to set pod interface MAC address: %v" , err )
@@ -186,9 +187,37 @@ func (p *cniPlugin) CmdAdd(args *skel.CmdArgs) error {
186187 link , err = netlink .LinkByName ("macvlan0" )
187188 if err == nil {
188189 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+ })
189205 if err != nil {
190206 return fmt .Errorf ("failed to configure macvlan device: %v" , err )
191207 }
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+ }
192221 }
193222
194223 return nil
0 commit comments