]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
SAT>IP server: send replies to multicast M-SEARCH request from correct UDP port
authorJaroslav Kysela <perex@perex.cz>
Sun, 1 Nov 2015 20:15:11 +0000 (21:15 +0100)
committerJaroslav Kysela <perex@perex.cz>
Sun, 1 Nov 2015 20:15:11 +0000 (21:15 +0100)
src/input/mpegts/satip/satip.c
src/satip/server.c
src/upnp.c
src/upnp.h

index 3eb63d36957936d398f750eb1a17cc1b441a8b23..cebc0f3d339ebc5baf25b98a16226ff7674b80b4 100644 (file)
@@ -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,
index 3ba8a71df04b10867fb43bafb4c7539d2b339a7a..c933431dd92319298ef30e7542eb24f88efcceb3 100644 (file)
@@ -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);
   }
 }
 
index bf0c489138b1e8f9713262830fc7091d42a5f49b..7421e56c6e7d129df1e753e681a9c93a33ca76bd 100644 (file)
@@ -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;
index 87864829118a7b9ee5e110e612fc169c934d93f9..c2f6726cd83db6f95f2432e71b4f4d2955203cc8 100644 (file)
@@ -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);