@@ -18,8 +18,6 @@ import (
18
18
19
19
"k8s.io/apimachinery/pkg/util/sets"
20
20
kapi "k8s.io/kubernetes/pkg/apis/core"
21
-
22
- "github.com/vishvananda/netlink"
23
21
)
24
22
25
23
type ovsController struct {
@@ -87,13 +85,6 @@ func (oc *ovsController) SetupOVS(clusterNetworkCIDR []string, serviceNetworkCID
87
85
if err != nil {
88
86
return err
89
87
}
90
- if oc .tunMAC == "" {
91
- link , err := netlink .LinkByName (Tun0 )
92
- if err != nil {
93
- return err
94
- }
95
- oc .tunMAC = link .Attrs ().HardwareAddr .String ()
96
- }
97
88
98
89
otx := oc .ovs .NewTransaction ()
99
90
@@ -675,6 +666,21 @@ func (oc *ovsController) FindUnusedVNIDs() []int {
675
666
return policyVNIDs .Difference (inUseVNIDs ).UnsortedList ()
676
667
}
677
668
669
+ func (oc * ovsController ) ensureTunMAC () error {
670
+ if oc .tunMAC != "" {
671
+ return nil
672
+ }
673
+
674
+ val , err := oc .ovs .Get ("Interface" , Tun0 , "mac_in_use" )
675
+ if err != nil {
676
+ return fmt .Errorf ("could not get %s MAC address: %v" , Tun0 , err )
677
+ } else if len (val ) != 19 || val [0 ] != '"' || val [18 ] != '"' {
678
+ return fmt .Errorf ("bad MAC address for %s: %q" , Tun0 , val )
679
+ }
680
+ oc .tunMAC = val [1 :18 ]
681
+ return nil
682
+ }
683
+
678
684
func (oc * ovsController ) UpdateNamespaceEgressRules (vnid uint32 , nodeIP , egressHex string ) error {
679
685
otx := oc .ovs .NewTransaction ()
680
686
otx .DeleteFlows ("table=100, reg0=%d" , vnid )
@@ -686,6 +692,9 @@ func (oc *ovsController) UpdateNamespaceEgressRules(vnid uint32, nodeIP, egressH
686
692
otx .AddFlow ("table=100, priority=100, reg0=%d, actions=drop" , vnid )
687
693
} else if nodeIP == oc .localIP {
688
694
// Local Egress IP
695
+ if err := oc .ensureTunMAC (); err != nil {
696
+ return err
697
+ }
689
698
otx .AddFlow ("table=100, priority=100, reg0=%d, ip, actions=set_field:%s->eth_dst,set_field:%s->pkt_mark,goto_table:101" , vnid , oc .tunMAC , egressHex )
690
699
} else {
691
700
// Remote Egress IP; send via VXLAN
0 commit comments