libcommon: soak up three static functions.
Add new kitchen sink openbsc/utils.h and libcommon/utils.c to make three so far static functions public (so I can use them in the upcoming OAP code). A place to put them could have been the gprs_utils.h, but all general functions in there have a gprs_ prefix, and todo markings to move them away. All other libcommon headers are too specific, so I opened up this kitchen sink header. Replace the implementation of encode_big_endian() with a call to osmo_store64be_ext(). See comments. Apply the change in Makefiles and C files.
This commit is contained in:
parent
fe60cfb1d6
commit
d48f057328
|
@ -14,7 +14,7 @@ noinst_HEADERS = abis_nm.h abis_rsl.h db.h gsm_04_08.h gsm_data.h \
|
|||
osmo_msc_data.h osmo_bsc_grace.h sms_queue.h abis_om2000.h \
|
||||
bss.h gsm_data_shared.h ipaccess.h mncc_int.h \
|
||||
arfcn_range_encode.h nat_rewrite_trie.h bsc_nat_callstats.h \
|
||||
osmux.h mgcp_transcode.h gprs_utils.h \
|
||||
osmux.h mgcp_transcode.h gprs_utils.h utils.h \
|
||||
gprs_gb_parse.h smpp.h meas_feed.h gprs_gsup_messages.h \
|
||||
gprs_gsup_client.h bsc_msg_filter.h
|
||||
|
||||
|
|
|
@ -0,0 +1,26 @@
|
|||
/* OpenBSC kitchen sink */
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
/* Compare count bytes of exp to rel. Return 0 if they are identical, 1
|
||||
* otherwise. Do not return a mismatch on the first mismatching byte,
|
||||
* but always compare all bytes, regardless. The idea is that the amount of
|
||||
* matching bytes cannot be inferred from the time the comparison took.*/
|
||||
int constant_time_cmp(const uint8_t *exp, const uint8_t *rel, const int count);
|
||||
|
||||
/* This is like osmo_load64be_ext, except that if data_len is less than
|
||||
* sizeof(uint64_t), the data is interpreted as the least significant bytes
|
||||
* (osmo_load64be_ext loads them as the most significant bytes into the
|
||||
* returned uint64_t). In this way, any integer size up to 64 bits can be
|
||||
* decoded conveniently by using sizeof(), without the need to call specific
|
||||
* numbered functions (osmo_load16, 32, ...). */
|
||||
uint64_t decode_big_endian(const uint8_t *data, size_t data_len);
|
||||
|
||||
/* This is like osmo_store64be_ext, except that this returns a static buffer of
|
||||
* the result (for convenience, but not threadsafe). If data_len is less than
|
||||
* sizeof(uint64_t), only the least significant bytes of value are encoded. */
|
||||
uint8_t *encode_big_endian(uint64_t value, size_t data_len);
|
||||
|
|
@ -26,41 +26,13 @@
|
|||
|
||||
#include <openbsc/debug.h>
|
||||
#include <openbsc/gprs_utils.h>
|
||||
#include <openbsc/utils.h>
|
||||
|
||||
#include <osmocom/gsm/tlv.h>
|
||||
#include <osmocom/core/msgb.h>
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
static uint64_t decode_big_endian(const uint8_t *data, size_t data_len)
|
||||
{
|
||||
uint64_t value = 0;
|
||||
|
||||
while (data_len > 0) {
|
||||
value = (value << 8) + *data;
|
||||
data += 1;
|
||||
data_len -= 1;
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
static uint8_t *encode_big_endian(uint64_t value, size_t data_len)
|
||||
{
|
||||
static uint8_t buf[sizeof(uint64_t)];
|
||||
int idx;
|
||||
|
||||
OSMO_ASSERT(data_len <= ARRAY_SIZE(buf));
|
||||
|
||||
for (idx = data_len - 1; idx >= 0; idx--) {
|
||||
buf[idx] = (uint8_t)value;
|
||||
value = value >> 8;
|
||||
}
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
static int decode_pdp_info(uint8_t *data, size_t data_len,
|
||||
struct gprs_gsup_pdp_info *pdp_info)
|
||||
{
|
||||
|
|
|
@ -6,4 +6,4 @@ noinst_LIBRARIES = libcommon.a
|
|||
|
||||
libcommon_a_SOURCES = bsc_version.c common_vty.c debug.c gsm_data.c \
|
||||
gsm_data_shared.c socket.c talloc_ctx.c \
|
||||
gsm_subscriber_base.c
|
||||
gsm_subscriber_base.c utils.c
|
||||
|
|
|
@ -0,0 +1,58 @@
|
|||
/* OpenBSC kitchen sink */
|
||||
|
||||
/* (C) 2015 by sysmocom s.m.f.c GmbH <info@sysmocom.de>
|
||||
* All Rights Reserved
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <openbsc/utils.h>
|
||||
#include <osmocom/core/utils.h>
|
||||
#include <osmocom/core/bit64gen.h>
|
||||
|
||||
/* Wishful thinking to generate a constant time compare */
|
||||
int constant_time_cmp(const uint8_t *exp, const uint8_t *rel, const int count)
|
||||
{
|
||||
int x = 0, i;
|
||||
|
||||
for (i = 0; i < count; ++i)
|
||||
x |= exp[i] ^ rel[i];
|
||||
|
||||
/* if x is zero, all data was identical */
|
||||
return x? 1 : 0;
|
||||
}
|
||||
|
||||
|
||||
uint64_t decode_big_endian(const uint8_t *data, size_t data_len)
|
||||
{
|
||||
uint64_t value = 0;
|
||||
|
||||
while (data_len > 0) {
|
||||
value = (value << 8) + *data;
|
||||
data += 1;
|
||||
data_len -= 1;
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
uint8_t *encode_big_endian(uint64_t value, size_t data_len)
|
||||
{
|
||||
static uint8_t buf[sizeof(uint64_t)];
|
||||
OSMO_ASSERT(data_len <= ARRAY_SIZE(buf));
|
||||
osmo_store64be_ext(value, buf, data_len);
|
||||
return buf;
|
||||
}
|
||||
|
|
@ -47,6 +47,7 @@
|
|||
#include <openbsc/abis_nm.h>
|
||||
#include <openbsc/socket.h>
|
||||
#include <openbsc/vty.h>
|
||||
#include <openbsc/utils.h>
|
||||
|
||||
#include <osmocom/ctrl/control_cmd.h>
|
||||
#include <osmocom/ctrl/control_if.h>
|
||||
|
@ -987,17 +988,6 @@ static void ipaccess_close_bsc(void *data)
|
|||
bsc_close_connection(conn);
|
||||
}
|
||||
|
||||
/* Wishful thinking to generate a constant time compare */
|
||||
static int constant_time_cmp(const uint8_t *exp, const uint8_t *rel, const int count)
|
||||
{
|
||||
int x = 0, i;
|
||||
|
||||
for (i = 0; i < count; ++i)
|
||||
x |= exp[i] ^ rel[i];
|
||||
|
||||
return x != 0;
|
||||
}
|
||||
|
||||
static int verify_key(struct bsc_connection *conn, struct bsc_config *conf, const uint8_t *key, const int keylen)
|
||||
{
|
||||
struct osmo_auth_vector vec;
|
||||
|
|
|
@ -6,6 +6,7 @@ EXTRA_DIST = gprs_test.ok
|
|||
noinst_PROGRAMS = gprs_test
|
||||
|
||||
gprs_test_SOURCES = gprs_test.c $(top_srcdir)/src/gprs/gprs_utils.c \
|
||||
$(top_srcdir)/src/gprs/gprs_gsup_messages.c
|
||||
$(top_srcdir)/src/gprs/gprs_gsup_messages.c \
|
||||
$(top_srcdir)/src/libcommon/utils.c
|
||||
|
||||
gprs_test_LDADD = $(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS)
|
||||
|
|
Loading…
Reference in New Issue