From: Jaroslav Kysela Date: Sun, 1 Nov 2015 20:15:11 +0000 (+0100) Subject: SAT>IP server: send replies to multicast M-SEARCH request from correct UDP port X-Git-Tag: v4.2.1~1701 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=aeb20cad6a5750c74ef05ce31eaedfdca664e9cc;p=thirdparty%2Ftvheadend.git SAT>IP server: send replies to multicast M-SEARCH request from correct UDP port --- diff --git a/src/input/mpegts/satip/satip.c b/src/input/mpegts/satip/satip.c index 3eb63d369..cebc0f3d3 100644 --- a/src/input/mpegts/satip/satip.c +++ b/src/input/mpegts/satip/satip.c @@ -1164,7 +1164,7 @@ ST: urn:ses-com:device:SatIPServer:1\r\n" htsbuf_append(&q, MSG, sizeof(MSG)-1); htsbuf_qprintf(&q, "USER-AGENT: unix/1.0 UPnP/1.1 TVHeadend/%s\r\n", tvheadend_version); htsbuf_append(&q, "\r\n", 2); - upnp_send(&q, NULL, 0); + upnp_send(&q, NULL, 0, 0); htsbuf_queue_flush(&q); gtimer_arm_ms(&satip_discovery_msearch_timer, satip_discovery_send_msearch, diff --git a/src/satip/server.c b/src/satip/server.c index 3ba8a71df..c933431dd 100644 --- a/src/satip/server.c +++ b/src/satip/server.c @@ -264,7 +264,7 @@ CONFIGID.UPNP.ORG: 0\r\n\ htsbuf_queue_init(&q, 0); htsbuf_append(&q, buf, strlen(buf)); - upnp_send(&q, NULL, attempt * 11); + upnp_send(&q, NULL, attempt * 11, 1); htsbuf_queue_flush(&q); } #undef MSG @@ -322,7 +322,7 @@ DEVICEID.SES.COM: %d\r\n\r\n" htsbuf_queue_init(&q, 0); htsbuf_append(&q, buf, strlen(buf)); - upnp_send(&q, NULL, attempt * 11); + upnp_send(&q, NULL, attempt * 11, 1); htsbuf_queue_flush(&q); } #undef MSG @@ -330,7 +330,7 @@ DEVICEID.SES.COM: %d\r\n\r\n" static void satips_upnp_send_discover_reply - (struct sockaddr_storage *dst, const char *deviceid) + (struct sockaddr_storage *dst, const char *deviceid, int from_multicast) { #define MSG "\ HTTP/1.1 200 OK\r\n\ @@ -366,7 +366,7 @@ CONFIGID.UPNP.ORG: 0\r\n" htsbuf_qprintf(&q, "DEVICEID.SES.COM: %s", deviceid); htsbuf_append(&q, "\r\n", 2); storage = *dst; - upnp_send(&q, &storage, 0); + upnp_send(&q, &storage, 0, from_multicast); htsbuf_queue_flush(&q); #undef MSG } @@ -471,14 +471,14 @@ satips_upnp_discovery_received tcp_get_str_from_ip((struct sockaddr *)storage, buf2, sizeof(buf2)); tvhwarn("satips", "received duplicate SAT>IP DeviceID %s from %s:%d, using %d", deviceid, buf2, ntohs(IP_PORT(*storage)), satip_server_deviceid); - satips_upnp_send_discover_reply(storage, deviceid); + satips_upnp_send_discover_reply(storage, deviceid, 0); satips_upnp_send_byebye(); satips_upnp_send_announce(); } else { - satips_upnp_send_discover_reply(storage, NULL); + satips_upnp_send_discover_reply(storage, NULL, 0); } } else { - satips_upnp_send_discover_reply(storage, NULL); + satips_upnp_send_discover_reply(storage, NULL, 1); } } diff --git a/src/upnp.c b/src/upnp.c index bf0c48913..7421e56c6 100644 --- a/src/upnp.c +++ b/src/upnp.c @@ -50,6 +50,7 @@ typedef struct upnp_data { struct sockaddr_storage storage; htsbuf_queue_t queue; int delay_ms; + int from_multicast; } upnp_data_t; TAILQ_HEAD(upnp_data_queue_write, upnp_data); @@ -82,7 +83,8 @@ void upnp_service_destroy( upnp_service_t *us ) * */ void -upnp_send( htsbuf_queue_t *q, struct sockaddr_storage *storage, int delay_ms ) +upnp_send( htsbuf_queue_t *q, struct sockaddr_storage *storage, + int delay_ms, int from_multicast ) { upnp_data_t *data; @@ -96,6 +98,7 @@ upnp_send( htsbuf_queue_t *q, struct sockaddr_storage *storage, int delay_ms ) else data->storage = *storage; data->delay_ms = delay_ms; + data->from_multicast = from_multicast; pthread_mutex_lock(&upnp_lock); TAILQ_INSERT_TAIL(&upnp_data_write, data, data_link); pthread_mutex_unlock(&upnp_lock); @@ -196,7 +199,8 @@ upnp_thread( void *aux ) if (data == NULL) break; upnp_dump_data(data); - udp_write_queue(unicast, &data->queue, &data->storage); + udp_write_queue(data->from_multicast ? multicast : unicast, + &data->queue, &data->storage); htsbuf_queue_flush(&data->queue); free(data); delay_ms = 0; diff --git a/src/upnp.h b/src/upnp.h index 878648291..c2f6726cd 100644 --- a/src/upnp.h +++ b/src/upnp.h @@ -39,7 +39,8 @@ upnp_service_t *upnp_service_create0(upnp_service_t *us); upnp_service_create0(calloc(1, sizeof(struct us))) void upnp_service_destroy(upnp_service_t *service); -void upnp_send(htsbuf_queue_t *q, struct sockaddr_storage *storage, int delay_ms); +void upnp_send(htsbuf_queue_t *q, struct sockaddr_storage *storage, + int delay_ms, int from_multicast); void upnp_server_init(const char *bindaddr); void upnp_server_done(void);