Squashed 'LYNQ_PUBLIC/' content from commit 79d8f932f
git-subtree-dir: LYNQ_PUBLIC
git-subtree-split: 79d8f932fb4ebc4b5aec6c5ace97634912394272
Change-Id: If2527ba937f56fe989487bf71e996f7cfd9fbe61
diff --git a/common_src/lib/liblynq-protcl/dhcp/lynq_dhcp.c b/common_src/lib/liblynq-protcl/dhcp/lynq_dhcp.c
new file mode 100644
index 0000000..ddc796c
--- /dev/null
+++ b/common_src/lib/liblynq-protcl/dhcp/lynq_dhcp.c
@@ -0,0 +1,334 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include "dhcp/lynq_dhcp.h"
+
+bool isVaildIp(const char *ip)
+{
+ int dots = 0; /*number of char*/
+ int setions = 0; /*part of ip(0-255)*/
+
+ if (NULL == ip || *ip == '.') { /*排除输入参数为NULL, 或者一个字符为'.'的字符串*/
+ return false;
+ }
+
+ while (*ip) {
+
+ if (*ip == '.') {
+ dots ++;
+ if (setions >= 0 && setions <= 255) { /*judge ip is vaild*/
+ setions = 0;
+ ip++;
+ continue;
+ }
+ return false;
+ }
+ else if (*ip >= '0' && *ip <= '9') { /*judge is number*/
+ setions = setions * 10 + (*ip - '0'); /*求每一段总和*/
+ } else
+ return false;
+ ip++;
+ }
+
+ if (setions >= 0 && setions <= 255) { /*判断IP最后一段是否合法*/
+ if (dots == 3) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void Restart_Dhcp(char* if_name)
+{
+ char gyCmd[128] = {0};
+ sprintf(gyCmd,"ifconfig %s down",if_name);
+ system(gyCmd);
+ //printf("gyCmd=%s\n",gyCmd);
+ sprintf(gyCmd,"ifconfig %s up",if_name);
+ system(gyCmd);
+ //printf("gyCmd=%s\n",gyCmd);
+}
+
+void lynq_dhcp_get_interfacelist(char* interface_name)
+{
+ char ifname[IFNAME_CNT][IFNAME] = {0};
+
+ char buf[IFNAME]={0};
+ int i=0;
+ FILE * fp = NULL;
+ char gyCmd[128] = {0};
+ //1.Start from the second row and loop to get the first column of data;2.Remove the space from start of line;3.Remove the ":" from end of line;
+ sprintf (gyCmd, "cat /proc/net/dev | awk '{i++; if(i>2){print $1}}' | sed 's/^[\t]*//g' | sed 's/[:]*$//g'");
+
+ //ifconfig | grep encap |grep -v lo | cut -d ' ' -f1
+ //sprintf (gyCmd, "ifconfig | grep flags |grep -v lo | cut -d ':' -f1");
+ fp = popen (gyCmd, "r");
+
+ while(fgets(buf, sizeof(buf), fp)!=NULL){
+ strtok(buf, "\n");
+ strcat(interface_name,buf);
+ strcat(interface_name,";");
+ }
+
+ pclose(fp);
+}
+
+void lynq_dhcp_get_address(char* inet_addr,int type)
+{
+ char ifname[IFNAME_CNT][IFNAME] = {0};
+ int i=0;
+ char buf[32]={0};
+ char interface_name[IFNAME] = {0};
+ char gyCmd[128] = {0};
+ FILE * fp = NULL;
+
+ lynq_dhcp_get_interfacelist(interface_name);
+ char delims[] = ";";
+ char *result = NULL;
+ result = strtok( interface_name, delims );
+ while( result != NULL ) {
+ strcpy(ifname[i++],result);
+ result = strtok( NULL, delims );
+ }
+ for(i=0;i<IFNAME_CNT;i++){
+ if(strlen(ifname[i])){
+ //printf("[%s][%d]ifname[%s]\n",__FUNCTION__,__LINE__,ifname[i]);
+ switch (type) {
+ case DHCP_IPADDR:
+ sprintf(gyCmd,"ifconfig %s | grep \"inet addr:\" | awk '{print $2}' | awk 'NR==1'",ifname[i]);
+ break;
+ case DHCP_NETMASK:
+ sprintf(gyCmd,"ifconfig %s | grep \"inet addr:\" | awk '{print $4}' | awk 'NR==1'",ifname[i]);
+ break;
+ case DHCP_GATEWAY:
+ sprintf(gyCmd,"route -n | grep %s | awk 'NR==1' | awk '{print $2}'",ifname[i]);
+ break;
+ case DHCP_BROADCAST:
+ sprintf(gyCmd,"ifconfig %s | grep \"inet addr:\" | awk '{print $6}' | awk 'NR==1'",ifname[i]);
+ break;
+ default:
+ break;
+ }
+ //printf("[%s][%d]gyCmd[%s]\n",__FUNCTION__,__LINE__,gyCmd);
+ fp = popen (gyCmd, "r");
+ if(fgets(buf, sizeof(buf), fp)!=NULL){
+ buf[strlen(buf)-1]='\0';
+ //printf("[%s][%d]strlen(buf)[%d][%s]\n",__FUNCTION__,__LINE__,strlen(buf),buf);
+ if(strlen(buf)>1){
+ if(strstr(buf, "Device not found") != NULL ){
+ strcat(inet_addr,ifname[i]);
+ strcat(inet_addr,":Not Found!;");
+ }else{
+ strcat(inet_addr,ifname[i]);
+ strcat(inet_addr,":");
+ strcat(inet_addr,buf);
+ strcat(inet_addr,";");
+ }
+
+ //printf("[%s][%d]addr[%s][%d]\n",__FUNCTION__,__LINE__,addr[i],i);
+ }else if(!strlen(buf)){
+ strcat(inet_addr,ifname[i]);
+ strcat(inet_addr,":Not Found!;");
+ //printf("[%s][%d]addr[%s][%d]\n",__FUNCTION__,__LINE__,addr[i],i);
+ }
+ }else{
+ strcat(inet_addr,ifname[i]);
+ strcat(inet_addr,":Not Found!;");
+
+ }
+ pclose(fp);
+ }
+ }
+ //printf("[%s][%d]addr[%s][%d]\n",__FUNCTION__,__LINE__,addr[i],i);
+
+}
+
+#if 0
+//ifconfig eth1 | grep "inet addr:" | awk '{print $2}' | cut -c 6-
+char* Get_Dhcp_Ip(char addr[16][64])
+{
+ char ifname[IFNAME_CNT][IFNAME] = {0};
+ int i=0;
+ char buf[IFNAME]={0};
+
+ char gyCmd[128] = {0};
+ FILE * fp = NULL;
+ Search_Interface(ifname);
+ for(i=0;i<IFNAME_CNT;i++){
+ if(strlen(ifname[i])){
+ printf("[%s][%d]ifname[%s]\n",__FUNCTION__,__LINE__,ifname[i]);
+ sprintf(gyCmd,"ifconfig %s | grep \"inet\" | awk '{print $2}' | awk 'NR==1'",ifname[i]);
+ fp = popen (gyCmd, "r");
+ while(fgets(buf, sizeof(buf), fp)!=NULL){
+ if(strstr(buf, "Device not found") != NULL ){
+ strcpy(addr[i],ifname[i]);
+ strcat(addr[i],":Not Found!");
+ }else{
+ if(strlen(buf)>1){
+ strtok(buf, "\n");
+
+ strcpy(addr[i],ifname[i]);
+ strcat(addr[i],":");
+ strcat(addr[i],buf);
+ //printf("[%s][%d]addr[%s][%d]\n",__FUNCTION__,__LINE__,addr[i],i);
+ }
+ }
+ }
+ pclose(fp);
+ }
+ }
+
+ return addr;
+}
+
+char* Get_Dhcp_NetMask(char addr[16][64])
+{
+ char ifname[IFNAME_CNT][IFNAME] = {0};
+ int i=0;
+ char buf[IFNAME]={0};
+
+ char gyCmd[128] = {0};
+ FILE * fp = NULL;
+ Search_Interface(ifname);
+ for(i=0;i<IFNAME_CNT;i++){
+ if(strlen(ifname[i])){
+ printf("[%s][%d]ifname[%s]\n",__FUNCTION__,__LINE__,ifname[i]);
+ sprintf(gyCmd,"ifconfig %s | grep \"inet\" | awk '{print $4}' | awk 'NR==1'",ifname[i]);
+ fp = popen (gyCmd, "r");
+ while(fgets(buf, sizeof(buf), fp)!=NULL){
+ if(strstr(buf, "Device not found") != NULL ){
+ strcpy(addr[i],ifname[i]);
+ strcat(addr[i],":Not Found!");
+ }else{
+ if(strlen(buf)>1){
+ strtok(buf, "\n");
+
+ strcpy(addr[i],ifname[i]);
+ strcat(addr[i],":");
+ strcat(addr[i],buf);
+ //printf("[%s][%d]addr[%s][%d]\n",__FUNCTION__,__LINE__,addr[i],i);
+ }
+ }
+ }
+ pclose(fp);
+ }
+ }
+
+ return addr;
+}
+#endif
+
+int lynq_dhcp_set_address(char *inet_addr,char *interface_name ,int type)
+{
+ char ifname[IFNAME_CNT][IFNAME] = {0};
+ int i=0;
+ int find=0;
+ char gyCmd[128] = {0};
+ char ifn[IFNAME] = {0};
+ char delims[] = ";";
+ char *result = NULL;
+ if (!isVaildIp(inet_addr)) {
+ return DHCP_FAIL_INVALID_IP;
+ }
+ lynq_dhcp_get_interfacelist(ifn);
+
+ result = strtok( ifn, delims );
+ while( result != NULL ) {
+ strcpy(ifname[i++],result);
+ result = strtok( NULL, delims );
+ }
+ if(interface_name==NULL)
+ return DHCP_FAIL_INVALID_IFNAME;
+ for(i=0;i<IFNAME_CNT;i++){
+ if(strlen(ifname[i]))
+ if(!strcmp(ifname[i],interface_name))
+ find=1;
+ }
+
+ switch (type) {
+ case DHCP_IPADDR:
+ sprintf(gyCmd,"ifconfig %s %s",interface_name,inet_addr);
+ system(gyCmd);
+ //printf("gyCmd=%s\n",gyCmd);
+ break;
+ case DHCP_NETMASK:
+ sprintf(gyCmd,"ifconfig %s netmask %s",interface_name,inet_addr);
+ system(gyCmd);
+ break;
+ case DHCP_GATEWAY:
+ sprintf(gyCmd,"route add %s gw %s ",interface_name,inet_addr);
+ system(gyCmd);
+ break;
+ case DHCP_BROADCAST:
+ sprintf(gyCmd,"ifconfig %s broadcast %s",interface_name,inet_addr);
+ system(gyCmd);
+ break;
+ default:
+ break;
+ }
+
+ Restart_Dhcp(interface_name);
+ if(find)
+ return DHCP_SUCCESS;
+ else
+ return DHCP_FAIL_NO_DEV;
+}
+
+int lynq_dhcp_enable(char* interface_name,int enable)
+{
+ char ifname[IFNAME_CNT][IFNAME] = {0};
+ int i=0;
+ char gyCmd[128] = {0};
+ int find=0;
+ char ifn[IFNAME] = {0};
+ char delims[] = ";";
+ char *result = NULL;
+ if(interface_name==NULL)
+ return DHCP_FAIL_INVALID_IFNAME;
+ lynq_dhcp_get_interfacelist(ifn);
+ result = strtok( ifn, delims );
+ while( result != NULL ) {
+ strcpy(ifname[i++],result);
+ result = strtok( NULL, delims );
+ }
+ for(i=0;i<IFNAME_CNT;i++){
+ if(strlen(ifname[i]))
+ if(!strcmp(ifname[i],interface_name))
+ find=1;
+ }
+ switch (enable) {
+ case DHCP_ON:
+ sprintf(gyCmd,"ifconfig %s up",interface_name);
+ break;
+ case DHCP_OFF:
+ sprintf(gyCmd,"ifconfig %s down",interface_name);
+ break;
+ default:
+ break;
+ }
+
+ if(find)
+ return DHCP_SUCCESS;
+ else
+ return DHCP_FAIL_NO_DEV;
+}
+#if 0
+//my_test1 0 192.168.125.55 eth1 0
+int main(int argc, char *argv[])
+{
+ char ip_addr[16][64] = {0};
+ int i;
+ char* buf=NULL;
+ //Get_Dhcp_Ip(ip_addr);
+ printf("%d\n",atoi(argv[1]));
+ Get_Dhcp(ip_addr,atoi(argv[1]));
+ for(i=0;i<IFNAME_CNT;i++){
+ printf("[%s][%d]out[%s][%d]\n",__FUNCTION__,__LINE__,ip_addr[i],i);
+ }
+ buf=Set_Dhcp(argv[2],argv[3],argv[4]);
+ printf("buf=%s\n",buf);
+ return 0;
+}
+#endif
\ No newline at end of file