一、usb網卡應該如何實現?
前文講了如何利用開源軟件ifplugd實現監測網口狀態變化,
ifplugd的確可以實現監測網卡的狀態,并執行相應腳本,
但是有個前提,就是網口已經注冊到系統中,即用ifconfig -a能查看到
如何是usb網卡這種設備,在插入usb口之后網口設備才會注冊,
使用過程中可能隨時會拔掉usb網卡,
那么這種情況下,要想設置usb網卡,那么就就需要修改ifplugd程序。
為了方便大家理解,本文給大家講解如何自己實現一個簡化的程序ethcheck,
可以實現自動監測網卡是否存在
rk3568所有網口:
rk3568_r:/system#ifconfig-a loLinkencap:LocalLoopback inetaddr:127.0.0.1Mask:255.0.0.0 inet6addr:::1/128Scope:Host UPLOOPBACKRUNNINGMTU:65536Metric:1 RXpackets:0errors:0dropped:0overruns:0frame:0 TXpackets:0errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:1000 RXbytes:0TXbytes:0 dummy0Linkencap:EthernetHWaddrfa6c1b:7d inet6addr:fe80:6cff1b7d/64Scope:Link UPBROADCASTRUNNINGNOARPMTU:1500Metric:1 RXpackets:0errors:0dropped:0overruns:0frame:0 TXpackets:8errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:1000 RXbytes:0TXbytes:560 sit0Linkencap:IPv6-in-IPv4 NOARPMTU:1480Metric:1 RXpackets:0errors:0dropped:0overruns:0frame:0 TXpackets:0errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:1000 RXbytes:0TXbytes:0 ip6tnl0Linkencap:UNSPEC NOARPMTU:1452Metric:1 RXpackets:0errors:0dropped:0overruns:0frame:0 TXpackets:0errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:1000 RXbytes:0TXbytes:0 eth1Linkencap:EthernetHWaddr5a63dd:0bDriverrk_gmac-dwmac UPBROADCASTMULTICASTMTU:1500Metric:1 RXpackets:0errors:0dropped:0overruns:0frame:0 TXpackets:0errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:1000 RXbytes:0TXbytes:0 Interrupt:51 ip_vti0Linkencap:UNSPEC NOARPMTU:1480Metric:1 RXpackets:0errors:0dropped:0overruns:0frame:0 TXpackets:0errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:1000 RXbytes:0TXbytes:0 eth0Linkencap:EthernetHWaddr5e63dd:0bDriverrk_gmac-dwmac UPBROADCASTMULTICASTMTU:1500Metric:1 RXpackets:0errors:0dropped:0overruns:0frame:0 TXpackets:0errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:1000 RXbytes:0TXbytes:0 Interrupt:38 ip6_vti0Linkencap:UNSPEC NOARPMTU:1364Metric:1 RXpackets:0errors:0dropped:0overruns:0frame:0 TXpackets:0errors:0dropped:0overruns:0carrier:0 collisions:0txqueuelen:1000 RXbytes:0TXbytes:0
二、程序設計
0.程序框圖

1. 設置程序為守護進程
因為該程序最終要在后臺執行,并且常駐內存,所以必須將該進程設置為守護進程
參考代碼如下:
voidinit_daemon(void)
{
intpid;
inti;
if(pid=fork())
exit(0);//是父進程,結束父進程?
elseif(pid0)
??exit(1);//fork失敗,退出?
?
//是第一子進程,后臺繼續執行?
?setsid();//第一子進程成為新的會話組長和進程組長?
//并與控制終端分離?
?chdir("/tmp");//改變工作目錄到/tmp?
?umask(0);//重設文件創建掩模?
?
?for(i=0;i
2. 確認制定網口是否存在?
要確認指定網口是否存在,主要通過/proc/net/dev 目錄下是否有該網口信息:
peng@ubuntu:~$cat/proc/net/dev
Inter-|Receive|Transmit
face|bytespacketserrsdropfifoframecompressedmulticast|bytespacketserrsdropfifocollscarriercompressed
lo:2616329200000026163292000000
eth0:2854447082432730000009182827088660000000
參考代碼:
staticchar*interface_name_cut(char*buf,char**name)
{
char*stat;
/*Skipwhitespace.Linewillincludeheaderspaces.*/
while(*buf=='')
buf++;
*name=buf;
/*Cutinterfacename.*/
stat=strrchr(buf,':');
*stat++='?';
returnstat;
}
/*
returnvalue:1exist0:no
*/
intcheck_interface_fromproc(char*interface)
{
FILE*fp;
charbuf[PROCBUFSIZ];
structinterface*ifp;
char*name;
/*Open/proc/net/dev.*/
fp=fopen(_PATH_PROC_NET_DEV,"r");
if(fp==NULL)
{
printf("openprocfileerror
");
return-1;
}
/*Dropheaderlines.*/
fgets(buf,PROCBUFSIZ,fp);
fgets(buf,PROCBUFSIZ,fp);
/*Onlyallocateinterfacestructure.Otherjobswillbedonein
if_ioctl.c.*/
while(fgets(buf,PROCBUFSIZ,fp)!=NULL)
{
interface_name_cut(buf,&name);
if(strcmp(interface,name)==0)
return1;
}
fclose(fp);
return0;
}
3. 指定網口不存在
如果檢測網口不存在,則需要休眠,然后繼續監測/proc/net/dev文件。
4. 如果指定網口存在
則獲取該網口的IP地址,然后比較是否是指定的IP地址
網卡IP地址的獲取,主要通過系統調用ioctl()的 SIOCGIFADDR命令實現
參考代碼如下:
intgetLocalIp(constchar*eth,char*ip){
structifreqifr;
structsockaddr_insin;
intfd;
bzero(&ifr,sizeof(ifr));
if((fd=socket(AF_INET,SOCK_STREAM,0))0)?{
????????return?-1;
????}
????strcpy(ifr.ifr_name,?eth);
????if?(ioctl(fd,?SIOCGIFADDR,?&ifr)?0)?{
????????close(fd);
????????return?-1;
????}
????memcpy(&sin,?&ifr.ifr_addr,?sizeof(sin));
????snprintf(ip,?IP_SIZE,?"%s",?inet_ntoa(sin.sin_addr));
????close(fd);
????return?0;
}
讀取的ip地址存放在參數ip指向的內存中。
5. ip地址相同
如果網卡地址與指定的ip地址相同,那么不需要修改地址,休眠一段時間(根據實際操作的頻率設置時間),然后再監測網口是否存在
6. IP地址不相同
如果ip地址不相同,則需要修改ip地址,
執行我們提前設置好的腳本if.sh即可
#!/bin/bash
IPADDR=192.168.40.8
ETHPORT=eth1
echo"ethcheckset"$ETHPORT$IPADDR
echo$#
echo$0
echo$1
echo$2
if[$#-eq2];then
if[$1=$ETHPORT];then
echo$ETHPORT
if[$2="up"];then
ifconfig$ETHPORT$IPADDR
sleep1
ipruleaddfromalllookupmainpref9000
sleep1
echo1>/proc/sys/net/ipv4/ip_forward
iptables-F
echo"set"$ETHPORT"done"
elif[$2="down"];then
echo"down"
elif[$2="disable"];then
echo"disable"
elif[$2="error"];then
echo"error"
fi
fi
fi
審核編輯:劉清
-
USB接口
+關注
關注
9文章
715瀏覽量
59037 -
RK3568
+關注
關注
5文章
644瀏覽量
7951
發布評論請先 登錄
想要自己實現一個bootloader,APROM中程序如何實現跳轉,中斷向量表如何設置?
用FPGA實現DES算法的密鑰簡化算法
程序運行之后把自己刪除的方法
利用USBXpress開發包簡化應用程序實現USB通信設計
如何自己制作一個單片機開發板
自己如何實現一個簡化的程序ethcheck?
評論