aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2010-07-22 20:12:09 +0200
committerHarald Welte <laforge@gnumonks.org>2010-07-22 21:54:19 +0200
commitc95cf10d0849f0795f69ef9b5b8db76e970272a6 (patch)
tree103578ce0c7a9ff70f47a0ff2ebb680db15782a0
parente39a5912f115215c75db1f0ff850227025dec136 (diff)
[ipaccess-config] fix bugs in generating the PHYSICAL CONFIG attribute
... while asking the BTS to perform tests for us. The length of the ARFCN whitelist is the actual length in bytes, not the number of 16bit ARFCN numbers. Also, implement a limit, either by rxlevel or by number of ARFCN that should end up in the whitelist.
-rw-r--r--openbsc/include/openbsc/network_listen.h3
-rw-r--r--openbsc/src/abis_nm.c3
-rw-r--r--openbsc/src/ipaccess/ipaccess-config.c6
-rw-r--r--openbsc/src/ipaccess/network_listen.c9
4 files changed, 15 insertions, 6 deletions
diff --git a/openbsc/include/openbsc/network_listen.h b/openbsc/include/openbsc/network_listen.h
index 8ca5cd8d4..67d1f4ef7 100644
--- a/openbsc/include/openbsc/network_listen.h
+++ b/openbsc/include/openbsc/network_listen.h
@@ -10,4 +10,7 @@ void ipac_nwl_init(void);
int ipac_nwl_test_start(struct gsm_bts_trx *trx, uint8_t testnr,
const uint8_t *phys_conf, unsigned int phys_conf_len);
+int ipac_rxlevstat2whitelist(uint16_t *buf, const struct rxlev_stats *st, uint8_t min_rxlev,
+ uint16_t max_num_arfcns);
+
#endif /* _OPENBSC_NWL_H */
diff --git a/openbsc/src/abis_nm.c b/openbsc/src/abis_nm.c
index 2d8f687ec..aaf99eef2 100644
--- a/openbsc/src/abis_nm.c
+++ b/openbsc/src/abis_nm.c
@@ -1058,7 +1058,8 @@ int abis_nm_rcvmsg(struct msgb *msg)
if (oh->placement != ABIS_OM_PLACEMENT_ONLY) {
LOGP(DNM, LOGL_ERROR, "ABIS OML placement 0x%x not supported\n",
oh->placement);
- return -EINVAL;
+ if (oh->placement != ABIS_OM_PLACEMENT_FIRST)
+ return -EINVAL;
}
if (oh->sequence != 0) {
LOGP(DNM, LOGL_ERROR, "ABIS OML sequence 0x%x != 0x00\n",
diff --git a/openbsc/src/ipaccess/ipaccess-config.c b/openbsc/src/ipaccess/ipaccess-config.c
index 7b0fd40a1..f0ad464f9 100644
--- a/openbsc/src/ipaccess/ipaccess-config.c
+++ b/openbsc/src/ipaccess/ipaccess-config.c
@@ -127,10 +127,10 @@ static uint16_t build_physconf(uint8_t *physconf_buf, const struct rxlev_stats *
/* Create whitelist from rxlevels */
physconf_buf[0] = phys_conf_min[0];
physconf_buf[1] = NM_IPAC_EIE_ARFCN_WHITE;
- num_arfcn = ipac_rxlevstat2whitelist(whitelist, st);
+ num_arfcn = ipac_rxlevstat2whitelist(whitelist, st, 0, 100);
arfcnlist_size = num_arfcn * 2;
- *((uint16_t *) (physconf_buf+2)) = htons(num_arfcn);
- printf("pc_buf (%s)\n", hexdump(physconf_buf, arfcnlist_size+4));
+ *((uint16_t *) (physconf_buf+2)) = htons(arfcnlist_size);
+ DEBUGP(DNM, "physconf_buf (%s)\n", hexdump(physconf_buf, arfcnlist_size+4));
return arfcnlist_size+4;
}
diff --git a/openbsc/src/ipaccess/network_listen.c b/openbsc/src/ipaccess/network_listen.c
index 7625eec3d..23e404f1e 100644
--- a/openbsc/src/ipaccess/network_listen.c
+++ b/openbsc/src/ipaccess/network_listen.c
@@ -40,18 +40,23 @@
#define WHITELIST_MAX_SIZE ((NUM_ARFCNS*2)+2+1)
-int ipac_rxlevstat2whitelist(uint16_t *buf, const struct rxlev_stats *st)
+int ipac_rxlevstat2whitelist(uint16_t *buf, const struct rxlev_stats *st, uint8_t min_rxlev,
+ uint16_t max_num_arfcns)
{
int i;
unsigned int num_arfcn = 0;
- for (i = NUM_RXLEVS-1; i >= 0; i--) {
+ for (i = NUM_RXLEVS-1; i >= min_rxlev; i--) {
int16_t arfcn = -1;
while ((arfcn = rxlev_stat_get_next(st, i, arfcn)) >= 0) {
*buf++ = htons(arfcn);
num_arfcn++;
+
}
+
+ if (num_arfcn > max_num_arfcns)
+ break;
}
return num_arfcn;