diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/automake.mk | 2 | ||||
-rw-r--r-- | lib/ofp-util.c | 80 | ||||
-rw-r--r-- | lib/pktbuf.c | 220 | ||||
-rw-r--r-- | lib/pktbuf.h | 40 |
4 files changed, 24 insertions, 318 deletions
diff --git a/lib/automake.mk b/lib/automake.mk index 165e6a8bd..b00e90f5d 100644 --- a/lib/automake.mk +++ b/lib/automake.mk @@ -201,8 +201,6 @@ lib_libopenvswitch_la_SOURCES = \ lib/pcap-file.h \ lib/perf-counter.h \ lib/perf-counter.c \ - lib/pktbuf.c \ - lib/pktbuf.h \ lib/poll-loop.c \ lib/poll-loop.h \ lib/process.c \ diff --git a/lib/ofp-util.c b/lib/ofp-util.c index ccb06fe6b..1fa499841 100644 --- a/lib/ofp-util.c +++ b/lib/ofp-util.c @@ -45,7 +45,6 @@ #include "openvswitch/vlog.h" #include "openflow/intel-ext.h" #include "packets.h" -#include "pktbuf.h" #include "random.h" #include "tun-metadata.h" #include "unaligned.h" @@ -3588,17 +3587,14 @@ encode_packet_in_reason(enum ofp_packet_in_reason reason, * function omits it. The caller can add it itself if desired. */ static void ofputil_put_packet_in(const struct ofputil_packet_in *pin, - enum ofp_version version, uint32_t buffer_id, - size_t include_bytes, struct ofpbuf *msg) + enum ofp_version version, size_t include_bytes, + struct ofpbuf *msg) { /* Add packet properties. */ ofpprop_put(msg, NXPINT_PACKET, pin->packet, include_bytes); if (include_bytes != pin->packet_len) { ofpprop_put_u32(msg, NXPINT_FULL_LEN, pin->packet_len); } - if (buffer_id != UINT32_MAX) { - ofpprop_put_u32(msg, NXPINT_BUFFER_ID, buffer_id); - } /* Add flow properties. */ ofpprop_put_u8(msg, NXPINT_TABLE_ID, pin->table_id); @@ -3642,11 +3638,10 @@ enum nx_continuation_prop_type { * function omits it. The caller can add it itself if desired. */ static void ofputil_put_packet_in_private(const struct ofputil_packet_in_private *pin, - enum ofp_version version, uint32_t buffer_id, - size_t include_bytes, struct ofpbuf *msg) + enum ofp_version version, size_t include_bytes, + struct ofpbuf *msg) { - ofputil_put_packet_in(&pin->public, version, buffer_id, - include_bytes, msg); + ofputil_put_packet_in(&pin->public, version, include_bytes, msg); size_t continuation_ofs = ofpprop_start_nested(msg, NXPINT_CONTINUATION); size_t inner_ofs = msg->size; @@ -3734,8 +3729,7 @@ ofputil_put_packet_in_private(const struct ofputil_packet_in_private *pin, } static struct ofpbuf * -ofputil_encode_ofp10_packet_in(const struct ofputil_packet_in *pin, - uint32_t buffer_id) +ofputil_encode_ofp10_packet_in(const struct ofputil_packet_in *pin) { struct ofp10_packet_in *opi; struct ofpbuf *msg; @@ -3746,14 +3740,14 @@ ofputil_encode_ofp10_packet_in(const struct ofputil_packet_in *pin, opi->total_len = htons(pin->packet_len); opi->in_port = htons(ofp_to_u16(pin->flow_metadata.flow.in_port.ofp_port)); opi->reason = encode_packet_in_reason(pin->reason, OFP10_VERSION); - opi->buffer_id = htonl(buffer_id); + opi->buffer_id = htonl(UINT32_MAX); return msg; } static struct ofpbuf * ofputil_encode_nx_packet_in(const struct ofputil_packet_in *pin, - enum ofp_version version, uint32_t buffer_id) + enum ofp_version version) { struct nx_packet_in *npi; struct ofpbuf *msg; @@ -3767,7 +3761,7 @@ ofputil_encode_nx_packet_in(const struct ofputil_packet_in *pin, ofpbuf_put_zeros(msg, 2); npi = msg->msg; - npi->buffer_id = htonl(buffer_id); + npi->buffer_id = htonl(UINT32_MAX); npi->total_len = htons(pin->packet_len); npi->reason = encode_packet_in_reason(pin->reason, version); npi->table_id = pin->table_id; @@ -3779,8 +3773,7 @@ ofputil_encode_nx_packet_in(const struct ofputil_packet_in *pin, static struct ofpbuf * ofputil_encode_nx_packet_in2(const struct ofputil_packet_in_private *pin, - enum ofp_version version, uint32_t buffer_id, - size_t include_bytes) + enum ofp_version version, size_t include_bytes) { /* 'extra' is just an estimate of the space required. */ size_t extra = (pin->public.packet_len @@ -3792,7 +3785,7 @@ ofputil_encode_nx_packet_in2(const struct ofputil_packet_in_private *pin, struct ofpbuf *msg = ofpraw_alloc_xid(OFPRAW_NXT_PACKET_IN2, version, htonl(0), extra); - ofputil_put_packet_in_private(pin, version, buffer_id, include_bytes, msg); + ofputil_put_packet_in_private(pin, version, include_bytes, msg); if (pin->public.userdata_len) { ofpprop_put(msg, NXPINT_USERDATA, pin->public.userdata, pin->public.userdata_len); @@ -3803,8 +3796,7 @@ ofputil_encode_nx_packet_in2(const struct ofputil_packet_in_private *pin, } static struct ofpbuf * -ofputil_encode_ofp11_packet_in(const struct ofputil_packet_in *pin, - uint32_t buffer_id) +ofputil_encode_ofp11_packet_in(const struct ofputil_packet_in *pin) { struct ofp11_packet_in *opi; struct ofpbuf *msg; @@ -3812,7 +3804,7 @@ ofputil_encode_ofp11_packet_in(const struct ofputil_packet_in *pin, msg = ofpraw_alloc_xid(OFPRAW_OFPT11_PACKET_IN, OFP11_VERSION, htonl(0), pin->packet_len); opi = ofpbuf_put_zeros(msg, sizeof *opi); - opi->buffer_id = htonl(buffer_id); + opi->buffer_id = htonl(UINT32_MAX); opi->in_port = ofputil_port_to_ofp11( pin->flow_metadata.flow.in_port.ofp_port); opi->in_phy_port = opi->in_port; @@ -3825,8 +3817,7 @@ ofputil_encode_ofp11_packet_in(const struct ofputil_packet_in *pin, static struct ofpbuf * ofputil_encode_ofp12_packet_in(const struct ofputil_packet_in *pin, - enum ofp_version version, - uint32_t buffer_id) + enum ofp_version version) { enum ofpraw raw = (version >= OFP13_VERSION ? OFPRAW_OFPT13_PACKET_IN @@ -3838,7 +3829,7 @@ ofputil_encode_ofp12_packet_in(const struct ofputil_packet_in *pin, htonl(0), NXM_TYPICAL_LEN + 2 + pin->packet_len); struct ofp12_packet_in *opi = ofpbuf_put_zeros(msg, sizeof *opi); - opi->buffer_id = htonl(buffer_id); + opi->buffer_id = htonl(UINT32_MAX); opi->total_len = htons(pin->packet_len); opi->reason = encode_packet_in_reason(pin->reason, version); opi->table_id = pin->table_id; @@ -3857,11 +3848,6 @@ ofputil_encode_ofp12_packet_in(const struct ofputil_packet_in *pin, /* Converts abstract ofputil_packet_in_private 'pin' into a PACKET_IN message * for 'protocol', using the packet-in format specified by 'packet_in_format'. * - * If 'pkt_buf' is nonnull and 'max_len' allows the packet to be buffered, this - * function will attempt to obtain a buffer ID from 'pktbuf' and truncate the - * packet to 'max_len' bytes. Otherwise, or if 'pktbuf' doesn't have a free - * buffer, it will send the whole packet without buffering. - * * This function is really meant only for use by ovs-vswitchd. To any other * code, the "continuation" data, i.e. the data that is in struct * ofputil_packet_in_private but not in struct ofputil_packet_in, is supposed @@ -3873,28 +3859,10 @@ ofputil_encode_ofp12_packet_in(const struct ofputil_packet_in *pin, struct ofpbuf * ofputil_encode_packet_in_private(const struct ofputil_packet_in_private *pin, enum ofputil_protocol protocol, - enum nx_packet_in_format packet_in_format, - uint16_t max_len, struct pktbuf *pktbuf) + enum nx_packet_in_format packet_in_format) { enum ofp_version version = ofputil_protocol_to_ofp_version(protocol); - /* Get buffer ID. */ - ofp_port_t in_port = pin->public.flow_metadata.flow.in_port.ofp_port; - uint32_t buffer_id = (max_len != OFPCML12_NO_BUFFER && pktbuf - ? pktbuf_save(pktbuf, pin->public.packet, - pin->public.packet_len, in_port) - : UINT32_MAX); - - /* Calculate the number of bytes of the packet to include in the - * packet-in: - * - * - If not buffered, the whole thing. - * - * - Otherwise, no more than 'max_len' bytes. */ - size_t include_bytes = (buffer_id == UINT32_MAX - ? pin->public.packet_len - : MIN(max_len, pin->public.packet_len)); - struct ofpbuf *msg; switch (packet_in_format) { case NXPIF_STANDARD: @@ -3903,11 +3871,11 @@ ofputil_encode_packet_in_private(const struct ofputil_packet_in_private *pin, case OFPUTIL_P_OF10_STD_TID: case OFPUTIL_P_OF10_NXM: case OFPUTIL_P_OF10_NXM_TID: - msg = ofputil_encode_ofp10_packet_in(&pin->public, buffer_id); + msg = ofputil_encode_ofp10_packet_in(&pin->public); break; case OFPUTIL_P_OF11_STD: - msg = ofputil_encode_ofp11_packet_in(&pin->public, buffer_id); + msg = ofputil_encode_ofp11_packet_in(&pin->public); break; case OFPUTIL_P_OF12_OXM: @@ -3915,7 +3883,7 @@ ofputil_encode_packet_in_private(const struct ofputil_packet_in_private *pin, case OFPUTIL_P_OF14_OXM: case OFPUTIL_P_OF15_OXM: case OFPUTIL_P_OF16_OXM: - msg = ofputil_encode_ofp12_packet_in(&pin->public, version, buffer_id); + msg = ofputil_encode_ofp12_packet_in(&pin->public, version); break; default: @@ -3924,18 +3892,18 @@ ofputil_encode_packet_in_private(const struct ofputil_packet_in_private *pin, break; case NXPIF_NXT_PACKET_IN: - msg = ofputil_encode_nx_packet_in(&pin->public, version, buffer_id); + msg = ofputil_encode_nx_packet_in(&pin->public, version); break; case NXPIF_NXT_PACKET_IN2: - return ofputil_encode_nx_packet_in2(pin, version, buffer_id, - include_bytes); + return ofputil_encode_nx_packet_in2(pin, version, + pin->public.packet_len); default: OVS_NOT_REACHED(); } - ofpbuf_put(msg, pin->public.packet, include_bytes); + ofpbuf_put(msg, pin->public.packet, pin->public.packet_len); ofpmsg_update_length(msg); return msg; } @@ -4004,7 +3972,7 @@ ofputil_encode_resume(const struct ofputil_packet_in *pin, size_t extra = pin->packet_len + NXM_TYPICAL_LEN + continuation->size; struct ofpbuf *msg = ofpraw_alloc_xid(OFPRAW_NXT_RESUME, version, 0, extra); - ofputil_put_packet_in(pin, version, UINT32_MAX, pin->packet_len, msg); + ofputil_put_packet_in(pin, version, pin->packet_len, msg); ofpprop_put_nested(msg, NXPINT_CONTINUATION, continuation); ofpmsg_update_length(msg); return msg; diff --git a/lib/pktbuf.c b/lib/pktbuf.c deleted file mode 100644 index e2c61fd4d..000000000 --- a/lib/pktbuf.c +++ /dev/null @@ -1,220 +0,0 @@ -/* - * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2016 Nicira, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <config.h> -#include "pktbuf.h" -#include <inttypes.h> -#include <stdlib.h> -#include "coverage.h" -#include "openvswitch/ofp-util.h" -#include "dp-packet.h" -#include "timeval.h" -#include "util.h" -#include "openvswitch/vconn.h" -#include "openvswitch/vlog.h" - -VLOG_DEFINE_THIS_MODULE(pktbuf); - -COVERAGE_DEFINE(pktbuf_buffer_unknown); -COVERAGE_DEFINE(pktbuf_retrieved); -COVERAGE_DEFINE(pktbuf_reuse_error); - -/* Buffers are identified by a 32-bit opaque ID. We divide the ID - * into a buffer number (low bits) and a cookie (high bits). The buffer number - * is an index into an array of buffers. The cookie distinguishes between - * different packets that have occupied a single buffer. Thus, the more - * buffers we have, the lower-quality the cookie... */ -#define PKTBUF_BITS 8 -#define PKTBUF_MASK (PKTBUF_CNT - 1) -#define PKTBUF_CNT (1u << PKTBUF_BITS) - -#define COOKIE_BITS (32 - PKTBUF_BITS) -#define COOKIE_MAX ((1u << COOKIE_BITS) - 1) - -#define OVERWRITE_MSECS 5000 - -struct packet { - struct dp_packet *buffer; - uint32_t cookie; - long long int timeout; - ofp_port_t in_port; -}; - -struct pktbuf { - struct packet packets[PKTBUF_CNT]; - unsigned int buffer_idx; - unsigned int null_idx; -}; - -int -pktbuf_capacity(void) -{ - return PKTBUF_CNT; -} - -struct pktbuf * -pktbuf_create(void) -{ - return xzalloc(sizeof *pktbuf_create()); -} - -void -pktbuf_destroy(struct pktbuf *pb) -{ - if (pb) { - size_t i; - - for (i = 0; i < PKTBUF_CNT; i++) { - dp_packet_delete(pb->packets[i].buffer); - } - free(pb); - } -} - -static unsigned int -make_id(unsigned int buffer_idx, unsigned int cookie) -{ - return buffer_idx | (cookie << PKTBUF_BITS); -} - -/* Attempts to allocate an OpenFlow packet buffer id within 'pb'. The packet - * buffer will store a copy of 'buffer_size' bytes in 'buffer' and the port - * number 'in_port', which should be the OpenFlow port number on which 'buffer' - * was received. - * - * If successful, returns the packet buffer id (a number other than - * UINT32_MAX). pktbuf_retrieve() can later be used to retrieve the buffer and - * its input port number (buffers do expire after a time, so this is not - * guaranteed to be true forever). On failure, returns UINT32_MAX. - * - * The caller retains ownership of 'buffer'. */ -uint32_t -pktbuf_save(struct pktbuf *pb, const void *buffer, size_t buffer_size, - ofp_port_t in_port) -{ - struct packet *p = &pb->packets[pb->buffer_idx]; - pb->buffer_idx = (pb->buffer_idx + 1) & PKTBUF_MASK; - if (p->buffer) { - if (time_msec() < p->timeout) { - return UINT32_MAX; - } - dp_packet_delete(p->buffer); - } - - /* Don't use maximum cookie value since all-1-bits ID is special. */ - if (++p->cookie >= COOKIE_MAX) { - p->cookie = 0; - } - - /* Use 2 bytes of headroom to 32-bit align the L3 header. */ - p->buffer = dp_packet_clone_data_with_headroom(buffer, buffer_size, 2); - - p->timeout = time_msec() + OVERWRITE_MSECS; - p->in_port = in_port; - return make_id(p - pb->packets, p->cookie); -} - -/* Attempts to retrieve a saved packet with the given 'id' from 'pb'. Returns - * 0 if successful, otherwise an OpenFlow error code. - * - * On success, stores the buffered packet in '*bufferp' and the OpenFlow port - * number on which the packet was received in '*in_port'. The caller becomes - * responsible for freeing the buffer. - * - * 'in_port' may be NULL if the input port is not of interest. - * - * The L3 header of a returned packet will be 32-bit aligned. - * - * On failure, stores NULL in in '*bufferp' and UINT16_MAX in '*in_port'. */ -enum ofperr -pktbuf_retrieve(struct pktbuf *pb, uint32_t id, struct dp_packet **bufferp, - ofp_port_t *in_port) -{ - static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 20); - struct packet *p; - enum ofperr error; - - if (id == UINT32_MAX) { - error = 0; - goto error; - } - - if (!pb) { - VLOG_WARN_RL(&rl, "attempt to send buffered packet via connection " - "without buffers"); - error = OFPERR_OFPBRC_BUFFER_UNKNOWN; - goto error; - } - - p = &pb->packets[id & PKTBUF_MASK]; - if (p->cookie == id >> PKTBUF_BITS) { - struct dp_packet *buffer = p->buffer; - if (buffer) { - *bufferp = buffer; - if (in_port) { - *in_port = p->in_port; - } - p->buffer = NULL; - COVERAGE_INC(pktbuf_retrieved); - return 0; - } else { - COVERAGE_INC(pktbuf_reuse_error); - VLOG_WARN_RL(&rl, "attempt to reuse buffer %08"PRIx32, id); - error = OFPERR_OFPBRC_BUFFER_EMPTY; - } - } else { - COVERAGE_INC(pktbuf_buffer_unknown); - VLOG_WARN_RL(&rl, "cookie mismatch: %08"PRIx32" != %08"PRIx32, - id, (id & PKTBUF_MASK) | (p->cookie << PKTBUF_BITS)); - error = OFPERR_OFPBRC_BUFFER_UNKNOWN; - } -error: - *bufferp = NULL; - if (in_port) { - *in_port = OFPP_NONE; - } - return error; -} - -void -pktbuf_discard(struct pktbuf *pb, uint32_t id) -{ - struct packet *p = &pb->packets[id & PKTBUF_MASK]; - if (p->cookie == id >> PKTBUF_BITS) { - dp_packet_delete(p->buffer); - p->buffer = NULL; - } -} - -/* Returns the number of packets buffered in 'pb'. Returns 0 if 'pb' is - * null. */ -unsigned int -pktbuf_count_packets(const struct pktbuf *pb) -{ - int n = 0; - - if (pb) { - int i; - - for (i = 0; i < PKTBUF_CNT; i++) { - if (pb->packets[i].buffer) { - n++; - } - } - } - - return n; -} diff --git a/lib/pktbuf.h b/lib/pktbuf.h deleted file mode 100644 index ccbaed779..000000000 --- a/lib/pktbuf.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2008, 2009, 2011, 2012, 2016 Nicira, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef PKTBUF_H -#define PKTBUF_H 1 - -#include <stddef.h> -#include <stdint.h> - -#include "openvswitch/ofp-errors.h" - -struct pktbuf; -struct dp_packet; - -int pktbuf_capacity(void); - -struct pktbuf *pktbuf_create(void); -void pktbuf_destroy(struct pktbuf *); -uint32_t pktbuf_save(struct pktbuf *, const void *buffer, size_t buffer_size, - ofp_port_t in_port); -enum ofperr pktbuf_retrieve(struct pktbuf *, uint32_t id, - struct dp_packet **bufferp, ofp_port_t *in_port); -void pktbuf_discard(struct pktbuf *, uint32_t id); - -unsigned int pktbuf_count_packets(const struct pktbuf *); - -#endif /* pktbuf.h */ |