OSDN Git Service

wifi-display: retry UDP read/write to improve connection robustness
authorChong Zhang <chz@google.com>
Thu, 16 May 2013 01:47:26 +0000 (18:47 -0700)
committerChong Zhang <chz@google.com>
Thu, 16 May 2013 18:05:19 +0000 (11:05 -0700)
Bug: 8922753
Change-Id: Ie6d18f03afcb23d11e6f0e63403e8f0d59b70be8

media/libstagefright/wifi-display/ANetworkSession.cpp

index f074438..938d601 100644 (file)
@@ -39,6 +39,7 @@
 namespace android {
 
 static const size_t kMaxUDPSize = 1500;
+static const int32_t kMaxUDPRetries = 200;
 
 struct ANetworkSession::NetworkThread : public Thread {
     NetworkThread(ANetworkSession *session);
@@ -105,6 +106,7 @@ private:
     int mSocket;
     sp<AMessage> mNotify;
     bool mSawReceiveFailure, mSawSendFailure;
+    int32_t mUDPRetries;
 
     List<Fragment> mOutFragments;
 
@@ -148,6 +150,7 @@ ANetworkSession::Session::Session(
       mNotify(notify),
       mSawReceiveFailure(false),
       mSawSendFailure(false),
+      mUDPRetries(kMaxUDPRetries),
       mLastStallReportUs(-1ll) {
     if (mState == CONNECTED) {
         struct sockaddr_in localAddr;
@@ -286,8 +289,17 @@ status_t ANetworkSession::Session::readMore() {
         }
 
         if (err != OK) {
-            notifyError(false /* send */, err, "Recvfrom failed.");
-            mSawReceiveFailure = true;
+            if (!mUDPRetries) {
+                notifyError(false /* send */, err, "Recvfrom failed.");
+                mSawReceiveFailure = true;
+            } else {
+                mUDPRetries--;
+                ALOGE("Recvfrom failed, %d/%d retries left",
+                        mUDPRetries, kMaxUDPRetries);
+                err = OK;
+            }
+        } else {
+            mUDPRetries = kMaxUDPRetries;
         }
 
         return err;
@@ -479,8 +491,17 @@ status_t ANetworkSession::Session::writeMore() {
         }
 
         if (err != OK) {
-            notifyError(true /* send */, err, "Send datagram failed.");
-            mSawSendFailure = true;
+            if (!mUDPRetries) {
+                notifyError(true /* send */, err, "Send datagram failed.");
+                mSawSendFailure = true;
+            } else {
+                mUDPRetries--;
+                ALOGE("Send datagram failed, %d/%d retries left",
+                        mUDPRetries, kMaxUDPRetries);
+                err = OK;
+            }
+        } else {
+            mUDPRetries = kMaxUDPRetries;
         }
 
         return err;