Changed from polling to select API

This commit is contained in:
Andreas Eversberg 2023-02-05 10:58:42 +01:00
parent 972c43d74e
commit 887aaddeee
7 changed files with 28 additions and 38 deletions

1
.gitignore vendored
View File

@ -44,6 +44,7 @@ src/libosmocc/libosmocc.a
src/libsample/libsample.a src/libsample/libsample.a
src/libfilter/libfilter.a src/libfilter/libfilter.a
src/libtimer/libtimer.a src/libtimer/libtimer.a
src/libselect/libselect.a
src/libph_socket/libph_socket.a src/libph_socket/libph_socket.a
src/pstn/osmo-cc-pstn-endpoint src/pstn/osmo-cc-pstn-endpoint

View File

@ -86,6 +86,7 @@ AC_OUTPUT(
src/libfm/Makefile src/libfm/Makefile
src/libfilter/Makefile src/libfilter/Makefile
src/libtimer/Makefile src/libtimer/Makefile
src/libselect/Makefile
src/libjitter/Makefile src/libjitter/Makefile
src/libosmocc/Makefile src/libosmocc/Makefile
src/libg711/Makefile src/libg711/Makefile

View File

@ -9,6 +9,7 @@ SUBDIRS = \
libdtmf \ libdtmf \
libfsk \ libfsk \
libtimer \ libtimer \
libselect \
libjitter \ libjitter \
libosmocc \ libosmocc \
libph_socket \ libph_socket \

View File

@ -20,6 +20,7 @@ osmo_cc_pstn_endpoint_LDADD = \
../libfm/libfm.a \ ../libfm/libfm.a \
../libfilter/libfilter.a \ ../libfilter/libfilter.a \
../libtimer/libtimer.a \ ../libtimer/libtimer.a \
../libselect/libselect.a \
../libjitter/libjitter.a \ ../libjitter/libjitter.a \
../libosmocc/libosmocc.a \ ../libosmocc/libosmocc.a \
../libg711/libg711.a \ ../libg711/libg711.a \

View File

@ -386,15 +386,22 @@ int main(int argc, char *argv[])
signal(SIGPIPE, sighandler); signal(SIGPIPE, sighandler);
while (!quit) { while (!quit) {
int w; int work;
process_timer(); double timeout;
pstn_work(pstn_ep); /* handle all handlers until done */
rtp_work(pstn_ep);
do { do {
w = 0; work = 0;
w |= osmo_cc_handle(); work |= osmo_cc_handle();
} while (w); } while (work);
usleep(1000); /* handle all timers
* timeout is 0, if there was an event
* -> handle FDs without waiting, continue this loop
* timeout is not 0, if there was no event
* -> wait until FD or timeout
*/
timeout = process_timer();
/* wait for FD event until given timeout */
work = osmo_fd_select(timeout);
} }
signal(SIGINT, SIG_DFL); signal(SIGINT, SIG_DFL);

View File

@ -301,7 +301,7 @@ void pstn_destroy(pstn_t *pstn)
PDEBUG(DTEL, DEBUG_DEBUG, "PSTN instance destroyed\n"); PDEBUG(DTEL, DEBUG_DEBUG, "PSTN instance destroyed\n");
} }
static void pstn_timeout(struct timer *timer); static void pstn_timeout(void *data);
void recv_dtmf(void *priv, char digit, dtmf_meas_t __attribute__((unused)) *meas); void recv_dtmf(void *priv, char digit, dtmf_meas_t __attribute__((unused)) *meas);
static void pstn_new_state(pstn_t *pstn, enum pstn_state state) static void pstn_new_state(pstn_t *pstn, enum pstn_state state)
@ -332,11 +332,6 @@ int pstn_init(pstn_t *pstn, const char *name, const char *socketname, const char
pstn->ringing_type_hold = ringing_type_hold; pstn->ringing_type_hold = ringing_type_hold;
pstn->tones_type = tones_type; pstn->tones_type = tones_type;
/* create ph socket */
rc = ph_socket_init(&pstn->ph_socket, ph_socket_rx_msg, pstn, socketname, 0);
if (rc < 0)
return rc;
/* init DTMF detector */ /* init DTMF detector */
rc = dtmf_decode_init(&pstn->dtmf_dec, pstn, recv_dtmf, 8000, db2level(6.0), db2level(-30.0)); rc = dtmf_decode_init(&pstn->dtmf_dec, pstn, recv_dtmf, 8000, db2level(6.0), db2level(-30.0));
if (rc < 0) if (rc < 0)
@ -365,6 +360,11 @@ int pstn_init(pstn_t *pstn, const char *name, const char *socketname, const char
/* bring into service */ /* bring into service */
pstn_new_state(pstn, PSTN_STATE_BLOCKED); pstn_new_state(pstn, PSTN_STATE_BLOCKED);
/* create ph socket here because we get a reply from the function call */
rc = ph_socket_init(&pstn->ph_socket, ph_socket_rx_msg, pstn, socketname, 0);
if (rc < 0)
return rc;
return 0; return 0;
} }
@ -385,17 +385,6 @@ void rtp_receive(struct osmo_cc_session_codec *codec, uint8_t __attribute__((unu
jitter_save(&pstn->tx_dejitter, data, len, 1, sequence, timestamp, ssrc); jitter_save(&pstn->tx_dejitter, data, len, 1, sequence, timestamp, ssrc);
} }
void rtp_work(pstn_t *pstn)
{
int i;
for (i = 0; i < 2; i++) {
if (pstn->call[i]->cc_session)
osmo_cc_session_handle(pstn->call[i]->cc_session, pstn->call[i]);
}
}
static void dtmf_on(pstn_t *pstn) static void dtmf_on(pstn_t *pstn)
{ {
if (pstn->dtmf_on) if (pstn->dtmf_on)
@ -1722,14 +1711,13 @@ static void v5_disc_req_and_cleanup(pstn_t *pstn)
v5_send(pstn, PSTN_EVENT_DISC_REQ, NULL, 0); v5_send(pstn, PSTN_EVENT_DISC_REQ, NULL, 0);
} }
/* /*
* timeout * timeout
*/ */
static void pstn_timeout(struct timer *timer) static void pstn_timeout(void *data)
{ {
pstn_t *pstn = timer->priv; pstn_t *pstn = data;
switch (pstn->timer_ident) { switch (pstn->timer_ident) {
case TIMER_IDENT_DIALING: case TIMER_IDENT_DIALING:
@ -1781,12 +1769,3 @@ static void pstn_timeout(struct timer *timer)
} }
} }
/*
* work
*/
void pstn_work(pstn_t *pstn)
{
ph_socket_work(&pstn->ph_socket);
}

View File

@ -1,5 +1,6 @@
#include "../libtimer/timer.h" #include "../libtimer/timer.h"
#include "../libselect/select.h"
#include "../libosmocc/endpoint.h" #include "../libosmocc/endpoint.h"
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libjitter/jitter.h" #include "../libjitter/jitter.h"
@ -157,5 +158,4 @@ pstn_t *pstn_create(void);
int pstn_init(pstn_t *pstn, const char *name, const char *socketname, const char **subscribers, int subscriber_num, uint8_t serving_location, int tx_delay, enum pstn_cid_method clip, int cid_bell, int cid_dtmf, int clip_date, int enblock, int recall, int *ringing_types_incoming, int ringing_type_hold, enum tones_type tones_type, char law); int pstn_init(pstn_t *pstn, const char *name, const char *socketname, const char **subscribers, int subscriber_num, uint8_t serving_location, int tx_delay, enum pstn_cid_method clip, int cid_bell, int cid_dtmf, int clip_date, int enblock, int recall, int *ringing_types_incoming, int ringing_type_hold, enum tones_type tones_type, char law);
void cc_message(osmo_cc_endpoint_t *ep, uint32_t callref, osmo_cc_msg_t *msg); void cc_message(osmo_cc_endpoint_t *ep, uint32_t callref, osmo_cc_msg_t *msg);
void rtp_work(pstn_t *pstn_ep); void rtp_work(pstn_t *pstn_ep);
void pstn_work(pstn_t *pstn_ep);