This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
Harald Welte gerrit-no-reply at lists.osmocom.orgHello Jenkins Builder, I'd like you to reexamine a change. Please visit https://gerrit.osmocom.org/2265 to look at the new patch set (#5). osmo_ss7: default point-code format for parsing/printing without ss7_instance osmo_ss7_pointcode_print() osmo_ss7_pointcode_parse() etc. now support passing a NULL ss7-instance which will lead to application of the default ITU 3.8.3 point code format. Change-Id: Ifb739e92e31eaaa0343dc57c9af8c9164d00175f --- M include/osmocom/sigtran/osmo_ss7.h M src/osmo_ss7.c 2 files changed, 43 insertions(+), 37 deletions(-) git pull ssh://gerrit.osmocom.org:29418/libosmo-sccp refs/changes/65/2265/5 diff --git a/include/osmocom/sigtran/osmo_ss7.h b/include/osmocom/sigtran/osmo_ss7.h index 56a3ea4..ebb7cb3 100644 --- a/include/osmocom/sigtran/osmo_ss7.h +++ b/include/osmocom/sigtran/osmo_ss7.h @@ -51,6 +51,11 @@ * SS7 Instances ***********************************************************************/ +struct osmo_ss7_pc_fmt { + char delimiter; + uint8_t component_len[3]; +}; + struct osmo_ss7_instance { /*! member of global list of instances */ struct llist_head list; @@ -78,10 +83,7 @@ /* secondary PCs */ /* capability PCs */ uint8_t network_indicator; - struct { - char delimiter; - uint8_t component_len[3]; - } pc_fmt; + struct osmo_ss7_pc_fmt pc_fmt; } cfg; }; diff --git a/src/osmo_ss7.c b/src/osmo_ss7.c index d657b81..d3b71e7 100644 --- a/src/osmo_ss7.c +++ b/src/osmo_ss7.c @@ -71,7 +71,7 @@ }; #define LOGSS7(inst, level, fmt, args ...) \ - LOGP(DLSS7, level, "%u: " fmt, (inst)->cfg.id, ## args) + LOGP(DLSS7, level, "%u: " fmt, inst ? (inst)->cfg.id : 0, ## args) int osmo_ss7_find_free_rctx(struct osmo_ss7_instance *inst) { @@ -87,6 +87,11 @@ /*********************************************************************** * SS7 Point Code Parsing / Printing ***********************************************************************/ + +static const struct osmo_ss7_pc_fmt default_pc_fmt = { + .delimiter = '.', + .component_len = { 3, 8, 3}, +}; /* like strcat() but appends a single character */ static int strnappendchar(char *str, char c, size_t n) @@ -104,7 +109,7 @@ /* generate a format string for formatting a point code. The result can * e.g. be used with sscanf() or sprintf() */ -static const char *gen_pc_fmtstr(struct osmo_ss7_instance *inst, +static const char *gen_pc_fmtstr(const struct osmo_ss7_pc_fmt *pc_fmt, unsigned int *num_comp_exp) { static char buf[MAX_PC_STR_LEN]; @@ -114,15 +119,15 @@ strcat(buf, "%u"); num_comp++; - if (inst->cfg.pc_fmt.component_len[1] == 0) + if (pc_fmt->component_len[1] == 0) goto out; - strnappendchar(buf, inst->cfg.pc_fmt.delimiter, sizeof(buf)); + strnappendchar(buf, pc_fmt->delimiter, sizeof(buf)); strcat(buf, "%u"); num_comp++; - if (inst->cfg.pc_fmt.component_len[2] == 0) + if (pc_fmt->component_len[2] == 0) goto out; - strnappendchar(buf, inst->cfg.pc_fmt.delimiter, sizeof(buf)); + strnappendchar(buf, pc_fmt->delimiter, sizeof(buf)); strcat(buf, "%u"); num_comp++; out: @@ -133,38 +138,35 @@ /* get number of components we expect for a point code, depending on the * configuration of this ss7_instance */ -static unsigned int num_pc_comp_exp(struct osmo_ss7_instance *inst) +static unsigned int num_pc_comp_exp(const struct osmo_ss7_pc_fmt *pc_fmt) { unsigned int num_comp_exp = 1; - if (inst->cfg.pc_fmt.component_len[1]) + if (pc_fmt->component_len[1]) num_comp_exp++; - if (inst->cfg.pc_fmt.component_len[2]) + if (pc_fmt->component_len[2]) num_comp_exp++; return num_comp_exp; } /* get the total width (in bits) of the point-codes in this ss7_instance */ -static unsigned int get_pc_width(struct osmo_ss7_instance *inst) +static unsigned int get_pc_width(const struct osmo_ss7_pc_fmt *pc_fmt) { - return inst->cfg.pc_fmt.component_len[0] + - inst->cfg.pc_fmt.component_len[1] + - inst->cfg.pc_fmt.component_len[2]; + return pc_fmt->component_len[0] + pc_fmt->component_len[1] + pc_fmt->component_len[2]; } /* get the number of bits we must shift the given component of a point * code in this ss7_instance */ -static unsigned int get_pc_comp_shift(struct osmo_ss7_instance *inst, +static unsigned int get_pc_comp_shift(const struct osmo_ss7_pc_fmt *pc_fmt, unsigned int comp_num) { - uint32_t pc_width = get_pc_width(inst); + uint32_t pc_width = get_pc_width(pc_fmt); switch (comp_num) { case 0: - return pc_width - inst->cfg.pc_fmt.component_len[0]; + return pc_width - pc_fmt->component_len[0]; case 1: - return pc_width - inst->cfg.pc_fmt.component_len[0] - - inst->cfg.pc_fmt.component_len[1]; + return pc_width - pc_fmt->component_len[0] - pc_fmt->component_len[1]; case 2: return 0; default: @@ -172,11 +174,11 @@ } } -static uint32_t pc_comp_shift_and_mask(struct osmo_ss7_instance *inst, +static uint32_t pc_comp_shift_and_mask(const struct osmo_ss7_pc_fmt *pc_fmt, unsigned int comp_num, uint32_t pc) { - unsigned int shift = get_pc_comp_shift(inst, comp_num); - uint32_t mask = (1 << inst->cfg.pc_fmt.component_len[comp_num]) - 1; + unsigned int shift = get_pc_comp_shift(pc_fmt, comp_num); + uint32_t mask = (1 << pc_fmt->component_len[comp_num]) - 1; return (pc >> shift) & mask; } @@ -186,8 +188,9 @@ int osmo_ss7_pointcode_parse(struct osmo_ss7_instance *inst, const char *str) { unsigned int component[3]; - unsigned int num_comp_exp = num_pc_comp_exp(inst); - const char *fmtstr = gen_pc_fmtstr(inst, &num_comp_exp); + const struct osmo_ss7_pc_fmt *pc_fmt = inst ? &inst->cfg.pc_fmt : &default_pc_fmt; + unsigned int num_comp_exp = num_pc_comp_exp(pc_fmt); + const char *fmtstr = gen_pc_fmtstr(pc_fmt, &num_comp_exp); int i, rc; rc = sscanf(str, fmtstr, &component[0], &component[1], &component[2]); @@ -198,16 +201,16 @@ /* check none of the component values exceeds what can be * represented within its bit-width */ for (i = 0; i < num_comp_exp; i++) { - if (component[i] >= (1 << inst->cfg.pc_fmt.component_len[i])) + if (component[i] >= (1 << pc_fmt->component_len[i])) goto err; } /* shift them all together */ - rc = (component[0] << get_pc_comp_shift(inst, 0)); + rc = (component[0] << get_pc_comp_shift(pc_fmt, 0)); if (num_comp_exp > 1) - rc |= (component[1] << get_pc_comp_shift(inst, 1)); + rc |= (component[1] << get_pc_comp_shift(pc_fmt, 1)); if (num_comp_exp > 2) - rc |= (component[2] << get_pc_comp_shift(inst, 2)); + rc |= (component[2] << get_pc_comp_shift(pc_fmt, 2)); return rc; @@ -221,21 +224,22 @@ const char *osmo_ss7_pointcode_print(struct osmo_ss7_instance *inst, uint32_t pc) { static char buf[MAX_PC_STR_LEN]; - unsigned int num_comp_exp = num_pc_comp_exp(inst); - const char *fmtstr = gen_pc_fmtstr(inst, &num_comp_exp); + const struct osmo_ss7_pc_fmt *pc_fmt = inst ? &inst->cfg.pc_fmt : &default_pc_fmt; + unsigned int num_comp_exp = num_pc_comp_exp(pc_fmt); + const char *fmtstr = gen_pc_fmtstr(pc_fmt, &num_comp_exp); OSMO_ASSERT(fmtstr); snprintf(buf, sizeof(buf), fmtstr, - pc_comp_shift_and_mask(inst, 0, pc), - pc_comp_shift_and_mask(inst, 1, pc), - pc_comp_shift_and_mask(inst, 2, pc)); + pc_comp_shift_and_mask(pc_fmt, 0, pc), + pc_comp_shift_and_mask(pc_fmt, 1, pc), + pc_comp_shift_and_mask(pc_fmt, 2, pc)); return buf; } int osmo_ss7_pointcode_parse_mask_or_len(struct osmo_ss7_instance *inst, const char *in) { - unsigned int width = get_pc_width(inst); + unsigned int width = get_pc_width(inst ? &inst->cfg.pc_fmt : &default_pc_fmt); if (in[0] == '/') { /* parse mask by length */ -- To view, visit https://gerrit.osmocom.org/2265 To unsubscribe, visit https://gerrit.osmocom.org/settings Gerrit-MessageType: newpatchset Gerrit-Change-Id: Ifb739e92e31eaaa0343dc57c9af8c9164d00175f Gerrit-PatchSet: 5 Gerrit-Project: libosmo-sccp Gerrit-Branch: master Gerrit-Owner: Harald Welte <laforge at gnumonks.org> Gerrit-Reviewer: Harald Welte <laforge at gnumonks.org> Gerrit-Reviewer: Jenkins Builder