From 394270a0e5bf42986f806c258591919eca2b473f Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Tue, 19 Aug 2008 13:57:17 -0700 Subject: [PATCH] New header for saturating arithmetic. --- include/Makefile.am | 1 + include/sat-math.h | 63 +++++++++++++++++++++++++++++++++++++++++++++ lib/dhcp-client.c | 23 +---------------- lib/rconn.c | 23 +---------------- 4 files changed, 66 insertions(+), 44 deletions(-) create mode 100644 include/sat-math.h diff --git a/include/Makefile.am b/include/Makefile.am index 4f0a4656..5af741e7 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -26,6 +26,7 @@ noinst_HEADERS = \ queue.h \ random.h \ rconn.h \ + sat-math.h \ socket-util.h \ type-props.h \ timeval.h \ diff --git a/include/sat-math.h b/include/sat-math.h new file mode 100644 index 00000000..43dae48e --- /dev/null +++ b/include/sat-math.h @@ -0,0 +1,63 @@ +/* Copyright (c) 2008 The Board of Trustees of The Leland Stanford + * Junior University + * + * We are making the OpenFlow specification and associated documentation + * (Software) available for public use and benefit with the expectation + * that others will use, modify and enhance the Software and contribute + * those enhancements back to the community. However, since we would + * like to make the Software available for broadest use, with as few + * restrictions as possible permission is hereby granted, free of + * charge, to any person obtaining a copy of this Software to deal in + * the Software under the copyrights without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * The name and trademarks of copyright holder(s) may NOT be used in + * advertising or publicity pertaining to the Software or any + * derivatives without specific, written prior permission. + */ + +#ifndef SAT_MATH_H +#define SAT_MATH_H 1 + +#include +#include + +/* Saturating addition: overflow yields UINT_MAX. */ +static inline unsigned int +sat_add(unsigned int x, unsigned int y) +{ + return x + y >= x ? x + y : UINT_MAX; +} + +/* Saturating subtraction: underflow yields 0. */ +static inline unsigned int +sat_sub(unsigned int x, unsigned int y) +{ + return x >= y ? x - y : 0; +} + +/* Saturating multiplication: overflow yields UINT_MAX. */ +static inline unsigned int +sat_mul(unsigned int x, unsigned int y) +{ + return (!y ? 0 + : x <= UINT_MAX / y ? x * y + : UINT_MAX); +} + +#endif /* sat-math.h */ diff --git a/lib/dhcp-client.c b/lib/dhcp-client.c index 9df0c6c6..c05b6149 100644 --- a/lib/dhcp-client.c +++ b/lib/dhcp-client.c @@ -51,6 +51,7 @@ #include "netdev.h" #include "ofp-print.h" #include "poll-loop.h" +#include "sat-math.h" #include "timeval.h" #define THIS_MODULE VLM_dhcp_client @@ -140,9 +141,6 @@ static unsigned int calc_t2(unsigned int lease); static unsigned int calc_t1(unsigned int lease, unsigned int t2); static unsigned int clamp(unsigned int x, unsigned int min, unsigned int max); -static unsigned int sat_add(unsigned int x, unsigned int y); -static unsigned int sat_sub(unsigned int x, unsigned int y); -static unsigned int sat_mul(unsigned int x, unsigned int y); /* Creates a new DHCP client to configure the network device 'netdev_name' * (e.g. "eth0"). @@ -1013,25 +1011,6 @@ fuzz(unsigned int x, int max_fuzz) return fuzz >= 0 ? (y >= x ? y : UINT_MAX) : (y <= x ? y : 0); } -static unsigned int -sat_add(unsigned int x, unsigned int y) -{ - return x + y >= x ? x + y : UINT_MAX; -} - -static unsigned int -sat_sub(unsigned int x, unsigned int y) -{ - return x >= y ? x - y : 0; -} - -static unsigned int -sat_mul(unsigned int x, unsigned int y) -{ - assert(y); - return x <= UINT_MAX / y ? x * y : UINT_MAX; -} - static unsigned int clamp(unsigned int x, unsigned int min, unsigned int max) { diff --git a/lib/rconn.c b/lib/rconn.c index 6365a46b..ee995e49 100644 --- a/lib/rconn.c +++ b/lib/rconn.c @@ -41,6 +41,7 @@ #include "buffer.h" #include "poll-loop.h" #include "ofp-print.h" +#include "sat-math.h" #include "timeval.h" #include "util.h" #include "vconn.h" @@ -115,9 +116,6 @@ struct rconn { int probe_interval; /* Secs of inactivity before sending probe. */ }; -static unsigned int sat_add(unsigned int x, unsigned int y); -static unsigned int sat_sub(unsigned int x, unsigned int y); -static unsigned int sat_mul(unsigned int x, unsigned int y); static unsigned int elapsed_in_this_state(const struct rconn *); static unsigned int timeout(const struct rconn *); static bool timed_out(const struct rconn *); @@ -745,25 +743,6 @@ state_transition(struct rconn *rc, enum state state) rc->state_entered = time_now(); } -static unsigned int -sat_add(unsigned int x, unsigned int y) -{ - return x + y >= x ? x + y : UINT_MAX; -} - -static unsigned int -sat_sub(unsigned int x, unsigned int y) -{ - return x >= y ? x - y : 0; -} - -static unsigned int -sat_mul(unsigned int x, unsigned int y) -{ - assert(y); - return x <= UINT_MAX / y ? x * y : UINT_MAX; -} - static void question_connectivity(struct rconn *rc) { -- 2.30.2