X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fvconn.c;h=288a095815a4f11ec453b80eb86d0de4957caeb6;hb=8b2a2f4a793ec5ba735510c315a9d619439ac83c;hp=b5e110204eef1d64d925bb79731237601038f759;hpb=2b35e1475ef0c274495aa04d60b054288971d503;p=openvswitch diff --git a/lib/vconn.c b/lib/vconn.c index b5e11020..288a0958 100644 --- a/lib/vconn.c +++ b/lib/vconn.c @@ -928,6 +928,28 @@ make_add_simple_flow(const flow_t *flow, return buffer; } +struct ofpbuf * +make_packet_in(uint32_t buffer_id, uint16_t in_port, uint8_t reason, + const struct ofpbuf *payload, int max_send_len) +{ + struct ofp_packet_in *opi; + struct ofpbuf *buf; + int send_len; + + send_len = MIN(max_send_len, payload->size); + buf = ofpbuf_new(sizeof *opi + send_len); + opi = put_openflow_xid(offsetof(struct ofp_packet_in, data), + OFPT_PACKET_IN, 0, buf); + opi->buffer_id = htonl(buffer_id); + opi->total_len = htons(payload->size); + opi->in_port = htons(in_port); + opi->reason = reason; + ofpbuf_put(buf, payload->data, send_len); + update_openflow_length(buf); + + return buf; +} + struct ofpbuf * make_packet_out(const struct ofpbuf *packet, uint32_t buffer_id, uint16_t in_port, @@ -1037,7 +1059,7 @@ check_ofp_message(const struct ofp_header *msg, uint8_t type, size_t size) if (got_size != size) { char *type_name = ofp_message_type_to_string(type); VLOG_WARN_RL(&bad_ofmsg_rl, - "received %s message of length %"PRIu16" (expected %zu)", + "received %s message of length %zu (expected %zu)", type_name, got_size, size); free(type_name); return ofp_mkerr(OFPET_BAD_REQUEST, OFPBRC_BAD_LENGTH); @@ -1072,7 +1094,7 @@ check_ofp_message_array(const struct ofp_header *msg, uint8_t type, got_size = ntohs(msg->length); if (got_size < min_size) { char *type_name = ofp_message_type_to_string(type); - VLOG_WARN_RL(&bad_ofmsg_rl, "received %s message of length %"PRIu16" " + VLOG_WARN_RL(&bad_ofmsg_rl, "received %s message of length %zu " "(expected at least %zu)", type_name, got_size, min_size); free(type_name); @@ -1081,7 +1103,7 @@ check_ofp_message_array(const struct ofp_header *msg, uint8_t type, if ((got_size - min_size) % array_elt_size) { char *type_name = ofp_message_type_to_string(type); VLOG_WARN_RL(&bad_ofmsg_rl, - "received %s message of bad length %"PRIu16": the " + "received %s message of bad length %zu: the " "excess over %zu (%zu) is not evenly divisible by %zu " "(remainder is %zu)", type_name, got_size, min_size, got_size - min_size, @@ -1114,13 +1136,13 @@ check_ofp_packet_out(const struct ofp_header *oh, struct ofpbuf *data, actions_len = ntohs(opo->actions_len); if (actions_len > extra) { - VLOG_WARN_RL(&bad_ofmsg_rl, "packet-out claims %zu bytes of actions " + VLOG_WARN_RL(&bad_ofmsg_rl, "packet-out claims %u bytes of actions " "but message has room for only %zu bytes", actions_len, extra); return ofp_mkerr(OFPET_BAD_REQUEST, OFPBRC_BAD_LENGTH); } if (actions_len % sizeof(union ofp_action)) { - VLOG_WARN_RL(&bad_ofmsg_rl, "packet-out claims %zu bytes of actions, " + VLOG_WARN_RL(&bad_ofmsg_rl, "packet-out claims %u bytes of actions, " "which is not a multiple of %zu", actions_len, sizeof(union ofp_action)); return ofp_mkerr(OFPET_BAD_REQUEST, OFPBRC_BAD_LENGTH); @@ -1247,7 +1269,7 @@ check_action(const union ofp_action *a, unsigned int len, int max_ports) { int error; - switch (a->type) { + switch (ntohs(a->type)) { case OFPAT_OUTPUT: error = check_action_port(ntohs(a->output.port), max_ports); if (error) { @@ -1307,7 +1329,7 @@ validate_actions(const union ofp_action *actions, size_t n_actions, if (n_slots > slots_left) { VLOG_DBG_RL(&bad_ofmsg_rl, - "action requires %u slots but only %td remain", + "action requires %u slots but only %u remain", n_slots, slots_left); return ofp_mkerr(OFPET_BAD_ACTION, OFPBAC_BAD_LEN); }