X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=ofproto%2Fofproto-dpif-xlate.c;h=7be691c7fc31c3a90d3f92cf8091e86518584618;hb=0c20dbe410f011354dda72e1534b4070e77603d4;hp=004a10543f37d3324585d3016009a14b8da6c474;hpb=f11c7538ba3d4d9fbaabd66457f1c20e95467b1c;p=sliver-openvswitch.git diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c index 004a10543..7be691c7f 100644 --- a/ofproto/ofproto-dpif-xlate.c +++ b/ofproto/ofproto-dpif-xlate.c @@ -1848,12 +1848,16 @@ execute_controller_action(struct xlate_ctx *ctx, int len, pin->up.packet = ofpbuf_steal_data(packet); pin->up.reason = reason; pin->up.table_id = ctx->table_id; - pin->up.cookie = ctx->rule ? rule_dpif_get_flow_cookie(ctx->rule) : 0; + pin->up.cookie = (ctx->rule + ? rule_dpif_get_flow_cookie(ctx->rule) + : OVS_BE64_MAX); - pin->up.send_len = len; flow_get_metadata(&ctx->xin->flow, &pin->up.fmd); pin->controller_id = controller_id; + pin->send_len = len; + pin->generated_by_table_miss = (ctx->rule + && rule_dpif_is_table_miss(ctx->rule)); ofproto_dpif_send_packet_in(ctx->xbridge->ofproto, pin); ofpbuf_delete(packet); } @@ -2364,12 +2368,26 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len, } break; - case OFPACT_SET_IPV4_DSCP: - /* OpenFlow 1.0 only supports IPv4. */ - if (flow->dl_type == htons(ETH_TYPE_IP)) { + case OFPACT_SET_IP_DSCP: + if (is_ip_any(flow)) { wc->masks.nw_tos |= IP_DSCP_MASK; flow->nw_tos &= ~IP_DSCP_MASK; - flow->nw_tos |= ofpact_get_SET_IPV4_DSCP(a)->dscp; + flow->nw_tos |= ofpact_get_SET_IP_DSCP(a)->dscp; + } + break; + + case OFPACT_SET_IP_ECN: + if (is_ip_any(flow)) { + wc->masks.nw_tos |= IP_ECN_MASK; + flow->nw_tos &= ~IP_ECN_MASK; + flow->nw_tos |= ofpact_get_SET_IP_ECN(a)->ecn; + } + break; + + case OFPACT_SET_IP_TTL: + if (is_ip_any(flow)) { + wc->masks.nw_ttl = 0xff; + flow->nw_ttl = ofpact_get_SET_IP_TTL(a)->ttl; } break; @@ -2776,7 +2794,7 @@ xlate_actions__(struct xlate_in *xin, struct xlate_out *xout) } ctx.rule = rule; } - xout->fail_open = ctx.rule && rule_dpif_fail_open(ctx.rule); + xout->fail_open = ctx.rule && rule_dpif_is_fail_open(ctx.rule); if (xin->ofpacts) { ofpacts = xin->ofpacts;