[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]);
}