[Feature][API-976][Tool]add rsgmii for factory

Change-Id: I0cf996f8a75305c53d1e4c6b41d6437c61aead01
diff --git a/src/lynq/framework/lynq-ril-service/src/factory/lynq_factory.cpp b/src/lynq/framework/lynq-ril-service/src/factory/lynq_factory.cpp
index 02ab11b..f72239a 100755
--- a/src/lynq/framework/lynq-ril-service/src/factory/lynq_factory.cpp
+++ b/src/lynq/framework/lynq-ril-service/src/factory/lynq_factory.cpp
@@ -9,6 +9,11 @@
 #include <hardware_legacy/power.h>
 #include <vendor-ril/telephony/ril.h>
 #include <telephony/ril_cdma_sms.h>
+#include <sys/socket.h>
+#include <sys/time.h>
+#include <error.h>
+#include <string.h>
+#include <net/if.h>
 
 #include <telephony/record_stream.h>
 #include <utils/SystemClock.h>
@@ -270,6 +275,229 @@
     return;
 }
 
+float time_differnce(struct timeval time1,struct timeval time2)
+{
+    float a = (time2.tv_sec+time2.tv_usec*0.000001)-(time1.tv_sec+time1.tv_usec*0.000001);
+    return a;
+}
+int receive_data(int fd,char *buf_send,char *buf_recv)
+{
+    struct timeval time_strart={0,0};
+    struct timeval time_end={0,0};
+    int ret = 0;
+    for(int recv =0;recv <10;recv++)
+    {
+        ret = recvfrom(fd,buf_recv,1024,0,NULL,NULL);
+        gettimeofday(&time_strart,NULL);
+        if(ret<0 && errno==EAGAIN)
+        {
+            lynq_factory_response_ttyGS3("time_out\n");
+            return -1;
+        }
+
+        if(memcmp(buf_send,buf_recv,sizeof(*buf_recv)))
+        {   
+            gettimeofday(&time_end,NULL);
+            if(time_differnce(time_strart,time_end)<2)
+            {
+                usleep(10000);
+            }
+            lynq_factory_response_ttyGS3("differnce and try again\n");
+        }
+        else
+        {
+            return 0;
+        }
+    } 
+    lynq_factory_response_ttyGS3("can't receive correct data\n");
+    return -1;
+}
+void rsgmii_init()
+{
+    char lynq_set_rgmii_arr[256] = {0};
+
+    bzero(lynq_set_rgmii_arr, 256);
+    sprintf(lynq_set_rgmii_arr,"ifconfig eth1 192.168.11.1");
+    system(lynq_set_rgmii_arr);
+
+    bzero(lynq_set_rgmii_arr, 256);
+    sprintf(lynq_set_rgmii_arr,"ifconfig eth2 192.168.22.2");
+    system(lynq_set_rgmii_arr);
+
+    
+    bzero(lynq_set_rgmii_arr, 256);
+    sprintf(lynq_set_rgmii_arr,"ifconfig eth1 | grep HWaddr | awk '{print \"ip n add 192.168.11.1 lladdr \"$5\" dev eth2\"}' | sh");
+    system(lynq_set_rgmii_arr);
+
+    bzero(lynq_set_rgmii_arr, 256);
+    sprintf(lynq_set_rgmii_arr,"ifconfig eth2 | grep HWaddr | awk '{print \"ip n add 192.168.22.2 lladdr \"$5\" dev eth1\"}' | sh");
+    system(lynq_set_rgmii_arr);
+
+    bzero(lynq_set_rgmii_arr, 256);
+    sprintf(lynq_set_rgmii_arr,"iptables -t nat -A POSTROUTING -s 192.168.22.2 -d 192.168.11.1 -j SNAT --to-source 192.168.22.44");
+    system(lynq_set_rgmii_arr);
+
+    bzero(lynq_set_rgmii_arr, 256);
+    sprintf(lynq_set_rgmii_arr,"iptables -t nat -A POSTROUTING -s 192.168.11.1 -d 192.168.22.2 -j SNAT --to-source 192.168.11.33");
+    system(lynq_set_rgmii_arr);
+
+}
+int rsgmii_socket_init(int ser_socket,int cli_socket,struct sockaddr_in* server_addr,struct sockaddr_in* client_addr,
+                    struct ifreq*cli,struct ifreq*ser)
+{
+    struct timeval timeout={2,0};
+    int ret;
+    ret = bind(ser_socket,(struct sockaddr*)server_addr,sizeof(*server_addr));
+    if(ret< 0)
+    {
+        return -1;
+    }
+    ret = bind(cli_socket,(struct sockaddr*)client_addr,sizeof(*client_addr));
+    if(ret<0)
+    {
+        return -1;
+    }
+
+    ret = setsockopt(cli_socket,SOL_SOCKET,SO_BINDTODEVICE,(char *)cli,sizeof(*cli));
+    if(ret < 0)
+    {
+       return -1;
+    }
+    ret = setsockopt(cli_socket,SOL_SOCKET,SO_RCVTIMEO,&timeout,sizeof(timeout));
+    if(ret< 0)
+    {
+        return -1;
+    }
+
+    ret = setsockopt(ser_socket,SOL_SOCKET,SO_BINDTODEVICE,(char *)ser,sizeof(*ser));
+    if(ret< 0)
+    {
+        return -1;
+    }
+    ret = setsockopt(ser_socket,SOL_SOCKET,SO_RCVTIMEO,&timeout,sizeof(timeout));
+    if(ret< 0)
+    {
+        return -1;
+    }
+    return 0;
+
+}
+
+void lynq_handle_rsgmii()
+{
+    
+    int ret;
+    char buf_init[1024];char *init_addr=buf_init;
+    char buf_tran[1024];char *tran_addr=buf_tran;
+    char buf_recv[1024];char *recv_addr=buf_recv;
+    bzero(buf_init,sizeof(buf_init));
+    bzero(buf_tran,sizeof(buf_tran));
+    bzero(buf_recv,sizeof(buf_recv));
+    
+    const char *ser_addr = "192.168.22.2";
+    const char *cli_addr = "192.168.11.1";
+    struct ifreq ser;
+    struct ifreq cli;
+    memset(&ser,0x00,sizeof(ser));
+    memset(&cli,0x00,sizeof(cli));
+    strncpy(ser.ifr_name,"eth2",strlen("eth2"));
+    strncpy(cli.ifr_name,"eth1",strlen("eth1"));
+ 
+    int count = 0;
+    rsgmii_init();
+
+
+    struct sockaddr_in server_addr;
+    server_addr.sin_family=AF_INET;
+    server_addr.sin_port = htons(100);
+    server_addr.sin_addr.s_addr = inet_addr(ser_addr);
+
+    struct sockaddr_in client_addr;
+    client_addr.sin_family=AF_INET;
+    client_addr.sin_port = htons(100);
+    client_addr.sin_addr.s_addr = inet_addr(cli_addr);
+    int ser_socket = socket(AF_INET,SOCK_DGRAM,0);
+    if (ser_socket<0)
+    {
+	    lynq_factory_response_ttyGS3("ERROR1\n");
+        return;
+    }
+    int cli_socket = socket(AF_INET,SOCK_DGRAM,0);
+    if (cli_socket<0)
+    {
+	    lynq_factory_response_ttyGS3("ERROR2\n");
+        return;
+    }
+    ret =rsgmii_socket_init(ser_socket,cli_socket,&server_addr,&client_addr,&cli,&ser);
+    if(ret)
+    {
+        close(ser_socket);
+        close(cli_socket);
+        lynq_factory_response_ttyGS3("init_failed\n");
+        lynq_factory_response_ttyGS3("ERROR3\n");
+        return;
+    }
+
+    //data content
+    for(int j =0;j<4;j++)
+    {
+        for(int i =0;i<121;i++)
+        {      
+            count += sprintf(buf_init + count,"%c",i);
+            if (count >= 1024)
+            {
+                buf_init[1023] = '\0';
+                break;
+            }
+        }
+        
+        if (count >= 1024)
+        {
+            break;
+        }
+    }
+    ret = sendto(cli_socket,buf_init,strlen(buf_init),0,(struct sockaddr*)&server_addr,sizeof(server_addr));
+    if(ret <0)
+    {	
+        close(ser_socket);
+        close(cli_socket);
+	    lynq_factory_response_ttyGS3("ERROR4\n");
+        return;
+    }
+    ret = receive_data(ser_socket,init_addr,tran_addr);
+    if(ret)
+    {
+        lynq_factory_response_ttyGS3("ERROR5\n");
+        close(ser_socket);
+        close(cli_socket);
+        return;
+    }
+
+    //ser receive data and send back the same of data to cli
+    ret = sendto(ser_socket,buf_tran,strlen(buf_tran),0,(struct sockaddr*)&client_addr,sizeof(client_addr));
+    if(ret <0)
+    {
+        close(ser_socket);
+        close(cli_socket);
+	    lynq_factory_response_ttyGS3("ERROR6\n");
+        return;
+    }
+    ret = receive_data(cli_socket,init_addr,recv_addr);
+    if(ret)
+    {
+        lynq_factory_response_ttyGS3("ERROR7\n");
+        close(ser_socket);
+        close(cli_socket);
+        return;
+    }
+    else
+    {
+        close(ser_socket);
+        close(cli_socket);
+        lynq_factory_response_ttyGS3("OK\n");
+        return;
+    }
+}
 
 static void lynq_gps_open(char *num){
     if(already_gps == 1){
@@ -771,6 +999,9 @@
     else if(!strcmp(argv[3], "sink")){
         lynq_test_sink();
     }
+    else if(!strcmp(argv[3], "rsgmii")){
+        lynq_handle_rsgmii();
+    }
     else if(!strcmp(argv[3], "rgmii")){
         lynq_test_RGMII(argv[4]);
     }