[wfdmanager] Add to use socket keep-alive to check timeout. 41/56441/1 accepted/tizen/mobile/20160112.224121 accepted/tizen/tv/20160112.224137 accepted/tizen/wearable/20160112.224158 submit/tizen/20160112.091731
authorSangkyu Park <sk1122.park@samsung.com>
Thu, 7 Jan 2016 07:34:48 +0000 (16:34 +0900)
committerSangkyu Park <sk1122.park@samsung.com>
Fri, 8 Jan 2016 03:56:26 +0000 (12:56 +0900)
Change-Id: I8052eb109915760367032ba568b22bd0954e76ec
Signed-off-by: Sangkyu Park <sk1122.park@samsung.com>
packaging/gst-plugins-tizen.spec
wfdmanager/wfdbase/gstwfdbasesrc.c

index b75a9e3..556c2ac 100644 (file)
@@ -5,7 +5,7 @@
 Name:       gst-plugins-tizen
 Version:    1.0.0
 Summary:    GStreamer tizen plugins (common)
-Release:    19
+Release:    20
 Group:      Multimedia/Framework
 Url:        http://gstreamer.freedesktop.org/
 License:    LGPL-2.1+
index ead8d81..6a87528 100755 (executable)
@@ -136,6 +136,10 @@ enum
 #define DEFAULT_PORT_RANGE       NULL
 #define DEFAULT_USER_AGENT       "TIZEN-WFD-SINK"
 
+#define SOCKET_TCP_KEEPIDLE 5
+#define SOCKET_TCP_KEEPINTVL 2
+#define SOCKET_TCP_KEEPCNT 3
+
 enum
 {
   PROP_0,
@@ -1138,8 +1142,64 @@ connect_retry:
       }
     } else {
       GST_INFO_OBJECT(src, "Connection success");
-    }
+      gint fd = 0;
+      int optval = 0;
+      int optlen = sizeof(int);
+      GSocket* socket = gst_rtsp_connection_get_write_socket(info->connection);
+
+      if(socket != NULL) {
+        fd = g_socket_get_fd (socket);
+        if(fd == 0) {
+          GST_INFO_OBJECT(src, "fd(write) is null");
+        }
+        else {
+          optval = 1;
+          if(setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (void*)&optval, sizeof(optval)) < 0) {
+            GST_INFO_OBJECT(src, "Error set socket SO_KEEPALIVE value to TRUE");
+          }
+
+          optval = SOCKET_TCP_KEEPIDLE;
+          if(setsockopt(fd, IPPROTO_TCP, 4/*TCP_KEEPIDLE*/, (void*)&optval, sizeof(optval)) < 0) {
+            GST_INFO_OBJECT(src, "Error set socket TCP_KEEPIDLE value");
+          }
 
+          optval = SOCKET_TCP_KEEPINTVL;
+          if(setsockopt(fd, IPPROTO_TCP, 5/*TCP_KEEPINTVL*/, (void*)&optval, sizeof(optval)) < 0) {
+            GST_INFO_OBJECT(src, "Error get socket TCP_KEEPINTVL value");
+          }
+
+          optval = SOCKET_TCP_KEEPCNT;
+          if(setsockopt(fd, IPPROTO_TCP, 6/*TCP_KEEPCNT*/, (void*)&optval, sizeof(optval)) < 0) {
+           GST_INFO_OBJECT(src, "Error get socket TCP_KEEPINTVL value");
+          }
+
+          //for check
+          if(getsockopt(fd, SOL_SOCKET, SO_KEEPALIVE/**/, (void*)&optval, (socklen_t*)&optlen) < 0) {
+            GST_INFO_OBJECT(src, "Error get socket SO_KEEPALIVE option value");
+          } else {
+            GST_INFO_OBJECT(src, "SO_KEEPALIVE : %d",optval);
+          }
+
+          if(getsockopt(fd, IPPROTO_TCP, 4/*TCP_KEEPIDLE*/, (void*)&optval, (socklen_t*)&optlen) < 0) {
+            GST_INFO_OBJECT(src, "Error get socket TCP_KEEPIDLE option value");
+          } else {
+            GST_INFO_OBJECT(src, "TCP_KEEPIDLE : %d",optval);
+          }
+
+          if(getsockopt(fd, IPPROTO_TCP, 5/*TCP_KEEPINTVL*/, (void*)&optval, (socklen_t*)&optlen) < 0) {
+            GST_INFO_OBJECT(src, "Error get socket TCP_KEEPINTVL option value");
+          } else {
+            GST_INFO_OBJECT(src, "TCP_KEEPINTVL : %d",optval);
+          }
+
+          if(getsockopt(fd, IPPROTO_TCP, 6/*TCP_KEEPCNT */, (void*)&optval, (socklen_t*)&optlen) < 0) {
+            GST_INFO_OBJECT(src, "Error get socket TCP_KEEPCNT option value");
+          } else {
+            GST_INFO_OBJECT(src, "TCP_KEEPCNT : %d",optval);
+          }
+        }
+      }
+    }
     info->connected = TRUE;
   }
   return GST_RTSP_OK;
@@ -2011,6 +2071,8 @@ gst_wfd_base_src_loop (GstWFDBaseSrc * src)
         /* server closed the connection.*/
         GST_ELEMENT_WARNING (src, RESOURCE, READ, (NULL),
             ("The server closed the connection."));
+        gst_element_post_message (GST_ELEMENT_CAST (src), gst_message_new_element (GST_OBJECT_CAST (src), gst_structure_new ("GstWFDSrcSessionTimeout", NULL)));
+
         goto connect_error;
       default:
         goto receive_error;