libosip2 regression (was Re: any maintainer for linphone ?)
Luigi Rizzo
rizzo at icir.org
Fri Feb 16 15:54:42 UTC 2007
As i mentioned earlier, the upgrade of libosip2 from 2.2.2 to 2.2.3
broke the linphone port(s). There is a proposal for a fix, but
it very very intrusive.
So i was wondering if there was a good reason to upgrade libosip
to version 2.2.3, and there doesn't seem to be one (see details below).
As a result I would like to downgrade libosip2 to version 2.2.2
(possibly with a minuscule patch) in order to unbreak the port that
was broken by the upgrade. It takes much less work this way.
Comments/objections, especially from the maintainers of the relevant
ports ?
--- FULL DETAILS ---
I did a bit of checking of which ports use libosip with
cd /usr/ports
make search bdeps=libosip
and the result is the following:
+ one port (net/libexosip2) uses libosip-3.0.1 so it is not under discussion;
+ two ports (net/linphone-base, net/linphone) use libosip2 and are broken
by the upgrade;
+ one port (net/siproxd) builds fine with both libosip2.2.2 and libosip2.2.3
The PR that requested the upgrade
http://www.freebsd.org/cgi/query-pr.cgi?pr=99242
does not have any comment on why the change was useful.
The 'ChangeLog' in libosip2.2.3 reports this:
libosip2 (2.2.3)
* fix 64-bit (amd64) issue with hash.
* remove SDP negotiation (much better to do it in your applications)
and the diff (attached) which relate to the first part are minuscule:
a change of size in a hash table, and the change of a field in
an internal structure from time_t to a struct timeval in a
My suggestion is to downgrade libosip2 to version 2.2.2 and
apply the patch attached.
Objections ?
cheers
luigi
-----------------------------------+-------------------------------------
Luigi RIZZO, rizzo at iet.unipi.it . Dip. di Ing. dell'Informazione
http://www.iet.unipi.it/~luigi/ . Universita` di Pisa
TEL/FAX: +39-050-2217.533/600 . via Diotisalvi 2, 56122 PISA (Italy)
Mobile +39-347-0373137
-----------------------------------+-------------------------------------
-------------- next part --------------
diff -ubwr ../../work.2.2.2/libosip2-2.2.2/include/osip2/osip.h ./include/osip2/osip.h
--- ../../work.2.2.2/libosip2-2.2.2/include/osip2/osip.h Thu Nov 24 14:27:03 2005
+++ ./include/osip2/osip.h Wed Jan 11 15:13:18 2006
@@ -460,7 +460,7 @@
struct osip_dialog *dialog; /**< related dialog */
osip_message_t *msg2xx; /**< buffer to retransmit */
osip_message_t *ack; /**< ack message if needed */
- time_t start; /**< Time of first retransmission */
+ struct timeval start; /**< Time of first retransmission */
int interval; /**< delay between retransmission, in ms */
char *dest; /**< destination host */
int port; /**< destination port */
diff -ubwr ../../work.2.2.2/libosip2-2.2.2/src/osip2/osip.c ./src/osip2/osip.c
--- ../../work.2.2.2/libosip2-2.2.2/src/osip2/osip.c Thu Nov 24 14:27:03 2005
+++ ./src/osip2/osip.c Wed Jan 11 15:21:15 2006
@@ -157,7 +157,7 @@
void
osip_add_ixt (osip_t * osip, ixt_t * ixt)
{
- /* ajout dans la liste de osip_t->ixt */
+ /* add in list osip_t->ixt */
osip_ixt_lock (osip);
osip_list_add (osip->ixt_retransmissions, (void *) ixt, 0);
osip_ixt_unlock (osip);
@@ -196,9 +196,10 @@
pixt->dialog = NULL;
pixt->msg2xx = NULL;
pixt->ack = NULL;
- pixt->start = time (NULL);
- pixt->interval = 500;
- pixt->counter = 7;
+ pixt->interval = DEFAULT_T1;
+ osip_gettimeofday(&pixt->start, NULL);
+ add_gettimeofday(&pixt->start, pixt->interval+10);
+ pixt->counter = 10;
pixt->dest = NULL;
pixt->port = 5060;
pixt->sock = -1;
@@ -295,12 +296,14 @@
}
void
-ixt_retransmit (osip_t * osip, ixt_t * ixt, time_t current)
+ixt_retransmit (osip_t * osip, ixt_t * ixt, struct timeval *current)
{
- if ((current - ixt->start) * 1000 > ixt->interval)
+ if (osip_timercmp(current, &ixt->start, >))
{
ixt->interval = ixt->interval * 2;
- ixt->start = current;
+ if (ixt->interval > 4000)
+ ixt->interval = 4000;
+ add_gettimeofday (&ixt->start, ixt->interval);
if (ixt->ack != NULL)
osip->cb_send_message (NULL, ixt->ack, ixt->dest, ixt->port, ixt->sock);
else if (ixt->msg2xx != NULL)
@@ -313,15 +316,16 @@
osip_retransmissions_execute (osip_t * osip)
{
int i;
- time_t current;
ixt_t *ixt;
+ struct timeval current;
+
+ osip_gettimeofday (¤t, NULL);
- current = time (NULL);
osip_ixt_lock (osip);
for (i = 0; !osip_list_eol (osip->ixt_retransmissions, i); i++)
{
ixt = (ixt_t *) osip_list_get (osip->ixt_retransmissions, i);
- ixt_retransmit (osip, ixt, current);
+ ixt_retransmit (osip, ixt, ¤t);
if (ixt->counter == 0)
{
/* remove it */
@@ -1808,12 +1812,16 @@
ixt = (ixt_t *) osip_list_get_first (osip->ixt_retransmissions, &iterator);
while (osip_list_iterator_has_elem (iterator))
{
- struct timeval cmpTime;
- div_t dValue = div (ixt->interval, 1000);
-
- cmpTime.tv_sec = (long) (ixt->start + dValue.quot);
- cmpTime.tv_usec = dValue.rem * 1000;
- min_timercmp (lower_tv, &cmpTime);
+ min_timercmp (lower_tv, &ixt->start);
+ if (osip_timercmp (&now, lower_tv, >))
+ {
+ lower_tv->tv_sec = 0;
+ lower_tv->tv_usec = 0;
+#ifdef OSIP_MT
+ osip_mutex_unlock (nist_fastmutex);
+#endif
+ return;
+ }
ixt = (ixt_t *) osip_list_get_next (&iterator);
}
diff -ubwr ../../work.2.2.2/libosip2-2.2.2/src/osip2/osip_transaction.c ./src/osip2/osip_transaction.c
--- ../../work.2.2.2/libosip2-2.2.2/src/osip2/osip_transaction.c Thu Nov 24 14:27:03 2005
+++ ./src/osip2/osip_transaction.c Wed Feb 1 18:31:03 2006
@@ -600,6 +600,9 @@
if (b_origrequest != NULL && b_request != NULL)
/* case where both request contains a branch */
{
+ if ( ! b_origrequest->gvalue ) return -1;
+ if ( ! b_request->gvalue ) return -1;
+
length_br = strlen (b_origrequest->gvalue);
length_br2 = strlen (b_request->gvalue);
if (length_br != length_br2)
diff -ubwr ../../work.2.2.2/libosip2-2.2.2/src/osipparser2/osip_parser_cfg.c ./src/osipparser2/osip_parser_cfg.c
--- ../../work.2.2.2/libosip2-2.2.2/src/osipparser2/osip_parser_cfg.c Thu Nov 24 14:27:03 2005
+++ ./src/osipparser2/osip_parser_cfg.c Fri Jan 6 18:46:27 2006
@@ -32,8 +32,15 @@
* Anyway, this mechanism improves the search time (from binary seach (log(n)) to 1).
*/
-#define HASH_TABLE_SIZE 150 /* set this to the hash table size, 150 is the first size
- where no conflicts occur */
+#ifndef HASH_TABLE_SIZE
+#ifdef __amd64__
+#define HASH_TABLE_SIZE 450
+#else
+#define HASH_TABLE_SIZE 150 /* set this to the hash table size, 150 is the
+ first size where no conflicts occur */
+#endif
+#endif
+
static int hdr_ref_table[HASH_TABLE_SIZE]; /* the hashtable contains indices to the pconfig table */
/*
@@ -146,6 +153,10 @@
} else
{
/* oops, conflict!-> change the hash table or use another hash function size */
+
+ OSIP_TRACE (osip_trace
+ (__FILE__, __LINE__, OSIP_ERROR, NULL,
+ "conflict with current hashtable size\n"));
return -1;
}
}
More information about the freebsd-ports
mailing list