On 10/12/2015 14:57, "Jarno Rajahalme" <ja...@ovn.org> wrote:
>With a note below, > >Acked-by: Jarno Rajahalme <ja...@ovn.org> > >> On Dec 9, 2015, at 6:27 PM, Daniele Di Proietto >><diproiet...@vmware.com> wrote: >> >> commit_set_icmp_action() should do its job only if the packet is ICMP, >> otherwise there will be two problems: >> >> * A set ICMP action will be inserted in the ODP actions and the flow >> will be slow pathed. >> * The tp_src and tp_dst field will be unwildcarded. >> >> Normal TCP or UDP packets won't be impacted, because >> commit_set_port_action() is called before commit_set_icmp_actions(). >> > >Maybe add: ³, due to ports using the same fields as icmp, causing >commit_set_imp_action() seeing the fields as already committed." I rephrased it in Normal TCP or UDP packets won't be impacted, because commit_set_icmp_action() is called after commit_set_port_action() and it will see the fields as already committed (TCP/UCP transport ports and ICMP code/type are stored in the same members in struct flow). and pushed it to master and branch-2.5 Thanks! > >> MPLS packets though will hit the bug, causing a nonsensical set action >> (which will end up zeroing the transport source port) and an invalid >> mask to be generated. >> >> The commit also alters an MPLS testcase to trigger the bug. >> >> Signed-off-by: Daniele Di Proietto <diproiet...@vmware.com> >> --- >> lib/odp-util.c | 10 ++++++++-- >> tests/mpls-xlate.at | 2 +- >> 2 files changed, 9 insertions(+), 3 deletions(-) >> >> diff --git a/lib/odp-util.c b/lib/odp-util.c >> index 90942c7..4db371d 100644 >> --- a/lib/odp-util.c >> +++ b/lib/odp-util.c >> @@ -5651,12 +5651,18 @@ commit_set_icmp_action(const struct flow *flow, >>struct flow *base_flow, >> struct ovs_key_icmp key, mask, base; >> enum ovs_key_attr attr; >> >> + if (is_icmpv4(flow)) { >> + attr = OVS_KEY_ATTR_ICMP; >> + } else if (is_icmpv6(flow)) { >> + attr = OVS_KEY_ATTR_ICMPV6; >> + } else { >> + return 0; >> + } >> + >> get_icmp_key(flow, &key); >> get_icmp_key(base_flow, &base); >> get_icmp_key(&wc->masks, &mask); >> >> - attr = flow->dl_type == htons(ETH_TYPE_IP) ? OVS_KEY_ATTR_ICMP >> - : OVS_KEY_ATTR_ICMPV6; >> if (commit(attr, false, &key, &base, &mask, sizeof key, >>odp_actions)) { >> put_icmp_key(&base, base_flow); >> put_icmp_key(&mask, &wc->masks); >> diff --git a/tests/mpls-xlate.at b/tests/mpls-xlate.at >> index 8f286c3..38790ea 100644 >> --- a/tests/mpls-xlate.at >> +++ b/tests/mpls-xlate.at >> @@ -16,7 +16,7 @@ AT_CHECK([ovs-ofctl -O OpenFlow13 add-flow br0 >>in_port=local,dl_type=0x0800,acti >> AT_CHECK([ovs-ofctl -O OpenFlow13 add-flow br0 >>dl_type=0x8847,in_port=1,mpls_label=20,action=pop_mpls:0x0800,output:LOCA >>L]) >> >> dnl Test MPLS push >> -AT_CHECK([ovs-appctl ofproto/trace ovs-dummy >>'in_port(100),eth(src=f8:bc:12:44:34:b6,dst=f8:bc:12:46:58:e0),eth_type(0 >>x0800),ipv4(src=1.1.2.92,dst=1.1.2.88,proto=47,tos=0,ttl=64,frag=no)'], >>[0], [stdout]) >> +AT_CHECK([ovs-appctl ofproto/trace ovs-dummy >>'in_port(100),eth(src=f8:bc:12:44:34:b6,dst=f8:bc:12:46:58:e0),eth_type(0 >>x0800),ipv4(src=1.1.2.92,dst=1.1.2.88,proto=17,tos=0,ttl=64,frag=no),udp( >>src=7777,dst=80)'], [0], [stdout]) >> AT_CHECK([tail -1 stdout], [0], >> [Datapath actions: >>push_mpls(label=10,tc=0,ttl=64,bos=1,eth_type=0x8847),1 >> ]) >> -- >> 2.1.4 >> >> _______________________________________________ >> dev mailing list >> dev@openvswitch.org >> >>https://urldefense.proofpoint.com/v2/url?u=http-3A__openvswitch.org_mailm >>an_listinfo_dev&d=BQIFaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r= >>SmB5nZacmXNq0gKCC1s_Cw5yUNjxgD4v5kJqZ2uWLlE&m=AYzr3gKsVDquCLAT1_sp9T7F-Zh >>6qkFit0yVO__bvW8&s=OO5PIhmhuILxvET-1xP7l5jQd7lmY-iG3Jot4pnBFXk&e= > _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev