X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=ofproto%2Fofproto.c;h=00fb9b5506e2a0ff2ff9ed0a8753774717caee34;hb=fb892732bac6787c6fb943554f8000e26477dd85;hp=14a425db2999b056f5a2dc291aadea41699bc5c4;hpb=8abc4ed712a755b0454e41cccad3ad33fa167f15;p=openvswitch diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c index 14a425db..00fb9b55 100644 --- a/ofproto/ofproto.c +++ b/ofproto/ofproto.c @@ -83,6 +83,8 @@ static int xlate_actions(const union ofp_action *in, size_t n_in, struct rule { struct cls_rule cr; + uint64_t flow_cookie; /* Controller-issued identifier. + (Kept in network-byte order.) */ uint16_t idle_timeout; /* In seconds from time of last use. */ uint16_t hard_timeout; /* In seconds from time of creation. */ bool send_flow_removed; /* Send a flow removed message? */ @@ -144,7 +146,7 @@ rule_is_hidden(const struct rule *rule) static struct rule *rule_create(struct ofproto *, struct rule *super, const union ofp_action *, size_t n_actions, uint16_t idle_timeout, uint16_t hard_timeout, - bool send_flow_removed); + uint64_t flow_cookie, bool send_flow_removed); static void rule_free(struct rule *); static void rule_destroy(struct ofproto *, struct rule *); static struct rule *rule_from_cls_rule(const struct cls_rule *); @@ -992,7 +994,7 @@ ofproto_add_flow(struct ofproto *p, struct rule *rule; rule = rule_create(p, NULL, actions, n_actions, idle_timeout >= 0 ? idle_timeout : 5 /* XXX */, - 0, false); + 0, 0, false); cls_rule_from_flow(&rule->cr, flow, wildcards, priority); rule_insert(p, rule, NULL, 0); } @@ -1404,11 +1406,12 @@ static struct rule * rule_create(struct ofproto *ofproto, struct rule *super, const union ofp_action *actions, size_t n_actions, uint16_t idle_timeout, uint16_t hard_timeout, - bool send_flow_removed) + uint64_t flow_cookie, bool send_flow_removed) { struct rule *rule = xzalloc(sizeof *rule); rule->idle_timeout = idle_timeout; rule->hard_timeout = hard_timeout; + rule->flow_cookie = flow_cookie; rule->used = rule->created = time_msec(); rule->send_flow_removed = send_flow_removed; rule->super = super; @@ -1571,7 +1574,7 @@ rule_create_subrule(struct ofproto *ofproto, struct rule *rule, { struct rule *subrule = rule_create(ofproto, rule, NULL, 0, rule->idle_timeout, rule->hard_timeout, - false); + 0, false); COVERAGE_INC(ofproto_subrule_create); cls_rule_from_flow(&subrule->cr, flow, 0, (rule->cr.priority <= UINT16_MAX ? UINT16_MAX @@ -1857,7 +1860,8 @@ handle_features_request(struct ofproto *p, struct ofconn *ofconn, osf->n_buffers = htonl(pktbuf_capacity()); osf->n_tables = 2; osf->capabilities = htonl(OFPC_FLOW_STATS | OFPC_TABLE_STATS | - OFPC_PORT_STATS | OFPC_MULTI_PHY_TX); + OFPC_PORT_STATS | OFPC_MULTI_PHY_TX | + OFPC_ARP_MATCH_IP); osf->actions = htonl((1u << OFPAT_OUTPUT) | (1u << OFPAT_SET_VLAN_VID) | (1u << OFPAT_SET_VLAN_PCP) | @@ -2565,10 +2569,11 @@ flow_stats_cb(struct cls_rule *rule_, void *cbdata_) ofs->pad = 0; flow_to_match(&rule->cr.flow, rule->cr.wc.wildcards, &ofs->match); ofs->duration = htonl((time_msec() - rule->created) / 1000); + ofs->cookie = rule->flow_cookie; ofs->priority = htons(rule->cr.priority); ofs->idle_timeout = htons(rule->idle_timeout); ofs->hard_timeout = htons(rule->hard_timeout); - ofs->pad2 = 0; + memset(ofs->pad2, 0, sizeof ofs->pad2); ofs->packet_count = htonll(packet_count); ofs->byte_count = htonll(byte_count); memcpy(ofs->actions, rule->actions, act_len); @@ -2631,7 +2636,7 @@ flow_stats_ds_cb(struct cls_rule *rule_, void *cbdata_) } query_stats(cbdata->ofproto, rule, &packet_count, &byte_count); - flow_to_ovs_match(&rule->cr.flow, rule->cr.wc.wildcards, &match); + flow_to_match(&rule->cr.flow, rule->cr.wc.wildcards, &match); ds_put_format(results, "duration=%llds, ", (time_msec() - rule->created) / 1000); @@ -2819,7 +2824,7 @@ add_flow(struct ofproto *p, struct ofconn *ofconn, rule = rule_create(p, NULL, (const union ofp_action *) ofm->actions, n_actions, ntohs(ofm->idle_timeout), - ntohs(ofm->hard_timeout), + ntohs(ofm->hard_timeout), ofm->cookie, ofm->flags & htons(OFPFF_SEND_FLOW_REM)); cls_rule_from_match(&rule->cr, &ofm->match, ntohs(ofm->priority)); @@ -2861,6 +2866,7 @@ modify_flow(struct ofproto *p, const struct ofp_flow_mod *ofm, free(rule->actions); rule->actions = xmemdup(ofm->actions, actions_len); rule->n_actions = n_actions; + rule->flow_cookie = ofm->cookie; if (rule->cr.wc.wildcards) { COVERAGE_INC(ofproto_mod_wc_flow); @@ -3260,6 +3266,7 @@ compose_flow_removed(const struct rule *rule, long long int now, uint8_t reason) ofr = make_openflow(sizeof *ofr, OFPT_FLOW_REMOVED, &buf); flow_to_match(&rule->cr.flow, rule->cr.wc.wildcards, &ofr->match); + ofr->cookie = rule->flow_cookie; ofr->priority = htons(rule->cr.priority); ofr->reason = reason; ofr->duration = htonl((now - rule->created) / 1000);