Skip to content

Commit fc723f0

Browse files
author
OpenShift Bot
authored
Merge pull request openshift#13162 from dcbw/sdn-fragments
Merged by openshift-bot
2 parents d759401 + 4b89419 commit fc723f0

File tree

2 files changed

+36
-18
lines changed

2 files changed

+36
-18
lines changed

pkg/sdn/plugin/controller.go

+31-18
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,10 @@ func (plugin *OsdnNode) SetupSDN() (bool, error) {
225225
if err != nil {
226226
return false, err
227227
}
228+
err = plugin.ovs.SetFrags("nx-match")
229+
if err != nil {
230+
return false, err
231+
}
228232
_ = plugin.ovs.DeletePort(VXLAN)
229233
_, err = plugin.ovs.AddPort(VXLAN, 1, "type=vxlan", `options:remote_ip="flow"`, `options:key="flow"`)
230234
if err != nil {
@@ -457,35 +461,44 @@ func (plugin *OsdnNode) AddServiceRules(service *kapi.Service, netID uint32) {
457461
glog.V(5).Infof("AddServiceRules for %v", service)
458462

459463
otx := plugin.ovs.NewTransaction()
464+
action := fmt.Sprintf(", priority=100, actions=load:%d->NXM_NX_REG1[], load:2->NXM_NX_REG2[], goto_table:80", netID)
465+
466+
// Add blanket rule allowing subsequent IP fragments
467+
otx.AddFlow(generateBaseServiceRule(service.Spec.ClusterIP) + ", ip_frag=later" + action)
468+
460469
for _, port := range service.Spec.Ports {
461-
otx.AddFlow(generateAddServiceRule(netID, service.Spec.ClusterIP, port.Protocol, int(port.Port)))
462-
if err := otx.EndTransaction(); err != nil {
463-
glog.Errorf("Error adding OVS flows for service %v, netid %d: %v", service, netID, err)
470+
baseRule, err := generateBaseAddServiceRule(service.Spec.ClusterIP, port.Protocol, int(port.Port))
471+
if err != nil {
472+
glog.Errorf("Error creating OVS flow for service %v, netid %d: %v", service, netID, err)
464473
}
474+
otx.AddFlow(baseRule + action)
475+
}
476+
477+
if err := otx.EndTransaction(); err != nil {
478+
glog.Errorf("Error adding OVS flows for service %v, netid %d: %v", service, netID, err)
465479
}
466480
}
467481

468482
func (plugin *OsdnNode) DeleteServiceRules(service *kapi.Service) {
469483
glog.V(5).Infof("DeleteServiceRules for %v", service)
470484

471485
otx := plugin.ovs.NewTransaction()
472-
for _, port := range service.Spec.Ports {
473-
otx.DeleteFlows(generateDeleteServiceRule(service.Spec.ClusterIP, port.Protocol, int(port.Port)))
474-
if err := otx.EndTransaction(); err != nil {
475-
glog.Errorf("Error deleting OVS flows for service %v: %v", service, err)
476-
}
477-
}
486+
otx.DeleteFlows(generateBaseServiceRule(service.Spec.ClusterIP))
487+
otx.EndTransaction()
478488
}
479489

480-
func generateBaseServiceRule(IP string, protocol kapi.Protocol, port int) string {
481-
return fmt.Sprintf("table=60, %s, nw_dst=%s, tp_dst=%d", strings.ToLower(string(protocol)), IP, port)
490+
func generateBaseServiceRule(IP string) string {
491+
return fmt.Sprintf("table=60, ip, nw_dst=%s", IP)
482492
}
483493

484-
func generateAddServiceRule(netID uint32, IP string, protocol kapi.Protocol, port int) string {
485-
baseRule := generateBaseServiceRule(IP, protocol, port)
486-
return fmt.Sprintf("%s, priority=100, actions=load:%d->NXM_NX_REG1[], load:2->NXM_NX_REG2[], goto_table:80", baseRule, netID)
487-
}
488-
489-
func generateDeleteServiceRule(IP string, protocol kapi.Protocol, port int) string {
490-
return generateBaseServiceRule(IP, protocol, port)
494+
func generateBaseAddServiceRule(IP string, protocol kapi.Protocol, port int) (string, error) {
495+
var dst string
496+
if protocol == kapi.ProtocolUDP {
497+
dst = fmt.Sprintf(", udp, udp_dst=%d", port)
498+
} else if protocol == kapi.ProtocolTCP {
499+
dst = fmt.Sprintf(", tcp, tcp_dst=%d", port)
500+
} else {
501+
return "", fmt.Errorf("unhandled protocol %v", protocol)
502+
}
503+
return generateBaseServiceRule(IP) + dst, nil
491504
}

pkg/util/ovs/ovs.go

+5
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,11 @@ func (ovsif *Interface) DeletePort(port string) error {
144144
return err
145145
}
146146

147+
func (ovsif *Interface) SetFrags(mode string) error {
148+
_, err := ovsif.exec(OVS_OFCTL, "set-frags", ovsif.bridge, mode)
149+
return err
150+
}
151+
147152
type Transaction struct {
148153
ovsif *Interface
149154
err error

0 commit comments

Comments
 (0)