netd: softap: Change "set" to use separate arguments

Change-Id: Id5f2adb41c671f2978fa3fe939b1a3b15a537165
Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
diff --git a/SoftapController.cpp b/SoftapController.cpp
index 66310b1..b5a68e0 100644
--- a/SoftapController.cpp
+++ b/SoftapController.cpp
@@ -60,11 +60,6 @@
         return ret;
     }
     priv_ptr = (struct iw_priv_args *)wrq.u.data.pointer;
-#if 0
-    for(i=0;(i < wrq.u.data.length);i++) {
-        LOGE("%s: [%x] %s\n", __func__, priv_ptr[i].cmd, priv_ptr[i].name);
-    }
-#endif
     for(i=0;(i < wrq.u.data.length);i++) {
         if (strcmp(priv_ptr[i].name, fname) == 0)
             return priv_ptr[i].cmd;
@@ -98,7 +93,6 @@
         /* start hostapd */
         return ret;
     } else {
-        LOGD("Softap Started: %s", mIface);
         fnum = getPrivFuncNum(mIface, "AP_BSS_START");
         if (fnum < 0) {
             LOGE("Softap start - function not supported");
@@ -125,13 +119,12 @@
     struct iwreq wrq;
     int fnum, ret;
 
-    LOGD("Softap stop");
     if (mPid == 0) {
         LOGE("Softap already stopped");
         return 0;
     }
     if (mSock < 0) {
-        LOGE("Failed to open socket");
+        LOGE("Softap stop - failed to open socket");
         return -1;
     }
     fnum = getPrivFuncNum(mIface, "WL_AP_STOP");
@@ -158,23 +151,39 @@
     return (mPid != 0 ? true : false);
 }
 
+int SoftapController::addParam(int pos, const char *cmd, const char *arg)
+{
+    if (pos < 0)
+        return pos;
+    if ((unsigned)(pos + strlen(cmd) + strlen(arg) + 1) >= sizeof(mBuf)) {
+        LOGE("Command line is too big");
+        return -1;
+    }
+    pos += sprintf(&mBuf[pos], "%s=%s,", cmd, arg);
+    return pos;
+}
+
 /*
  * Arguments:
  *      argv[2] - wlan interface
  *      argv[3] - softap interface
- *      argv[4] - command line
+ *      argv[4] - SSID
+ *	argv[5] - Security
+ *	argv[6] - Key
+ *	argv[7] - Channel
+ *	argv[8] - Preamble
+ *	argv[9] - Max SCB
  */
 int SoftapController::setSoftap(int argc, char *argv[]) {
     struct iwreq wrq;
-    int fnum, ret;
+    int fnum, ret, i = 0;
 
-    LOGD("Softap set");
     if (mSock < 0) {
-        LOGE("Failed to open socket");
+        LOGE("Softap set - failed to open socket");
         return -1;
     }
     if (argc < 4) {
-        LOGE("Missing arguments");
+        LOGE("Softap set - missing arguments");
         return -1;
     }
 
@@ -186,9 +195,44 @@
 
     strncpy(mIface, argv[3], sizeof(mIface));
     strncpy(wrq.ifr_name, argv[2], sizeof(wrq.ifr_name));
-    if (argc >= 4) {
-        strncpy(mBuf, argv[4], sizeof(mBuf));
+
+    /* Create command line */
+    i = addParam(i, "ASCII_CMD", "AP_CFG");
+    if (argc > 4) {
+        i = addParam(i, "SSID", argv[4]);
+    } else {
+        i = addParam(i, "SSID", "AndroidAP");
     }
+    if (argc > 5) {
+        i = addParam(i, "SEC", argv[5]);
+    } else {
+        i = addParam(i, "SEC", "open");
+    }
+    if (argc > 6) {
+        i = addParam(i, "KEY", argv[6]);
+    } else {
+        i = addParam(i, "KEY", "12345678");
+    }
+    if (argc > 7) {
+        i = addParam(i, "CHANNEL", argv[7]);
+    } else {
+        i = addParam(i, "CHANNEL", "6");
+    }
+    if (argc > 8) {
+        i = addParam(i, "PREAMBLE", argv[8]);
+    } else {
+        i = addParam(i, "PREAMBLE", "0");
+    }
+    if (argc > 9) {
+        i = addParam(i, "MAX_SCB", argv[9]);
+    } else {
+        i = addParam(i, "MAX_SCB", "8");
+    }
+    if ((i < 0) || ((unsigned)(i + 4) >= sizeof(mBuf))) {
+        LOGE("Softap set - command is too big");
+        return i;
+    }
+    sprintf(&mBuf[i], "END");
 
     wrq.u.data.length = strlen(mBuf) + 1;
     wrq.u.data.pointer = mBuf;