From 9387b97098afe90403cc139ad2b55ce7e02bc4a2 Mon Sep 17 00:00:00 2001 From: Simon Horman Date: Fri, 12 Oct 2012 09:26:28 +0900 Subject: [PATCH] ofproto: Do not add flow on flow mod if new_cookie is UINT64_MAX Internally a new_cookie value UINT64_MAX is used for an OpenFlow 1.2 flow mod whose command is not Add. Open Flow 1.2 does not permit adding flows for such commands. Also, UINT64_MAX is a prohibited cookie value, and the existing code created a flow with that value as for the cookie. Signed-off-by: Simon Horman Signed-off-by: Ben Pfaff --- ofproto/ofproto.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c index a128a6d9c..9d25a13f0 100644 --- a/ofproto/ofproto.c +++ b/ofproto/ofproto.c @@ -3080,6 +3080,17 @@ modify_flows__(struct ofproto *ofproto, struct ofconn *ofconn, return error; } +static enum ofperr +modify_flows_add(struct ofproto *ofproto, struct ofconn *ofconn, + const struct ofputil_flow_mod *fm, + const struct ofp_header *request) +{ + if (fm->cookie_mask != htonll(0) || fm->new_cookie == htonll(UINT64_MAX)) { + return 0; + } + return add_flow(ofproto, ofconn, fm, request); +} + /* Implements OFPFC_MODIFY. Returns 0 on success or an OpenFlow error code on * failure. * @@ -3099,7 +3110,7 @@ modify_flows_loose(struct ofproto *ofproto, struct ofconn *ofconn, if (error) { return error; } else if (list_is_empty(&rules)) { - return fm->cookie_mask ? 0 : add_flow(ofproto, ofconn, fm, request); + return modify_flows_add(ofproto, ofconn, fm, request); } else { return modify_flows__(ofproto, ofconn, fm, request, &rules); } @@ -3125,7 +3136,7 @@ modify_flow_strict(struct ofproto *ofproto, struct ofconn *ofconn, if (error) { return error; } else if (list_is_empty(&rules)) { - return fm->cookie_mask ? 0 : add_flow(ofproto, ofconn, fm, request); + return modify_flows_add(ofproto, ofconn, fm, request); } else { return list_is_singleton(&rules) ? modify_flows__(ofproto, ofconn, fm, request, &rules) -- 2.43.0