push-notification: Handle notifications with source port 0

It seesm that some networks send the push notifications with a source
port of 0 instead of 9200. Instead of accepting any source port, add
an additional datagram handler for the source port 0.
This commit is contained in:
Marcel Holtmann 2010-12-24 10:48:30 -08:00
parent c7963f1c00
commit 3950052dfc
1 changed files with 19 additions and 6 deletions

View File

@ -40,6 +40,7 @@
#define PUSH_NOTIFICATION_INTERFACE "org.ofono.PushNotification" #define PUSH_NOTIFICATION_INTERFACE "org.ofono.PushNotification"
#define AGENT_INTERFACE "org.ofono.PushNotificationAgent" #define AGENT_INTERFACE "org.ofono.PushNotificationAgent"
#define WAP_PUSH_SRC_PORT 9200 #define WAP_PUSH_SRC_PORT 9200
#define WAP_PUSH_DST_PORT 2948 #define WAP_PUSH_DST_PORT 2948
@ -49,16 +50,21 @@ struct push_notification {
struct ofono_modem *modem; struct ofono_modem *modem;
struct ofono_sms *sms; struct ofono_sms *sms;
struct sms_agent *agent; struct sms_agent *agent;
unsigned int push_watch; unsigned int push_watch[2];
}; };
static void agent_exited(void *userdata) static void agent_exited(void *userdata)
{ {
struct push_notification *pn = userdata; struct push_notification *pn = userdata;
if (pn->push_watch > 0) { if (pn->push_watch[0] > 0) {
__ofono_sms_datagram_watch_remove(pn->sms, pn->push_watch); __ofono_sms_datagram_watch_remove(pn->sms, pn->push_watch[0]);
pn->push_watch = 0; pn->push_watch[0] = 0;
}
if (pn->push_watch[1] > 0) {
__ofono_sms_datagram_watch_remove(pn->sms, pn->push_watch[1]);
pn->push_watch[1] = 0;
} }
pn->agent = NULL; pn->agent = NULL;
@ -107,11 +113,17 @@ static DBusMessage *push_notification_register_agent(DBusConnection *conn,
sms_agent_set_removed_notify(pn->agent, agent_exited, pn); sms_agent_set_removed_notify(pn->agent, agent_exited, pn);
pn->push_watch = __ofono_sms_datagram_watch_add(pn->sms, push_received, pn->push_watch[0] = __ofono_sms_datagram_watch_add(pn->sms,
push_received,
WAP_PUSH_DST_PORT, WAP_PUSH_DST_PORT,
WAP_PUSH_SRC_PORT, WAP_PUSH_SRC_PORT,
pn, NULL); pn, NULL);
pn->push_watch[1] = __ofono_sms_datagram_watch_add(pn->sms,
push_received,
WAP_PUSH_DST_PORT,
0, pn, NULL);
return dbus_message_new_method_return(msg); return dbus_message_new_method_return(msg);
} }
@ -151,7 +163,8 @@ static void push_notification_cleanup(gpointer user)
DBG("%p", pn); DBG("%p", pn);
/* The push watch was already cleaned up */ /* The push watch was already cleaned up */
pn->push_watch = 0; pn->push_watch[0] = 0;
pn->push_watch[1] = 0;
pn->sms = NULL; pn->sms = NULL;
sms_agent_free(pn->agent); sms_agent_free(pn->agent);