]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
SAT>IP server: accept RTSP requests from the external IP (NAT)
authorJaroslav Kysela <perex@perex.cz>
Mon, 30 Nov 2015 12:43:34 +0000 (13:43 +0100)
committerJaroslav Kysela <perex@perex.cz>
Mon, 30 Nov 2015 12:43:34 +0000 (13:43 +0100)
src/satip/rtsp.c
src/satip/server.c
src/satip/server.h

index 3f0d70adf4ad2fc9911a0e751a0386625673eb0e..58685cbf01f85420cb1ecf3d8903bc3d157bf94b 100644 (file)
@@ -71,6 +71,7 @@ typedef struct session {
 static uint32_t session_number;
 static uint16_t stream_id;
 static char *rtsp_ip = NULL;
+static char *rtsp_nat_ip = NULL;
 static int rtsp_port = -1;
 static int rtsp_descramble = 1;
 static int rtsp_rewrite_pmt = 0;
@@ -248,7 +249,8 @@ rtsp_check_urlbase(char *u)
 #endif
   }
   if (strcmp(u, rtsp_ip))
-    return NULL;
+    if (rtsp_nat_ip == NULL || rtsp_nat_ip[0] == '\0' || strcmp(u, rtsp_nat_ip))
+      return NULL;
   return p ? p + 1 : u + strlen(u);
 }
 
@@ -1562,7 +1564,8 @@ rtsp_close_sessions(void)
  *
  */
 void satip_server_rtsp_init
-  (const char *bindaddr, int port, int descramble, int rewrite_pmt, int muxcnf)
+  (const char *bindaddr, int port, int descramble, int rewrite_pmt, int muxcnf,
+   const char *nat_ip)
 {
   static tcp_server_ops_t ops = {
     .start  = rtsp_serve,
@@ -1571,6 +1574,7 @@ void satip_server_rtsp_init
   };
   int reg = 0;
   uint8_t rnd[4];
+  char *s;
   if (!rtsp_server) {
     uuid_random(rnd, sizeof(rnd));
     session_number = *(uint32_t *)rnd;
@@ -1584,12 +1588,16 @@ void satip_server_rtsp_init
     rtsp_server = NULL;
     reg = 1;
   }
-  free(rtsp_ip);
-  rtsp_ip = strdup(bindaddr);
+  if ((s = rtsp_ip) != NULL)
+    rtsp_ip = strdup(bindaddr);
+  free(s);
   rtsp_port = port;
   rtsp_descramble = descramble;
   rtsp_rewrite_pmt = rewrite_pmt;
   rtsp_muxcnf = muxcnf;
+  if ((s = rtsp_nat_ip) != NULL)
+    rtsp_nat_ip = nat_ip ? strdup(nat_ip) : NULL;
+  free(s);
   if (!rtsp_server)
     rtsp_server = tcp_server_create(bindaddr, port, &ops, NULL);
   if (reg)
@@ -1613,6 +1621,7 @@ void satip_server_rtsp_done(void)
   rtsp_server = NULL;
   rtsp_port = -1;
   free(rtsp_ip);
+  free(rtsp_nat_ip);
   rtsp_ip = NULL;
   satip_rtp_done();
   pthread_mutex_unlock(&global_lock);
index 10034d12a458584f853719ae2a27275add9b930e..65c9ec011a281eeb4e39f40d2034040f63ca3da0 100644 (file)
@@ -625,6 +625,13 @@ const idclass_t satip_server_class = {
       .list   = satip_server_class_muxcfg_list,
       .group  = 1,
     },
+    {
+      .type   = PT_STR,
+      .id     = "satip_nat_ip",
+      .name   = N_("External IP (NAT)"),
+      .off    = offsetof(struct satip_server_conf, satip_nat_ip),
+      .group  = 1,
+    },
     {
       .type   = PT_INT,
       .id     = "satip_dvbs",
@@ -691,6 +698,7 @@ const idclass_t satip_server_class = {
 static void satip_server_save(void)
 {
   int descramble, rewrite_pmt, muxcnf;
+  char *nat_ip;
 
   config_save();
   if (!satip_server_rtsp_port_locked) {
@@ -699,11 +707,13 @@ static void satip_server_save(void)
       descramble = satip_server_conf.satip_descramble;
       rewrite_pmt = satip_server_conf.satip_rewrite_pmt;
       muxcnf = satip_server_conf.satip_muxcnf;
+      nat_ip = satip_server_conf.satip_nat_ip ? strdup(satip_server_conf.satip_nat_ip) : NULL;
       pthread_mutex_unlock(&global_lock);
-      satip_server_rtsp_init(http_server_ip, satip_server_rtsp_port, descramble, rewrite_pmt, muxcnf);
+      satip_server_rtsp_init(http_server_ip, satip_server_rtsp_port, descramble, rewrite_pmt, muxcnf, nat_ip);
       satip_server_info("re", descramble, muxcnf);
       satips_upnp_send_announce();
       pthread_mutex_lock(&global_lock);
+      free(nat_ip);
     } else {
       pthread_mutex_unlock(&global_lock);
       tvhinfo("satips", "SAT>IP Server shutdown");
@@ -723,6 +733,7 @@ void satip_server_init(int rtsp_port)
   struct sockaddr_storage http;
   char http_ip[128];
   int descramble, rewrite_pmt, muxcnf;
+  char *nat_ip;
 
   http_server_ip = NULL;
   satip_server_bootid = time(NULL);
@@ -746,8 +757,9 @@ void satip_server_init(int rtsp_port)
   descramble = satip_server_conf.satip_descramble;
   rewrite_pmt = satip_server_conf.satip_rewrite_pmt;
   muxcnf = satip_server_conf.satip_muxcnf;
+  nat_ip = satip_server_conf.satip_nat_ip;
 
-  satip_server_rtsp_init(http_server_ip, satip_server_rtsp_port, descramble, rewrite_pmt, muxcnf);
+  satip_server_rtsp_init(http_server_ip, satip_server_rtsp_port, descramble, rewrite_pmt, muxcnf, nat_ip);
 
   satip_server_info("", descramble, muxcnf);
 }
index c30a1ff58f5222aceede4ef70ef94cf3c877c311..38291ffcda006af3c633af2c6f84a57283254c77 100644 (file)
@@ -50,6 +50,7 @@ struct satip_server_conf {
   int satip_dvbc2;
   int satip_atsc;
   int satip_dvbcb;
+  char *satip_nat_ip;
 };
 
 extern struct satip_server_conf satip_server_conf;
@@ -78,7 +79,8 @@ void satip_rtp_init(int boot);
 void satip_rtp_done(void);
 
 void satip_server_rtsp_init(const char *bindaddr, int port,
-                            int descramble, int rewrite_pmt, int muxcnf);
+                            int descramble, int rewrite_pmt, int muxcnf,
+                            const char *nat_ip);
 void satip_server_rtsp_register(void);
 void satip_server_rtsp_done(void);