diff options
-rw-r--r-- | examples/channel/abis_ipa_client.c | 2 | ||||
-rw-r--r-- | examples/channel/abis_ipa_server.c | 2 | ||||
-rw-r--r-- | include/osmocom/netif/channel.h | 9 | ||||
-rw-r--r-- | src/channel.c | 19 | ||||
-rw-r--r-- | src/channel/abis_ipa_client.c | 1 | ||||
-rw-r--r-- | src/channel/abis_ipa_server.c | 1 |
6 files changed, 28 insertions, 6 deletions
diff --git a/examples/channel/abis_ipa_client.c b/examples/channel/abis_ipa_client.c index c560e9f..3e24b62 100644 --- a/examples/channel/abis_ipa_client.c +++ b/examples/channel/abis_ipa_client.c @@ -58,7 +58,7 @@ int main(void) osmo_chan_init(tall_example); /* create channel. */ - chan = osmo_chan_create(OSMO_CHAN_ABIS_IPA_CLI); + chan = osmo_chan_create(OSMO_CHAN_ABIS_IPA_CLI, OSMO_SUBCHAN_STREAM); if (chan == NULL) { LOGP(DEXAMPLE, LOGL_ERROR, "Cannot create A-bis IPA client\n"); exit(EXIT_FAILURE); diff --git a/examples/channel/abis_ipa_server.c b/examples/channel/abis_ipa_server.c index 27eebc7..a1b2ffd 100644 --- a/examples/channel/abis_ipa_server.c +++ b/examples/channel/abis_ipa_server.c @@ -55,7 +55,7 @@ int main(void) osmo_chan_init(tall_example); /* create channel. */ - chan = osmo_chan_create(OSMO_CHAN_ABIS_IPA_SRV); + chan = osmo_chan_create(OSMO_CHAN_ABIS_IPA_SRV, OSMO_SUBCHAN_STREAM); if (chan == NULL) { LOGP(DEXAMPLE, LOGL_ERROR, "Cannot create A-bis IPA server\n"); exit(EXIT_FAILURE); diff --git a/include/osmocom/netif/channel.h b/include/osmocom/netif/channel.h index f044605..1abc828 100644 --- a/include/osmocom/netif/channel.h +++ b/include/osmocom/netif/channel.h @@ -11,6 +11,12 @@ enum { OSMO_CHAN_MAX, }; +/* channel subtypes */ +enum { + OSMO_SUBCHAN_STREAM, + OSMO_SUBCHAN_MAX, +}; + struct osmo_chan; struct msgb; @@ -19,6 +25,7 @@ struct osmo_chan_type { char *name; int type; + int subtype; int datasiz; int (*create)(struct osmo_chan *chan); @@ -36,7 +43,7 @@ struct osmo_chan { void osmo_chan_init(void *ctx); -struct osmo_chan *osmo_chan_create(int type); +struct osmo_chan *osmo_chan_create(int type, int subtype); void osmo_chan_destroy(struct osmo_chan *c); int osmo_chan_open(struct osmo_chan *c); diff --git a/src/channel.c b/src/channel.c index 3b317de..2cae973 100644 --- a/src/channel.c +++ b/src/channel.c @@ -20,10 +20,10 @@ void osmo_chan_init(void *ctx) /* add your new channel type here */ } -struct osmo_chan *osmo_chan_create(int type_id) +struct osmo_chan *osmo_chan_create(int type_id, int subtype_id) { struct osmo_chan_type *cur = NULL; - int found = 0; + int found = 0, found_partial = 0; struct osmo_chan *c; if (type_id > OSMO_CHAN_MAX) { @@ -31,11 +31,19 @@ struct osmo_chan *osmo_chan_create(int type_id) "number `%u'\n", type_id); return NULL; } + if (subtype_id > OSMO_SUBCHAN_MAX) { + LOGP(DLINP, LOGL_ERROR, "unsupported subchannel type " + "number `%u'\n", type_id); + return NULL; + } llist_for_each_entry(cur, &channel_list, head) { - if (type_id == cur->type) { + if (type_id == cur->type && subtype_id == cur->subtype) { found = 1; break; + } else if (type_id == cur->type) { + found_partial = 1; + break; } } @@ -44,6 +52,11 @@ struct osmo_chan *osmo_chan_create(int type_id) cur->name); return NULL; } + if (found_partial) { + LOGP(DLINP, LOGL_ERROR, "Sorry, channel type `%s' does not " + "support subtype `%u'\n", cur->name, subtype_id); + return NULL; + } c = talloc_zero_size(osmo_chan_ctx, sizeof(struct osmo_chan) + cur->datasiz); diff --git a/src/channel/abis_ipa_client.c b/src/channel/abis_ipa_client.c index 2a971c7..bb6a1ee 100644 --- a/src/channel/abis_ipa_client.c +++ b/src/channel/abis_ipa_client.c @@ -359,6 +359,7 @@ static int rsl_read_cb(struct osmo_stream_cli *conn) struct osmo_chan_type chan_abis_ipa_cli = { .type = OSMO_CHAN_ABIS_IPA_CLI, + .subtype = OSMO_SUBCHAN_STREAM, .name = "A-bis IPA client", .datasiz = sizeof(struct chan_abis_ipa_cli), .create = chan_abis_ipa_cli_create, diff --git a/src/channel/abis_ipa_server.c b/src/channel/abis_ipa_server.c index 7e21f49..6524033 100644 --- a/src/channel/abis_ipa_server.c +++ b/src/channel/abis_ipa_server.c @@ -511,6 +511,7 @@ static int rsl_read_cb(struct osmo_stream_srv *conn) struct osmo_chan_type chan_abis_ipa_srv = { .type = OSMO_CHAN_ABIS_IPA_SRV, + .subtype = OSMO_SUBCHAN_STREAM, .name = "A-bis IPA server", .datasiz = sizeof(struct chan_abis_ipa_srv), .create = chan_abis_ipa_srv_create, |