release-request-0dde025a-b646-47ba-a39d-3b7f1b411086-for-git_oc-dr1-release-4262262 snap-temp-L18300000091440802

Change-Id: I43b4ff0640a393eb3952515b35e01dc9986416bd
diff --git a/msm8998/hal/src/HAL.cpp b/msm8998/hal/src/HAL.cpp
index 8ff0aa8..22aff0f 100644
--- a/msm8998/hal/src/HAL.cpp
+++ b/msm8998/hal/src/HAL.cpp
@@ -41,6 +41,7 @@
 /* External Includes */
 #include <cutils/log.h>
 #include <string>
+#include <sys/socket.h>
 #include <sys/types.h>
 #include <vector>
 
@@ -399,15 +400,26 @@
     const hidl_vec<hidl_string>& prefixes,
     setLocalPrefixes_cb hidl_cb
 ) {
+    BoolResult res;
+    PrefixParser parser;
+    vector<string> prefixesStr = convertHidlStrToStdStr(prefixes);
+
     LocalLogBuffer::FunctionLog fl(__func__);
-    fl.addArg("prefixes", "unused");
-    #pragma unused(prefixes)
+    fl.addArg("prefixes", prefixesStr);
 
-    /* Fake Success */
-    BoolResult res = ipaResultToBoolResult(RET::SUCCESS);
+    if (!isInitialized()) {
+        BoolResult res = makeInputCheckFailure("Not initialized");
+    } else if(prefixesStr.size() < 1) {
+        res = ipaResultToBoolResult(RET::FAIL_INPUT_CHECK);
+    } else if (!parser.add(prefixesStr)) {
+        res = makeInputCheckFailure(parser.getLastErrAsStr());
+    } else {
+        res = ipaResultToBoolResult(RET::SUCCESS);
+    }
+
     hidl_cb(res.success, res.errMsg);
-
     fl.setResult(res.success, res.errMsg);
+    mLogs.addLog(fl);
     return Void();
 } /* setLocalPrefixes */
 
@@ -484,7 +496,12 @@
      * qualified here.  But then, how do we allow them to be empty/null as well
      * while still preserving a sane API on PrefixParser?
      */
-    if (!v4AddrParser.addV4(v4Addr) && !v4Addr.empty()) {
+    if (!isInitialized()) {
+        BoolResult res = makeInputCheckFailure("Not initialized (setUpstreamParameters)");
+        hidl_cb(res.success, res.errMsg);
+        fl.setResult(res.success, res.errMsg);
+    }
+    else if (!v4AddrParser.addV4(v4Addr) && !v4Addr.empty()) {
         BoolResult res = makeInputCheckFailure(v4AddrParser.getLastErrAsStr());
         hidl_cb(res.success, res.errMsg);
         fl.setResult(res.success, res.errMsg);
@@ -496,19 +513,6 @@
         BoolResult res = makeInputCheckFailure(v6GwParser.getLastErrAsStr());
         hidl_cb(res.success, res.errMsg);
         fl.setResult(res.success, res.errMsg);
-    } else if (v6GwParser.size() > 1) {
-        RET ipaReturn = mIPA->stopAllOffload();
-        if (ipaReturn != RET::SUCCESS) {
-            BoolResult res =
-                    makeInputCheckFailure("Cannot accept more than 1 IPv6 Gateway.  Offload still running and may result in data path errors");
-            hidl_cb(res.success, res.errMsg);
-            fl.setResult(res.success, res.errMsg);
-        } else {
-            BoolResult res =
-                    makeInputCheckFailure("Cannot accept more than 1 IPv6 Gateway.  In an effort to avoid any data path errors, offload has been stopped");
-            hidl_cb(res.success, res.errMsg);
-            fl.setResult(res.success, res.errMsg);
-        }
     } else {
         RET ipaReturn = mIPA->setUpstream(
                 iface.c_str(),
@@ -535,7 +539,12 @@
 
     PrefixParser prefixParser;
 
-    if (!prefixParser.add(prefix)) {
+    if (!isInitialized()) {
+        BoolResult res = makeInputCheckFailure("Not initialized (setUpstreamParameters)");
+        hidl_cb(res.success, res.errMsg);
+        fl.setResult(res.success, res.errMsg);
+    }
+    else if (!prefixParser.add(prefix)) {
         BoolResult res = makeInputCheckFailure(prefixParser.getLastErrAsStr());
         hidl_cb(res.success, res.errMsg);
         fl.setResult(res.success, res.errMsg);
@@ -564,7 +573,12 @@
 
     PrefixParser prefixParser;
 
-    if (!prefixParser.add(prefix)) {
+    if (!isInitialized()) {
+        BoolResult res = makeInputCheckFailure("Not initialized (setUpstreamParameters)");
+        hidl_cb(res.success, res.errMsg);
+        fl.setResult(res.success, res.errMsg);
+    }
+    else if (!prefixParser.add(prefix)) {
         BoolResult res = makeInputCheckFailure(prefixParser.getLastErrAsStr());
         hidl_cb(res.success, res.errMsg);
         fl.setResult(res.success, res.errMsg);
diff --git a/msm8998/hal/src/PrefixParser.cpp b/msm8998/hal/src/PrefixParser.cpp
index 60aae08..d38bec0 100644
--- a/msm8998/hal/src/PrefixParser.cpp
+++ b/msm8998/hal/src/PrefixParser.cpp
@@ -118,6 +118,9 @@
 
 /* ------------------------------ PRIVATE ----------------------------------- */
 bool PrefixParser::add(vector<string> in, IP_FAM famHint) {
+    if (in.size() == 0)
+        return false;
+
     for (size_t i = 0; i < in.size(); i++) {
         if (!add(in[i], famHint))
             return false;
@@ -126,6 +129,11 @@
 } /* add */
 
 bool PrefixParser::add(string in, IP_FAM famHint) {
+    if (in.length() == 0) {
+        mLastErr = "Failed to parse string, length = 0...";
+        return false;
+    }
+
     if (famHint == IP_FAM::INVALID)
         famHint = guessIPFamily(in);
 
@@ -138,8 +146,10 @@
     }
 
     int mask = parseSubnetMask(subnet, famHint);
-    if (!isMaskValid(mask, famHint))
+    if (!isMaskValid(mask, famHint)) {
+        mLastErr = "Invalid mask";
         return false;
+    }
 
     Prefix pre = makeBlankPrefix(famHint);
 
diff --git a/msm8998/ipacm/src/IPACM_OffloadManager.cpp b/msm8998/ipacm/src/IPACM_OffloadManager.cpp
index 04f6806..332abd5 100644
--- a/msm8998/ipacm/src/IPACM_OffloadManager.cpp
+++ b/msm8998/ipacm/src/IPACM_OffloadManager.cpp
@@ -226,8 +226,8 @@
 	IPACMDBG_H("removeDownstream name(%s), ip-family(%d) \n", downstream_name, prefix.fam);
 	if(ipa_get_if_index(downstream_name, &index))
 	{
-		IPACMERR("netdev(%s) already removed, ignored\n", downstream_name);
-		return SUCCESS;
+		IPACMERR("fail to get iface index.\n");
+		return FAIL_HARDWARE;
 	}
 
 	evt_data = (ipacm_event_ipahal_stream*)malloc(sizeof(ipacm_event_ipahal_stream));