X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=ofproto%2Fofproto-dpif-xlate.c;h=7be691c7fc31c3a90d3f92cf8091e86518584618;hb=0c20dbe410f011354dda72e1534b4070e77603d4;hp=9313a7fb73faba2c1dd7f8ff617a4e6e6a1221c0;hpb=7fdb60a758d76fecf5165a9d0bf1df9271699141;p=sliver-openvswitch.git diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c index 9313a7fb7..7be691c7f 100644 --- a/ofproto/ofproto-dpif-xlate.c +++ b/ofproto/ofproto-dpif-xlate.c @@ -1820,7 +1820,7 @@ execute_controller_action(struct xlate_ctx *ctx, int len, enum ofp_packet_in_reason reason, uint16_t controller_id) { - struct ofputil_packet_in *pin; + struct ofproto_packet_in *pin; struct ofpbuf *packet; struct flow key; @@ -1844,16 +1844,20 @@ execute_controller_action(struct xlate_ctx *ctx, int len, ctx->xout->odp_actions.size, NULL, NULL); pin = xmalloc(sizeof *pin); - pin->packet_len = packet->size; - pin->packet = ofpbuf_steal_data(packet); - pin->reason = reason; - pin->controller_id = controller_id; - pin->table_id = ctx->table_id; - pin->cookie = ctx->rule ? rule_dpif_get_flow_cookie(ctx->rule) : 0; + pin->up.packet_len = packet->size; + 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) + : OVS_BE64_MAX); - pin->send_len = len; - flow_get_metadata(&ctx->xin->flow, &pin->fmd); + 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); } @@ -2283,6 +2287,8 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len, struct flow *flow = &ctx->xin->flow; const struct ofpact *a; + /* dl_type already in the mask, not set below. */ + OFPACT_FOR_EACH (a, ofpacts, ofpacts_len) { struct ofpact_controller *controller; const struct ofpact_metadata *metadata; @@ -2349,40 +2355,54 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len, break; case OFPACT_SET_IPV4_SRC: - memset(&wc->masks.nw_src, 0xff, sizeof wc->masks.nw_src); if (flow->dl_type == htons(ETH_TYPE_IP)) { + memset(&wc->masks.nw_src, 0xff, sizeof wc->masks.nw_src); flow->nw_src = ofpact_get_SET_IPV4_SRC(a)->ipv4; } break; case OFPACT_SET_IPV4_DST: - memset(&wc->masks.nw_dst, 0xff, sizeof wc->masks.nw_dst); if (flow->dl_type == htons(ETH_TYPE_IP)) { + memset(&wc->masks.nw_dst, 0xff, sizeof wc->masks.nw_dst); flow->nw_dst = ofpact_get_SET_IPV4_DST(a)->ipv4; } break; - case OFPACT_SET_IPV4_DSCP: - wc->masks.nw_tos |= IP_DSCP_MASK; - /* 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; case OFPACT_SET_L4_SRC_PORT: - memset(&wc->masks.nw_proto, 0xff, sizeof wc->masks.nw_proto); - memset(&wc->masks.tp_src, 0xff, sizeof wc->masks.tp_src); if (is_ip_any(flow)) { + memset(&wc->masks.nw_proto, 0xff, sizeof wc->masks.nw_proto); + memset(&wc->masks.tp_src, 0xff, sizeof wc->masks.tp_src); flow->tp_src = htons(ofpact_get_SET_L4_SRC_PORT(a)->port); } break; case OFPACT_SET_L4_DST_PORT: - memset(&wc->masks.nw_proto, 0xff, sizeof wc->masks.nw_proto); - memset(&wc->masks.tp_dst, 0xff, sizeof wc->masks.tp_dst); if (is_ip_any(flow)) { + memset(&wc->masks.nw_proto, 0xff, sizeof wc->masks.nw_proto); + memset(&wc->masks.tp_dst, 0xff, sizeof wc->masks.tp_dst); flow->tp_dst = htons(ofpact_get_SET_L4_DST_PORT(a)->port); } break; @@ -2408,7 +2428,7 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len, break; case OFPACT_REG_LOAD: - nxm_execute_reg_load(ofpact_get_REG_LOAD(a), flow); + nxm_execute_reg_load(ofpact_get_REG_LOAD(a), flow, wc); break; case OFPACT_STACK_PUSH: @@ -2774,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;