#define UPNP_REMOVE_MAX_RETRY 4
#define UPNP_SECTION_NAME "uPnP"
#define UPNP_CORE_READY_CHECK 1
-#define UPNP_CORE_RETRY_DELAY 4
-#define UPNP_CALL_RETRY_DELAY 1
-#define UPNP_UUID_LEN 32
+#define UPNP_CORE_RETRY_DELAY 10
+#define UPNP_CALL_RETRY_DELAY 3
+#define UPNP_UUID_LEN 128
#define UPNP_UUID_LEN_STR UPNP_TOSTRING(UPNP_UUID_LEN)
/*
* uPnP Definitions
mapping.local_port = port->local_port;
mapping.local_host = port->local_addr;
if(port->external_port == -1)
- mapping.remote_port = rand()%(0xffff - 1024) + 1024;
- else
- mapping.remote_port = port->external_port;
+ port->external_port = rand()%(0xffff - 1024) + 1024;
+ mapping.remote_port = port->external_port;
mapping.remote_host = "";
snprintf(description, 128, "%s %s at %s:%d",
PACKAGE_NAME,
UpnpPortBinding *linphone_upnp_port_binding_new_or_collect(MSList *list, upnp_igd_ip_protocol protocol, int local_port, int external_port) {
UpnpPortBinding *tmp_binding;
UpnpPortBinding *end_binding;
- end_binding = linphone_upnp_port_binding_new_with_parameters(protocol, local_port, external_port);
+
+ // Seek an binding with same protocol and local port
+ end_binding = linphone_upnp_port_binding_new_with_parameters(protocol, local_port, -1);
tmp_binding = linphone_upnp_port_binding_equivalent_in_list(list, end_binding);
- if(tmp_binding != NULL) {
+
+ // Must be not attached to any struct
+ if(tmp_binding != NULL && tmp_binding->ref == 1) {
linphone_upnp_port_binding_release(end_binding);
- end_binding = tmp_binding;
+ end_binding = linphone_upnp_port_binding_retain(tmp_binding);
+ } else {
+ end_binding->external_port = external_port;
}
return end_binding;
}
}
}
+// Return true if the binding are equivalent. (Note external_port == -1 means "don't care")
bool_t linphone_upnp_port_binding_equal(const UpnpPortBinding *port1, const UpnpPortBinding *port2) {
return port1->protocol == port2->protocol &&
- port1->local_port == port2->local_port &&
- port1->external_port == port2->external_port;
+ port1->local_port == port2->local_port &&
+ (port1->external_port == -1 || port2->external_port == -1 || port1->external_port == port2->external_port);
}
UpnpPortBinding *linphone_upnp_port_binding_equivalent_in_list(MSList *list, const UpnpPortBinding *port) {
bool_t valid = TRUE;
UpnpPortBinding *port;
- ret = sscanf(entry, "%"UPNP_UUID_LEN_STR"s-%3s-%i-%i", device_id, protocol_str, &external_port, &local_port);
+ ret = sscanf(entry, "%"UPNP_UUID_LEN_STR"[^-]-%3s-%i-%i", device_id, protocol_str, &external_port, &local_port);
if(ret == 4) {
// Handle only wanted device bindings
if(device_id != NULL && strcmp(cookie->device_id, device_id) != 0) {