@@ -46,6 +46,7 @@ type NetConf struct {
4646 IPMasq bool `json:"ipMasq"`
4747 MTU int `json:"mtu"`
4848 HairpinMode bool `json:"hairpinMode"`
49+ PromiscMode bool `json:"promiscMode"`
4950}
5051
5152type gwInfo struct {
@@ -196,7 +197,7 @@ func bridgeByName(name string) (*netlink.Bridge, error) {
196197 return br , nil
197198}
198199
199- func ensureBridge (brName string , mtu int ) (* netlink.Bridge , error ) {
200+ func ensureBridge (brName string , mtu int , promiscMode bool ) (* netlink.Bridge , error ) {
200201 br := & netlink.Bridge {
201202 LinkAttrs : netlink.LinkAttrs {
202203 Name : brName ,
@@ -214,6 +215,12 @@ func ensureBridge(brName string, mtu int) (*netlink.Bridge, error) {
214215 return nil , fmt .Errorf ("could not add %q: %v" , brName , err )
215216 }
216217
218+ if promiscMode {
219+ if err := netlink .SetPromiscOn (br ); err != nil {
220+ return nil , fmt .Errorf ("could not set promiscuous mode on %q: %v" , brName , err )
221+ }
222+ }
223+
217224 // Re-fetch link to read all attributes and if it already existed,
218225 // ensure it's really a bridge with similar configuration
219226 br , err = bridgeByName (brName )
@@ -275,7 +282,7 @@ func calcGatewayIP(ipn *net.IPNet) net.IP {
275282
276283func setupBridge (n * NetConf ) (* netlink.Bridge , * current.Interface , error ) {
277284 // create bridge if necessary
278- br , err := ensureBridge (n .BrName , n .MTU )
285+ br , err := ensureBridge (n .BrName , n .MTU , n . PromiscMode )
279286 if err != nil {
280287 return nil , nil , fmt .Errorf ("failed to create bridge %q: %v" , n .BrName , err )
281288 }
@@ -310,6 +317,10 @@ func cmdAdd(args *skel.CmdArgs) error {
310317 n .IsGW = true
311318 }
312319
320+ if n .HairpinMode && n .PromiscMode {
321+ return fmt .Errorf ("cannot set hairpin mode and promiscous mode at the same time." )
322+ }
323+
313324 br , brInterface , err := setupBridge (n )
314325 if err != nil {
315326 return err
0 commit comments