X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fstream-fd.c;h=8062d2deab1f77f7ebf4c84023a4966aa92a5247;hb=5de43a606c949dbb74272d5b09627ddd5f64b06b;hp=6b782ec295c55ffce636721c219d2a299c4b7844;hpb=e368cad8ecf6dbf272b2a3775b2e3e5e2dc6a5cf;p=sliver-openvswitch.git diff --git a/lib/stream-fd.c b/lib/stream-fd.c index 6b782ec29..8062d2dea 100644 --- a/lib/stream-fd.c +++ b/lib/stream-fd.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, 2010, 2012 Nicira, Inc. + * Copyright (c) 2008, 2009, 2010, 2012, 2013, 2014 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,7 +16,6 @@ #include #include "stream-fd.h" -#include #include #include #include @@ -25,10 +24,8 @@ #include #include #include "fatal-signal.h" -#include "leak-checker.h" #include "poll-loop.h" #include "socket-util.h" -#include "stress.h" #include "util.h" #include "stream-provider.h" #include "stream.h" @@ -91,38 +88,22 @@ fd_connect(struct stream *stream) return check_connection_completion(s->fd); } -STRESS_OPTION( - stream_flaky_recv, "simulate failure of fd stream recvs", - 100, 0, -1, 0); - static ssize_t fd_recv(struct stream *stream, void *buffer, size_t n) { struct stream_fd *s = stream_fd_cast(stream); ssize_t retval; - if (STRESS(stream_flaky_recv)) { - return -EIO; - } - retval = read(s->fd, buffer, n); return retval >= 0 ? retval : -errno; } -STRESS_OPTION( - stream_flaky_send, "simulate failure of fd stream sends", - 100, 0, -1, 0); - static ssize_t fd_send(struct stream *stream, const void *buffer, size_t n) { struct stream_fd *s = stream_fd_cast(stream); ssize_t retval; - if (STRESS(stream_flaky_send)) { - return -EIO; - } - retval = write(s->fd, buffer, n); return (retval > 0 ? retval : retval == 0 ? -EAGAIN @@ -144,7 +125,7 @@ fd_wait(struct stream *stream, enum stream_wait_type wait) break; default: - NOT_REACHED(); + OVS_NOT_REACHED(); } } @@ -167,12 +148,13 @@ struct fd_pstream { struct pstream pstream; int fd; - int (*accept_cb)(int fd, const struct sockaddr *, size_t sa_len, + int (*accept_cb)(int fd, const struct sockaddr_storage *, size_t ss_len, struct stream **); + int (*set_dscp_cb)(int fd, uint8_t dscp); char *unlink_path; }; -static struct pstream_class fd_pstream_class; +static const struct pstream_class fd_pstream_class; static struct fd_pstream * fd_pstream_cast(struct pstream *pstream) @@ -197,14 +179,16 @@ fd_pstream_cast(struct pstream *pstream) * implementation never fails.) */ int new_fd_pstream(const char *name, int fd, - int (*accept_cb)(int fd, const struct sockaddr *sa, - size_t sa_len, struct stream **streamp), + int (*accept_cb)(int fd, const struct sockaddr_storage *ss, + size_t ss_len, struct stream **streamp), + int (*set_dscp_cb)(int fd, uint8_t dscp), char *unlink_path, struct pstream **pstreamp) { struct fd_pstream *ps = xmalloc(sizeof *ps); pstream_init(&ps->pstream, &fd_pstream_class, name); ps->fd = fd; ps->accept_cb = accept_cb; + ps->set_dscp_cb = set_dscp_cb; ps->unlink_path = unlink_path; *pstreamp = &ps->pstream; return 0; @@ -232,7 +216,7 @@ pfd_accept(struct pstream *pstream, struct stream **new_streamp) if (new_fd < 0) { retval = errno; if (retval != EAGAIN) { - VLOG_DBG_RL(&rl, "accept: %s", strerror(retval)); + VLOG_DBG_RL(&rl, "accept: %s", ovs_strerror(retval)); } return retval; } @@ -243,8 +227,7 @@ pfd_accept(struct pstream *pstream, struct stream **new_streamp) return retval; } - return ps->accept_cb(new_fd, (const struct sockaddr *) &ss, ss_len, - new_streamp); + return ps->accept_cb(new_fd, &ss, ss_len, new_streamp); } static void @@ -254,13 +237,24 @@ pfd_wait(struct pstream *pstream) poll_fd_wait(ps->fd, POLLIN); } -static struct pstream_class fd_pstream_class = { +static int +pfd_set_dscp(struct pstream *pstream, uint8_t dscp) +{ + struct fd_pstream *ps = fd_pstream_cast(pstream); + if (ps->set_dscp_cb) { + return ps->set_dscp_cb(ps->fd, dscp); + } + return 0; +} + +static const struct pstream_class fd_pstream_class = { "pstream", false, NULL, pfd_close, pfd_accept, - pfd_wait + pfd_wait, + pfd_set_dscp, }; /* Helper functions. */