Skip to content

Commit 71913f4

Browse files
authored
Merge pull request #95 from digitalocean/nbouliane/learn_options
add hard_timeout and limit options to the learn action
2 parents 8ce3b42 + 857d899 commit 71913f4

File tree

3 files changed

+69
-3
lines changed

3 files changed

+69
-3
lines changed

ovs/action_test.go

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -682,7 +682,19 @@ func TestLearn(t *testing.T) {
682682
Matches: []Match{DataLinkType(0x800)},
683683
Actions: []Action{OutputField("in_port"), Load("2", "tp_dst")},
684684
}),
685-
action: `learn(priority=0,dl_type=0x0800,table=0,idle_timeout=0,fin_hard_timeout=10,delete_learned,output:in_port,load:2->tp_dst)`,
685+
action: `learn(priority=0,dl_type=0x0800,table=0,idle_timeout=0,fin_hard_timeout=10,hard_timeout=0,limit=0,delete_learned,output:in_port,load:2->tp_dst)`,
686+
},
687+
{
688+
desc: "learn ok",
689+
a: Learn(&LearnedFlow{
690+
DeleteLearned: true,
691+
FinHardTimeout: 10,
692+
HardTimeout: 30,
693+
Limit: 10,
694+
Matches: []Match{DataLinkType(0x800)},
695+
Actions: []Action{OutputField("in_port"), Load("2", "tp_dst")},
696+
}),
697+
action: `learn(priority=0,dl_type=0x0800,table=0,idle_timeout=0,fin_hard_timeout=10,hard_timeout=30,limit=10,delete_learned,output:in_port,load:2->tp_dst)`,
686698
},
687699
{
688700
desc: "prohibited learned action, mod_tp_dst",
@@ -806,10 +818,12 @@ func TestActionGoString(t *testing.T) {
806818
a: Learn(&LearnedFlow{
807819
DeleteLearned: true,
808820
FinHardTimeout: 10,
821+
HardTimeout: 30,
822+
Limit: 10,
809823
Matches: []Match{DataLinkType(0x800)},
810824
Actions: []Action{OutputField("in_port")},
811825
}),
812-
s: `ovs.Learn(&ovs.LearnedFlow{Priority:0, InPort:0, Matches:[]ovs.Match{ovs.DataLinkType(0x0800)}, Table:0, IdleTimeout:0, Cookie:0x0, Actions:[]ovs.Action{ovs.OutputField("in_port")}, DeleteLearned:true, FinHardTimeout:10})`,
826+
s: `ovs.Learn(&ovs.LearnedFlow{Priority:0, InPort:0, Matches:[]ovs.Match{ovs.DataLinkType(0x0800)}, Table:0, IdleTimeout:0, Cookie:0x0, Actions:[]ovs.Action{ovs.OutputField("in_port")}, DeleteLearned:true, FinHardTimeout:10, HardTimeout:30, Limit:10})`,
813827
},
814828
}
815829

ovs/flow.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ type LearnedFlow struct {
7979

8080
DeleteLearned bool
8181
FinHardTimeout int
82+
HardTimeout int
83+
Limit int
8284
}
8385

8486
var _ error = &FlowError{}
@@ -123,6 +125,8 @@ const (
123125
// Variables used in LearnedFlows only.
124126
deleteLearned = "delete_learned"
125127
finHardTimeout = "fin_hard_timeout"
128+
hardTimeout = "hard_timeout"
129+
limit = "limit"
126130

127131
portLOCAL = "LOCAL"
128132
)
@@ -262,6 +266,11 @@ func (f *LearnedFlow) MarshalText() ([]byte, error) {
262266
b = append(b, ","+finHardTimeout+"="...)
263267
b = strconv.AppendInt(b, int64(f.FinHardTimeout), 10)
264268

269+
b = append(b, ","+hardTimeout+"="...)
270+
b = strconv.AppendInt(b, int64(f.HardTimeout), 10)
271+
272+
b = append(b, ","+limit+"="...)
273+
b = strconv.AppendInt(b, int64(f.Limit), 10)
265274
if f.DeleteLearned {
266275
b = append(b, ","+deleteLearned...)
267276
}

ovs/flow_test.go

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,50 @@ func TestFlowMarshalText(t *testing.T) {
352352
Output(4),
353353
},
354354
},
355-
s: `priority=5000,tcp,in_port=3,nw_dst=169.254.169.254,tp_dst=80,table=0,idle_timeout=0,actions=learn(priority=5000,in_port=4,dl_type=0x0800,nw_proto=6,NXM_OF_IP_SRC[]=NXM_OF_IP_DST[],NXM_OF_TCP_SRC[]=NXM_OF_TCP_DST[],nw_dst=1.2.3.4,tp_dst=567,table=0,idle_timeout=60,fin_hard_timeout=1,delete_learned,load:NXM_OF_ETH_SRC[]->NXM_OF_ETH_DST[],load:NXM_OF_IP_SRC[]->NXM_OF_IP_DST[],load:NXM_OF_TCP_SRC[]->NXM_OF_TCP_DST[],output:NXM_OF_IN_PORT[]),mod_nw_src:1.2.3.4,mod_tp_src:567,output:4`,
355+
s: `priority=5000,tcp,in_port=3,nw_dst=169.254.169.254,tp_dst=80,table=0,idle_timeout=0,actions=learn(priority=5000,in_port=4,dl_type=0x0800,nw_proto=6,NXM_OF_IP_SRC[]=NXM_OF_IP_DST[],NXM_OF_TCP_SRC[]=NXM_OF_TCP_DST[],nw_dst=1.2.3.4,tp_dst=567,table=0,idle_timeout=60,fin_hard_timeout=1,hard_timeout=0,limit=0,delete_learned,load:NXM_OF_ETH_SRC[]->NXM_OF_ETH_DST[],load:NXM_OF_IP_SRC[]->NXM_OF_IP_DST[],load:NXM_OF_TCP_SRC[]->NXM_OF_TCP_DST[],output:NXM_OF_IN_PORT[]),mod_nw_src:1.2.3.4,mod_tp_src:567,output:4`,
356+
},
357+
{
358+
desc: "Flow with LearnedFlow in Learn action with hard_timeout and limit options",
359+
f: &Flow{
360+
Priority: 5000,
361+
Protocol: "tcp",
362+
InPort: 3,
363+
Matches: []Match{
364+
NetworkDestination("169.254.169.254"),
365+
TransportDestinationPort(80),
366+
},
367+
Actions: []Action{
368+
Learn(
369+
&LearnedFlow{
370+
DeleteLearned: true,
371+
FinHardTimeout: 1,
372+
HardTimeout: 30,
373+
Limit: 10,
374+
Table: 0,
375+
IdleTimeout: 60,
376+
Priority: 5000,
377+
InPort: 4,
378+
Matches: []Match{
379+
DataLinkType(0x800),
380+
NetworkProtocol(6),
381+
FieldMatch("NXM_OF_IP_SRC[]", "NXM_OF_IP_DST[]"),
382+
FieldMatch("NXM_OF_TCP_SRC[]", "NXM_OF_TCP_DST[]"),
383+
NetworkDestination("1.2.3.4"),
384+
TransportDestinationPort(567),
385+
},
386+
Actions: []Action{
387+
Load("NXM_OF_ETH_SRC[]", "NXM_OF_ETH_DST[]"),
388+
Load("NXM_OF_IP_SRC[]", "NXM_OF_IP_DST[]"),
389+
Load("NXM_OF_TCP_SRC[]", "NXM_OF_TCP_DST[]"),
390+
OutputField("NXM_OF_IN_PORT[]"),
391+
},
392+
}),
393+
ModNetworkSource(net.IPv4(1, 2, 3, 4)),
394+
ModTransportSourcePort(567),
395+
Output(4),
396+
},
397+
},
398+
s: `priority=5000,tcp,in_port=3,nw_dst=169.254.169.254,tp_dst=80,table=0,idle_timeout=0,actions=learn(priority=5000,in_port=4,dl_type=0x0800,nw_proto=6,NXM_OF_IP_SRC[]=NXM_OF_IP_DST[],NXM_OF_TCP_SRC[]=NXM_OF_TCP_DST[],nw_dst=1.2.3.4,tp_dst=567,table=0,idle_timeout=60,fin_hard_timeout=1,hard_timeout=30,limit=10,delete_learned,load:NXM_OF_ETH_SRC[]->NXM_OF_ETH_DST[],load:NXM_OF_IP_SRC[]->NXM_OF_IP_DST[],load:NXM_OF_TCP_SRC[]->NXM_OF_TCP_DST[],output:NXM_OF_IN_PORT[]),mod_nw_src:1.2.3.4,mod_tp_src:567,output:4`,
356399
},
357400
}
358401

0 commit comments

Comments
 (0)