From: Simon Horman Date: Wed, 8 May 2013 01:50:14 +0000 (+0900) Subject: Check actions prerequisites in parse_ofp_str() X-Git-Tag: sliver-openvswitch-1.10.90-3~16^2~19 X-Git-Url: http://git.onelab.eu/?p=sliver-openvswitch.git;a=commitdiff_plain;h=b019d34da6e6c185bb093984906adcb36c3f6686 Check actions prerequisites in parse_ofp_str() Add a call to ofpacts_check() in parse_ofp_str() to check pre-requisites. This is in preparation for removing special-case pre-requisite checking of learn actions which is useful for the test-suite. This patch also fixes two tests which this change revealed to be incorrect. 1. Open Flow 1.0 action which sets NXM_NX_IPV6_SRC without any pre-requisites This is not valid because there should be an IPv6 pre-requisite. This portion of the test has been removed as IPv6 pre-requisites are only valid when using OXM or NXM, however the test appears to be a (non-NXM) Open Flow 1.0 test. It has been replaced with a similar test of an action that sets the IPv4 source address. 2. Open Flow 1.2 action which sets NXM_NX_IPV6_SRC without any pre-requisites. This is not valid because there should be an IPv6 pre-requisite. This test has been corrected by adding IPv6 as a pre-requisite, which is valid for Open Flow 1.2 as it uses OXM. Use of ofpacts_check() in parse_ofp_str() suggested by Ben Pfaff. Cc: Ben Pfaff Signed-off-by: Simon Horman Signed-off-by: Ben Pfaff --- diff --git a/lib/ofp-parse.c b/lib/ofp-parse.c index 295c03816..970fd5361 100644 --- a/lib/ofp-parse.c +++ b/lib/ofp-parse.c @@ -1004,11 +1004,19 @@ parse_ofp_str(struct ofputil_flow_mod *fm, int command, const char *str_, } if (fields & F_ACTIONS) { struct ofpbuf ofpacts; + enum ofperr err; ofpbuf_init(&ofpacts, 32); str_to_inst_ofpacts(&fm->match.flow, act_str, &ofpacts); fm->ofpacts_len = ofpacts.size; fm->ofpacts = ofpbuf_steal_data(&ofpacts); + + err = ofpacts_check(fm->ofpacts, fm->ofpacts_len, &fm->match.flow, + OFPP_MAX); + if (err) { + exit(EXIT_FAILURE); + } + } else { fm->ofpacts_len = 0; fm->ofpacts = NULL; diff --git a/tests/ovs-ofctl.at b/tests/ovs-ofctl.at index db19e0161..61986777a 100644 --- a/tests/ovs-ofctl.at +++ b/tests/ovs-ofctl.at @@ -10,7 +10,7 @@ tcp,nw_src=192.168.0.3,tp_dst=80 actions=set_queue:37,output:1 udp,nw_src=192.168.0.3,tp_dst=53 actions=pop_queue,output:1 cookie=0x123456789abcdef hard_timeout=10 priority=60000 actions=controller actions=note:41.42.43,note:00.01.02.03.04.05.06.07,note -actions=set_field:fe80:0123:4567:890a:a6ba:dbff:fefe:59fa->ipv6_src +ip,actions=set_field:10.4.3.77->ip_src in_port=0 actions=resubmit:0 actions=sample(probability=12345,collector_set_id=23456,obs_domain_id=34567,obs_point_id=45678) ]]) @@ -27,7 +27,7 @@ OFPT_FLOW_MOD: ADD tcp,nw_src=192.168.0.3,tp_dst=80 actions=set_queue:37,output: OFPT_FLOW_MOD: ADD udp,nw_src=192.168.0.3,tp_dst=53 actions=pop_queue,output:1 OFPT_FLOW_MOD: ADD priority=60000 cookie:0x123456789abcdef hard:10 actions=CONTROLLER:65535 OFPT_FLOW_MOD: ADD actions=note:41.42.43.00.00.00,note:00.01.02.03.04.05.06.07.00.00.00.00.00.00,note:00.00.00.00.00.00 -OFPT_FLOW_MOD: ADD actions=load:0xa6badbfffefe59fa->NXM_NX_IPV6_SRC[0..63],load:0xfe8001234567890a->NXM_NX_IPV6_SRC[64..127] +OFPT_FLOW_MOD: ADD ip actions=load:0xa04034d->NXM_OF_IP_SRC[] OFPT_FLOW_MOD: ADD in_port=0 actions=resubmit:0 OFPT_FLOW_MOD: ADD actions=sample(probability=12345,collector_set_id=23456,obs_domain_id=34567,obs_point_id=45678) ]]) @@ -43,7 +43,7 @@ tcp,nw_src=192.168.0.3,tp_dst=80 actions=set_queue:37,output:1 udp,nw_src=192.168.0.3,tp_dst=53 actions=pop_queue,output:1 cookie=0x123456789abcdef hard_timeout=10 priority=60000 actions=controller actions=note:41.42.43,note:00.01.02.03.04.05.06.07,note -actions=set_field:fe80:0123:4567:890a:a6ba:dbff:fefe:59fa->ipv6_src +ipv6,actions=set_field:fe80:0123:4567:890a:a6ba:dbff:fefe:59fa->ipv6_src in_port=0 actions=resubmit:0 actions=sample(probability=12345,collector_set_id=23456,obs_domain_id=34567,obs_point_id=45678) ]]) @@ -51,7 +51,7 @@ actions=sample(probability=12345,collector_set_id=23456,obs_domain_id=34567,obs_ AT_CHECK([ovs-ofctl --protocols OpenFlow12 parse-flows flows.txt ], [0], [stdout]) AT_CHECK([[sed 's/ (xid=0x[0-9a-fA-F]*)//' stdout]], [0], -[[usable protocols: any +[[usable protocols: NXM,OXM chosen protocol: OXM-OpenFlow12 OFPT_FLOW_MOD (OF1.2): ADD table:255 tcp,tp_src=123 actions=FLOOD OFPT_FLOW_MOD (OF1.2): ADD table:255 in_port=LOCAL,dl_vlan=9,dl_src=00:0a:e4:25:6b:b0 actions=drop @@ -60,7 +60,7 @@ OFPT_FLOW_MOD (OF1.2): ADD table:255 tcp,nw_src=192.168.0.3,tp_dst=80 actions=se OFPT_FLOW_MOD (OF1.2): ADD table:255 udp,nw_src=192.168.0.3,tp_dst=53 actions=pop_queue,output:1 OFPT_FLOW_MOD (OF1.2): ADD table:255 priority=60000 cookie:0x123456789abcdef hard:10 actions=CONTROLLER:65535 OFPT_FLOW_MOD (OF1.2): ADD table:255 actions=note:41.42.43.00.00.00,note:00.01.02.03.04.05.06.07.00.00.00.00.00.00,note:00.00.00.00.00.00 -OFPT_FLOW_MOD (OF1.2): ADD table:255 actions=set_field:fe80:123:4567:890a:a6ba:dbff:fefe:59fa->ipv6_src +OFPT_FLOW_MOD (OF1.2): ADD table:255 ipv6 actions=set_field:fe80:123:4567:890a:a6ba:dbff:fefe:59fa->ipv6_src OFPT_FLOW_MOD (OF1.2): ADD table:255 in_port=0 actions=resubmit:0 OFPT_FLOW_MOD (OF1.2): ADD table:255 actions=sample(probability=12345,collector_set_id=23456,obs_domain_id=34567,obs_point_id=45678) ]])