[asterisk-commits] kharwell: branch kharwell/pimp_sip_qualify r390435 - in /team/kharwell/pimp_s...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Tue Jun 4 16:13:44 CDT 2013
Author: kharwell
Date: Tue Jun 4 16:13:42 2013
New Revision: 390435
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=390435
Log:
addressed review issues
Modified:
team/kharwell/pimp_sip_qualify/res/res_sip.c
team/kharwell/pimp_sip_qualify/res/res_sip/sip_options.c
Modified: team/kharwell/pimp_sip_qualify/res/res_sip.c
URL: http://svnview.digium.com/svn/asterisk/team/kharwell/pimp_sip_qualify/res/res_sip.c?view=diff&rev=390435&r1=390434&r2=390435
==============================================================================
--- team/kharwell/pimp_sip_qualify/res/res_sip.c (original)
+++ team/kharwell/pimp_sip_qualify/res/res_sip.c Tue Jun 4 16:13:42 2013
@@ -223,13 +223,6 @@
<configOption name="outbound_proxy">
<synopsis>Proxy through which to send requests</synopsis>
</configOption>
- <configOption name="qualify_frequency" default="0">
- <synopsis>Interval at which to qualify an endpoint</synopsis>
- <description><para>
- Interval between attempts to qualify the endpoint for reachability.
- If <literal>0</literal> never qualify. Time in seconds.
- </para></description>
- </configOption>
<configOption name="rewrite_contact">
<synopsis>Allow Contact header to be rewritten with the source IP address-port</synopsis>
</configOption>
@@ -511,6 +504,13 @@
<synopsis>Time to keep alive a contact</synopsis>
<description><para>
Time to keep alive a contact. String style specification.
+ </para></description>
+ </configOption>
+ <configOption name="qualify_frequency" default="0">
+ <synopsis>Interval at which to qualify a contact</synopsis>
+ <description><para>
+ Interval between attempts to qualify the contact for reachability.
+ If <literal>0</literal> never qualify. Time in seconds.
</para></description>
</configOption>
</configObject>
@@ -583,6 +583,13 @@
<configOption name="type">
<synopsis>Must be of type 'aor'.</synopsis>
</configOption>
+ <configOption name="qualify_frequency" default="0">
+ <synopsis>Interval at which to qualify an AoR</synopsis>
+ <description><para>
+ Interval between attempts to qualify the AoR for reachability.
+ If <literal>0</literal> never qualify. Time in seconds.
+ </para></description>
+ </configOption>
</configObject>
</configFile>
</configInfo>
Modified: team/kharwell/pimp_sip_qualify/res/res_sip/sip_options.c
URL: http://svnview.digium.com/svn/asterisk/team/kharwell/pimp_sip_qualify/res/res_sip/sip_options.c?view=diff&rev=390435&r1=390434&r2=390435
==============================================================================
--- team/kharwell/pimp_sip_qualify/res/res_sip/sip_options.c (original)
+++ team/kharwell/pimp_sip_qualify/res/res_sip/sip_options.c Tue Jun 4 16:13:42 2013
@@ -37,6 +37,11 @@
static int qualify_contact(struct ast_sip_contact *contact);
+enum contact_status_type {
+ UNAVAILABLE,
+ AVAILABLE
+};
+
/*!
* \internal
* \brief A contact's status.
@@ -47,9 +52,9 @@
struct contact_status {
SORCERY_OBJECT(details);
/*! 0 = unavailable, 1 = available (default) */
- int status;
- /*! The start time set before sending a qualify request */
- struct timeval start;
+ enum contact_status_type status;
+ /*! The round trip start time set before sending a qualify request */
+ struct timeval rtt_start;
/*! The round trip time in microseconds */
int64_t rtt;
};
@@ -67,10 +72,6 @@
ast_log(LOG_ERROR, "Unable to allocate contact_status\n");
return NULL;
}
-
- status->status = 0;
- status->start = ast_tv(0, 0);
- status->rtt = 0;
return status;
}
@@ -112,7 +113,8 @@
* \internal
* \brief Set a contact_status's status to the given value.
*/
-static void update_contact_status(const struct ast_sip_contact *contact, int value)
+static void update_contact_status(const struct ast_sip_contact *contact,
+ enum contact_status_type value)
{
RAII_VAR(struct contact_status *, status,
get_contact_status(contact), ao2_cleanup);
@@ -128,11 +130,14 @@
copy->status = value;
+ /* status is set to unavailable just before sending, so intialize the rrt
+ start time to "now", so when we receive a response (status = available)
+ we can calculate the rtt */
if (copy->status) {
- copy->rtt = ast_tvdiff_us(ast_tvnow(), status->start);
- copy->start = ast_tv(0, 0);
+ copy->rtt = ast_tvdiff_us(ast_tvnow(), status->rtt_start);
+ copy->rtt_start = ast_tv(0, 0);
} else {
- copy->start = ast_tvnow();
+ copy->rtt_start = ast_tvnow();
copy->rtt = 0;
}
@@ -216,7 +221,7 @@
pjsip_tx_data *tdata;
if (tsx->status_code != 401 && tsx->status_code != 407) {
- update_contact_status(contact, 1);
+ update_contact_status(contact, AVAILABLE);
return;
}
@@ -249,8 +254,9 @@
static int qualify_contact(struct ast_sip_contact *contact)
{
pjsip_tx_data *tdata;
- /* assume we can't connect so if no reply comes back */
- update_contact_status(contact, 0);
+ /* assume we can't connect so if no reply comes back the contact is
+ considered unavailable */
+ update_contact_status(contact, UNAVAILABLE);
if (ast_sip_create_request("OPTIONS", NULL, NULL, contact->uri, &tdata)) {
ast_log(LOG_ERROR, "Unable to create request to qualify contact %s\n",
@@ -288,10 +294,10 @@
* \brief Structure to hold qualify contact scheduling information.
*/
struct sched_data {
- /*! The contact being checked */
- struct ast_sip_contact *contact;
/*! The scheduling id */
int id;
+ /*! The the contact being checked */
+ struct ast_sip_contact *contact;
};
/*!
@@ -304,11 +310,29 @@
if (!AST_SCHED_DEL(sched, data->id)) {
/* If we successfully deleted the qualify, we got it before it
- * fired. We can safely unref the data that was passed to it.
- * Otherwise, we're getting deleted while this is firing, so
- * don't unref! */
- ao2_cleanup(data->contact);
- }
+ fired. We can safely unref the data that was passed to it.
+ Otherwise, we're getting deleted while this is firing, so
+ don't unref! */
+ ao2_ref(data->contact, -1);
+ }
+}
+/*!
+ * \internal
+ * \brief Create the scheduling data object.
+ */
+static struct sched_data *sched_data_create(struct ast_sip_contact *contact)
+{
+ struct sched_data *data = ao2_alloc(sizeof(*data), sched_data_destructor);
+
+ if (!data) {
+ ast_log(LOG_ERROR, "Unable to create schedule qualify data\n");
+ return NULL;
+ }
+
+ data->contact = contact;
+ ao2_ref(data->contact, +1);
+
+ return data;
}
/*!
@@ -327,7 +351,13 @@
*/
static int qualify_contact_sched(const void *obj)
{
- struct sched_data *data = (struct sched_data *)obj;
+ RAII_VAR(struct sched_data *, data, (struct sched_data *)obj, ao2_cleanup);
+
+ if (!data) {
+ return 0;
+ }
+
+ ao2_ref(data, +1);
if (!data->contact) {
/* contact is gone - so remove from scheduler */
@@ -349,23 +379,18 @@
*/
static void schedule_qualify(struct ast_sip_contact *contact)
{
- RAII_VAR(struct sched_data *, data, ao2_alloc(
- sizeof(*data), sched_data_destructor), ao2_cleanup);
+ RAII_VAR(struct sched_data *, data, sched_data_create(contact), ao2_cleanup);
if (!data) {
- ast_log(LOG_ERROR, "Unable to create schedule qualify data\n");
return;
}
- data->contact = contact;
- ao2_ref(data->contact, +1);
- if ((data->id = ast_sched_add_variable(
- sched, contact->qualify_frequency * 1000,
- qualify_contact_sched, data, 1) <= 0)) {
-
+ data->id = ast_sched_add_variable(
+ sched, contact->qualify_frequency * 1000, qualify_contact_sched, data, 1);
+
+ if (data->id < 0) {
ast_log(LOG_ERROR, "Unable to schedule qualify for contact %s\n",
contact->uri);
- ao2_ref(data->contact, -1);
return;
}
@@ -378,28 +403,21 @@
*/
static void unschedule_qualify(struct ast_sip_contact *contact)
{
- /* make sure the contact isn't already in the scheduler */
- struct sched_data *data =
- ao2_find(sched_qualifies, contact, OBJ_UNLINK);
-
- if (data) {
- /* if it does exist remove */
- ao2_ref(data, -1);
- }
-}
-
-/*!
- * \internal
- * \brief Qualify the given contact and sets up scheduling if configured.
+ ao2_find(sched_qualifies, contact, OBJ_UNLINK | OBJ_NODATA);
+}
+
+/*!
+ * \internal
+ * \brief Qualify the given contact and set up scheduling if configured.
*/
static void qualify_and_schedule(struct ast_sip_contact *contact)
{
unschedule_qualify(contact);
- ao2_ref(contact, +1);
- ast_sip_push_task(NULL, qualify_contact_task, contact);
-
if (contact->qualify_frequency) {
+ ao2_ref(contact, +1);
+ ast_sip_push_task(NULL, qualify_contact_task, contact);
+
schedule_qualify(contact);
}
}
@@ -415,25 +433,20 @@
/*!
* \internal
- * \brief A contact has been updated make sure it is still available.
- */
-static void contact_updated(const void *obj)
-{
- qualify_and_schedule((struct ast_sip_contact *)obj);
-}
-
-/*!
- * \internal
* \brief A contact has been deleted remove status tracking.
*/
static void contact_deleted(const void *obj)
{
struct ast_sip_contact *contact = (struct ast_sip_contact *)obj;
-
- RAII_VAR(struct contact_status *, status,
- get_contact_status(contact), ao2_cleanup);
+ RAII_VAR(struct contact_status *, status, NULL, ao2_cleanup);
unschedule_qualify(contact);
+
+ if (!(status = ast_sorcery_retrieve_by_id(
+ ast_sip_get_sorcery(), CONTACT_STATUS,
+ ast_sorcery_object_get_id(contact)))) {
+ return;
+ }
if (ast_sorcery_delete(ast_sip_get_sorcery(), status)) {
ast_log(LOG_ERROR, "Unable to delete contact_status for contact %s\n",
@@ -443,8 +456,7 @@
struct ast_sorcery_observer contact_observer = {
.created = contact_created,
- .updated = contact_updated,
- .deleted = contact_deleted,
+ .deleted = contact_deleted
};
static pj_bool_t options_start(void)
@@ -705,9 +717,9 @@
static int sched_qualifies_cmp_fn(void *obj, void *arg, int flags)
{
struct sched_data *data = obj;
- const char *id = flags & OBJ_KEY ? arg : ast_sorcery_object_get_id(arg);
-
- return !strcmp(ast_sorcery_object_get_id(data->contact), id);
+
+ return !strcmp(ast_sorcery_object_get_id(data->contact),
+ ast_sorcery_object_get_id(arg));
}
int ast_sip_initialize_sorcery_qualify(struct ast_sorcery *sorcery)
@@ -721,8 +733,8 @@
return -1;
}
- ast_sorcery_object_field_register(sorcery, CONTACT_STATUS, "status", "no", OPT_BOOL_T,
- 1, FLDSET(struct contact_status, status));
+ ast_sorcery_object_field_register(sorcery, CONTACT_STATUS, "rtt", "0", OPT_UINT_T,
+ 1, FLDSET(struct contact_status, rtt));
if (ast_sorcery_observer_add(sorcery, "contact", &contact_observer)) {
ast_log(LOG_WARNING, "Unable to add contact observer\n");
@@ -738,8 +750,8 @@
struct ast_sip_aor *aor = arg;
contact->qualify_frequency = aor->qualify_frequency;
-
qualify_and_schedule(contact);
+
return 0;
}
@@ -764,12 +776,10 @@
while ((aor_name = strsep(&aors, ","))) {
RAII_VAR(struct ast_sip_aor *, aor,
ast_sip_location_retrieve_aor(aor_name), ao2_cleanup);
- RAII_VAR(struct ao2_container *, contacts, NULL, ao2_cleanup);
-
- if (!aor) {
+
+ if (!aor || !aor->permanent_contacts) {
continue;
}
-
ao2_callback(aor->permanent_contacts, OBJ_NODATA, qualify_and_schedule_cb, aor);
}
More information about the asterisk-commits
mailing list