mirror of git://git.sysmocom.de/ofono
gisi: Remove forward reference
This commit is contained in:
parent
5c4645b2f4
commit
edd0b327e0
213
gisi/modem.c
213
gisi/modem.c
|
@ -275,6 +275,112 @@ static gboolean isi_callback(GIOChannel *channel, GIOCondition cond,
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean modem_subs_update(gpointer data)
|
||||||
|
{
|
||||||
|
GHashTableIter iter;
|
||||||
|
gpointer keyptr, value;
|
||||||
|
|
||||||
|
GIsiModem *modem = data;
|
||||||
|
uint8_t msg[3 + 256] = {
|
||||||
|
0, PNS_SUBSCRIBED_RESOURCES_IND,
|
||||||
|
0,
|
||||||
|
};
|
||||||
|
uint8_t count = 0;
|
||||||
|
|
||||||
|
modem->subs_source = 0;
|
||||||
|
|
||||||
|
g_hash_table_iter_init(&iter, modem->services);
|
||||||
|
|
||||||
|
while (g_hash_table_iter_next(&iter, &keyptr, &value)) {
|
||||||
|
GIsiServiceMux *mux = value;
|
||||||
|
|
||||||
|
if (mux->subscriptions > 0) {
|
||||||
|
msg[3 + count] = mux->resource;
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
msg[2] = count;
|
||||||
|
|
||||||
|
sendto(modem->ind_fd, msg, 3 + msg[2], MSG_NOSIGNAL, (void *)&commgr,
|
||||||
|
sizeof(commgr));
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void modem_subs_update_when_idle(GIsiModem *modem)
|
||||||
|
{
|
||||||
|
if (modem->subs_source > 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
modem->subs_source = g_idle_add(modem_subs_update, modem);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void service_name_register(GIsiServiceMux *mux)
|
||||||
|
{
|
||||||
|
uint8_t msg[] = {
|
||||||
|
0, PNS_NAME_ADD_REQ, 0, 0,
|
||||||
|
0, 0, 0, mux->resource, /* 32-bit Big-Endian name */
|
||||||
|
0, 0, /* device/object */
|
||||||
|
0, 0, /* filler */
|
||||||
|
};
|
||||||
|
uint16_t object = 0;
|
||||||
|
|
||||||
|
if (ioctl(mux->modem->req_fd, SIOCPNGETOBJECT, &object) < 0) {
|
||||||
|
g_warning("ioctl(SIOCPNGETOBJECT): %s", strerror(errno));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Fill in the object ID */
|
||||||
|
msg[8] = object >> 8;
|
||||||
|
msg[9] = object & 0xFF;
|
||||||
|
|
||||||
|
sendto(mux->modem->req_fd, msg, sizeof(msg), MSG_NOSIGNAL,
|
||||||
|
(void *)&namesrv, sizeof(namesrv));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void service_name_deregister(GIsiServiceMux *mux)
|
||||||
|
{
|
||||||
|
const uint8_t msg[] = {
|
||||||
|
0, PNS_NAME_REMOVE_REQ, 0, 0,
|
||||||
|
0, 0, 0, mux->resource,
|
||||||
|
};
|
||||||
|
|
||||||
|
sendto(mux->modem->req_fd, msg, sizeof(msg), MSG_NOSIGNAL,
|
||||||
|
(void *)&namesrv, sizeof(namesrv));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pending_destroy(gpointer value, gpointer user)
|
||||||
|
{
|
||||||
|
GIsiPending *op = value;
|
||||||
|
|
||||||
|
if (!op)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (op->timeout > 0)
|
||||||
|
g_source_remove(op->timeout);
|
||||||
|
|
||||||
|
if (op->destroy)
|
||||||
|
op->destroy(op->data);
|
||||||
|
|
||||||
|
g_free(op);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void service_finalize(gpointer value)
|
||||||
|
{
|
||||||
|
GIsiServiceMux *mux = value;
|
||||||
|
GIsiModem *modem = mux->modem;
|
||||||
|
|
||||||
|
if (mux->subscriptions > 0)
|
||||||
|
modem_subs_update_when_idle(modem);
|
||||||
|
|
||||||
|
if (mux->registrations > 0)
|
||||||
|
service_name_deregister(mux);
|
||||||
|
|
||||||
|
g_slist_foreach(mux->pending, pending_destroy, NULL);
|
||||||
|
g_slist_free(mux->pending);
|
||||||
|
g_free(mux);
|
||||||
|
}
|
||||||
|
|
||||||
GIsiModem *g_isi_modem_create(unsigned index)
|
GIsiModem *g_isi_modem_create(unsigned index)
|
||||||
{
|
{
|
||||||
GIsiModem *modem;
|
GIsiModem *modem;
|
||||||
|
@ -324,81 +430,6 @@ GIsiModem *g_isi_modem_create_by_name(const char *name)
|
||||||
return g_isi_modem_create(if_nametoindex(name));
|
return g_isi_modem_create(if_nametoindex(name));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void service_name_register(GIsiServiceMux *mux)
|
|
||||||
{
|
|
||||||
uint8_t msg[] = {
|
|
||||||
0, PNS_NAME_ADD_REQ, 0, 0,
|
|
||||||
0, 0, 0, mux->resource, /* 32-bit Big-Endian name */
|
|
||||||
0, 0, /* device/object */
|
|
||||||
0, 0, /* filler */
|
|
||||||
};
|
|
||||||
uint16_t object = 0;
|
|
||||||
|
|
||||||
if (ioctl(mux->modem->req_fd, SIOCPNGETOBJECT, &object) < 0) {
|
|
||||||
g_warning("ioctl(SIOCPNGETOBJECT): %s", strerror(errno));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Fill in the object ID */
|
|
||||||
msg[8] = object >> 8;
|
|
||||||
msg[9] = object & 0xFF;
|
|
||||||
|
|
||||||
sendto(mux->modem->req_fd, msg, sizeof(msg), MSG_NOSIGNAL,
|
|
||||||
(void *)&namesrv, sizeof(namesrv));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void service_name_deregister(GIsiServiceMux *mux)
|
|
||||||
{
|
|
||||||
const uint8_t msg[] = {
|
|
||||||
0, PNS_NAME_REMOVE_REQ, 0, 0,
|
|
||||||
0, 0, 0, mux->resource,
|
|
||||||
};
|
|
||||||
|
|
||||||
sendto(mux->modem->req_fd, msg, sizeof(msg), MSG_NOSIGNAL,
|
|
||||||
(void *)&namesrv, sizeof(namesrv));
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean modem_subs_update(gpointer data)
|
|
||||||
{
|
|
||||||
GHashTableIter iter;
|
|
||||||
gpointer keyptr, value;
|
|
||||||
|
|
||||||
GIsiModem *modem = data;
|
|
||||||
uint8_t msg[3 + 256] = {
|
|
||||||
0, PNS_SUBSCRIBED_RESOURCES_IND,
|
|
||||||
0,
|
|
||||||
};
|
|
||||||
uint8_t count = 0;
|
|
||||||
|
|
||||||
modem->subs_source = 0;
|
|
||||||
|
|
||||||
g_hash_table_iter_init(&iter, modem->services);
|
|
||||||
|
|
||||||
while (g_hash_table_iter_next(&iter, &keyptr, &value)) {
|
|
||||||
GIsiServiceMux *mux = value;
|
|
||||||
|
|
||||||
if (mux->subscriptions > 0) {
|
|
||||||
msg[3 + count] = mux->resource;
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
msg[2] = count;
|
|
||||||
|
|
||||||
sendto(modem->ind_fd, msg, 3 + msg[2], MSG_NOSIGNAL, (void *)&commgr,
|
|
||||||
sizeof(commgr));
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void modem_subs_update_when_idle(GIsiModem *modem)
|
|
||||||
{
|
|
||||||
if (modem->subs_source > 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
modem->subs_source = g_idle_add(modem_subs_update, modem);
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint8_t service_next_utid(GIsiServiceMux *mux)
|
static uint8_t service_next_utid(GIsiServiceMux *mux)
|
||||||
{
|
{
|
||||||
if (mux->last_utid == 0x00 || mux->last_utid == 0xFF)
|
if (mux->last_utid == 0x00 || mux->last_utid == 0xFF)
|
||||||
|
@ -449,38 +480,6 @@ static void service_regs_decr(GIsiServiceMux *mux)
|
||||||
service_name_deregister(mux);
|
service_name_deregister(mux);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pending_destroy(gpointer value, gpointer user)
|
|
||||||
{
|
|
||||||
GIsiPending *op = value;
|
|
||||||
|
|
||||||
if (!op)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (op->timeout > 0)
|
|
||||||
g_source_remove(op->timeout);
|
|
||||||
|
|
||||||
if (op->destroy)
|
|
||||||
op->destroy(op->data);
|
|
||||||
|
|
||||||
g_free(op);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void service_finalize(gpointer value)
|
|
||||||
{
|
|
||||||
GIsiServiceMux *mux = value;
|
|
||||||
GIsiModem *modem = mux->modem;
|
|
||||||
|
|
||||||
if (mux->subscriptions > 0)
|
|
||||||
modem_subs_update_when_idle(modem);
|
|
||||||
|
|
||||||
if (mux->registrations > 0)
|
|
||||||
service_name_deregister(mux);
|
|
||||||
|
|
||||||
g_slist_foreach(mux->pending, pending_destroy, NULL);
|
|
||||||
g_slist_free(mux->pending);
|
|
||||||
g_free(mux);
|
|
||||||
}
|
|
||||||
|
|
||||||
void g_isi_modem_destroy(GIsiModem *modem)
|
void g_isi_modem_destroy(GIsiModem *modem)
|
||||||
{
|
{
|
||||||
if (!modem)
|
if (!modem)
|
||||||
|
|
Loading…
Reference in New Issue