X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=ofproto%2Fofproto.c;h=69639ac942dd14d5ab74ba3c6c8e78d6bbc2c81e;hb=e2bd05933f2c813e1cce42b8fe0db6230dffb13c;hp=ebdbc682f11296ff76d032f15dac8a3b21781530;hpb=81e2083fe6b7c16055f01c4b1e40f25867594bf6;p=openvswitch diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c index ebdbc682..69639ac9 100644 --- a/ofproto/ofproto.c +++ b/ofproto/ofproto.c @@ -24,6 +24,7 @@ #include #include #include +#include "autopath.h" #include "byte-order.h" #include "cfm.h" #include "classifier.h" @@ -325,6 +326,7 @@ static const struct ofhooks default_ofhooks; static uint64_t pick_datapath_id(const struct ofproto *); static uint64_t pick_fallback_dpid(void); +static void ofproto_flush_flows__(struct ofproto *); static int ofproto_expire(struct ofproto *); static void flow_push_stats(struct ofproto *, const struct rule *, struct flow *, uint64_t packets, uint64_t bytes, @@ -690,7 +692,7 @@ ofproto_destroy(struct ofproto *p) shash_find_and_delete(&all_ofprotos, dpif_name(p->dpif)); - ofproto_flush_flows(p); + ofproto_flush_flows__(p); connmgr_destroy(p->connmgr); classifier_destroy(&p->cls); hmap_destroy(&p->facets); @@ -999,8 +1001,8 @@ ofproto_delete_flow(struct ofproto *ofproto, const struct cls_rule *target) } } -void -ofproto_flush_flows(struct ofproto *ofproto) +static void +ofproto_flush_flows__(struct ofproto *ofproto) { struct facet *facet, *next_facet; struct rule *rule, *next_rule; @@ -1025,6 +1027,12 @@ ofproto_flush_flows(struct ofproto *ofproto) } dpif_flow_flush(ofproto->dpif); +} + +void +ofproto_flush_flows(struct ofproto *ofproto) +{ + ofproto_flush_flows__(ofproto); connmgr_flushed(ofproto->connmgr); } @@ -1164,8 +1172,8 @@ ofport_run(struct ofproto *ofproto, struct ofport *ofport) struct ccm *ccm; ofpbuf_init(&packet, 0); - ccm = compose_packet(&packet, eth_addr_ccm, ofport->opp.hw_addr, - ETH_TYPE_CFM, sizeof *ccm); + ccm = eth_compose(&packet, eth_addr_ccm, ofport->opp.hw_addr, + ETH_TYPE_CFM, sizeof *ccm); cfm_compose_ccm(ofport->cfm, ccm); ofproto_send_packet(ofproto, ofport->odp_port, 0, &packet); ofpbuf_uninit(&packet); @@ -2222,8 +2230,11 @@ xlate_nicira_action(struct action_xlate_ctx *ctx, const struct nx_action_set_tunnel *nast; const struct nx_action_set_queue *nasq; const struct nx_action_multipath *nam; + const struct nx_action_autopath *naa; enum nx_action_subtype subtype = ntohs(nah->subtype); + const struct ofhooks *ofhooks = ctx->ofproto->ofhooks; struct xlate_reg_state state; + uint16_t autopath_port; ovs_be64 tun_id; assert(nah->vendor == htonl(NX_VENDOR_ID)); @@ -2285,6 +2296,15 @@ xlate_nicira_action(struct action_xlate_ctx *ctx, multipath_execute(nam, &ctx->flow); break; + case NXAST_AUTOPATH: + naa = (const struct nx_action_autopath *) nah; + autopath_port = (ofhooks->autopath_cb + ? ofhooks->autopath_cb(&ctx->flow, ntohl(naa->id), + &ctx->tags, ctx->ofproto->aux) + : OFPP_NONE); + autopath_execute(naa, &ctx->flow, autopath_port); + break; + /* If you add a new action here that modifies flow data, don't forget to * update the flow key in ctx->flow at the same time. */ @@ -4415,5 +4435,6 @@ static const struct ofhooks default_ofhooks = { default_normal_ofhook_cb, NULL, NULL, + NULL, NULL };