Query the status information of the network section using the Linux system API.

After testing, calling the system API still cannot effectively detect the insertion/removal of the ETH cable; modifications were made only to the status retrieval part.
This commit is contained in:
BuGu
2025-02-24 15:53:20 +08:00
parent 5e3c4d98f2
commit 7795191a46
4 changed files with 132 additions and 74 deletions

View File

@@ -46,13 +46,13 @@ typedef struct {
uint8_t wifi_addr[16] = {0}; // WiFi ip
uint8_t tail_addr[16] = {0}; // Tailscale ip
uint8_t rndis_addr[16] = {0}; // RNDIS ip
int8_t eth_state = NIC_STATE_UNKNOWN; // cat /sys/class/net/eth0/carrier
int8_t wifi_state = NIC_STATE_UNKNOWN; // cat /sys/class/net/wlan0/carrier
int8_t tail_state = NIC_STATE_UNKNOWN; // ifconfig tailscale0 | grep 'inet addr' | awk '{print $2}'
int8_t eth_state = -1; // cat /sys/class/net/eth0/carrier
int8_t wifi_state = -1; // cat /sys/class/net/wlan0/carrier
int8_t tail_state = -1; // ifconfig tailscale0 | grep 'inet addr' | awk '{print $2}'
int8_t hdmi_state = -1; // cat /proc/cvitek/vi_dbg | grep VIFPS | awk '{print $3}' (1s)
int8_t usb_state = -1; // cat /sys/class/udc/4340000.usb/state
int8_t hid_state = -1; // (exist?) /sys/kernel/config/usb_gadget/g0/configs/c.1/hid.GSn(n=012)
int8_t rndis_state = NIC_STATE_UNKNOWN; // (exist?) /sys/kernel/config/usb_gadget/g0/configs/c.1/rndis.usb0
int8_t rndis_state = -1; // (exist?) /sys/kernel/config/usb_gadget/g0/configs/c.1/rndis.usb0
int8_t udisk_state = -1; // (exist?) /sys/kernel/config/usb_gadget/g0/configs/c.1/mass_storage.disk0
int8_t host_pwr_state = -1; // cat /sys/class/gpio/gpio504/value
int16_t hdmi_width = 0; // cat /kvmapp/kvm/width
@@ -78,13 +78,13 @@ typedef struct {
uint8_t wifi_addr[16] = {0}; // WiFi ip
uint8_t tail_addr[16] = {0}; // Tailscale ip
uint8_t rndis_addr[16] = {0}; // RNDIS ip
int8_t eth_state = NIC_STATE_UNKNOWN; // cat /sys/class/net/eth0/carrier
int8_t wifi_state = NIC_STATE_UNKNOWN; // cat /sys/class/net/wlan0/carrier
int8_t tail_state = NIC_STATE_UNKNOWN; // ifconfig tailscale0 | grep inet\ addr | awk '{print $2}'
int8_t eth_state = -1; // cat /sys/class/net/eth0/carrier
int8_t wifi_state = -1; // cat /sys/class/net/wlan0/carrier
int8_t tail_state = -1; // ifconfig tailscale0 | grep inet\ addr | awk '{print $2}'
int8_t hdmi_state = -1; // cat /proc/cvitek/vi_dbg | grep VIFPS | awk '{print $3}' (1s)
int8_t usb_state = -1; // cat /sys/class/udc/4340000.usb/state
int8_t hid_state = -1; // (exist?) /sys/kernel/config/usb_gadget/g0/configs/c.1/hid.GSn(n=012)
int8_t rndis_state = NIC_STATE_UNKNOWN; // (exist?) /sys/kernel/config/usb_gadget/g0/configs/c.1/rndis.usb0
int8_t rndis_state = -1; // (exist?) /sys/kernel/config/usb_gadget/g0/configs/c.1/rndis.usb0
int8_t udisk_state = -1; // (exist?) /sys/kernel/config/usb_gadget/g0/configs/c.1/mass_storage.disk0
int8_t host_pwr_state = -1; // cat /sys/class/gpio/gpio504/value
int16_t hdmi_width = -1; // cat /kvmapp/kvm/width

View File

@@ -1,6 +1,5 @@
#include "config.h"
#include "system_init.h"
#include "system_state.h"
using namespace maix;
using namespace maix::sys;

View File

@@ -10,6 +10,32 @@ using namespace maix::sys;
extern kvm_sys_state_t kvm_sys_state;
extern kvm_oled_state_t kvm_oled_state;
int get_nic_state(const char* interface_name)
{
int sock;
struct ifreq ifr;
int ret = NIC_STATE_NO_EXIST;
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
return ret;
}
strcpy(ifr.ifr_name, interface_name);
if (ioctl(sock, SIOCGIFFLAGS, &ifr) < 0) {
close(sock);
return ret;
}
if (ifr.ifr_flags & IFF_UP) {
if (ifr.ifr_flags & IFF_RUNNING) {
ret = NIC_STATE_RUNNING;
} else {
ret = NIC_STATE_UP;
}
} else {
ret = NIC_STATE_DOWN;
}
close(sock);
return ret;
}
// net_port
int get_ip_addr(ip_addr_t ip_type)
{
@@ -146,17 +172,29 @@ int get_ip_addr(ip_addr_t ip_type)
return 0;
}
int chack_net_state(ip_addr_t use_ip_type)
{
char Cmd[100]={0};
if (use_ip_type == ETH_ROUTE) sprintf( Cmd,"ping -I eth0 -w 1 %s > /dev/null", kvm_sys_state.eth_route);
else if (use_ip_type == WiFi_ROUTE) sprintf( Cmd,"ping -I wlan0 -w 1 %s > /dev/null", kvm_sys_state.wifi_route);
else return -1; // 不支持的端口
if(system(Cmd) == 0){ // 256不通 = 0
return 1;
}
return 0;
}
void patch_eth_wifi(void)
{
// system("ip link set eth0 down");
// system("ip link set eth0 up");
// system("udhcpc -i eth0 &");
}
int kvm_wifi_exist()
{
// if(access("/sys/bus/sdio/devices/mmc1*", F_OK) == 0) return 1;
// else return 0;
uint8_t RW_Data[10];
FILE *fp;
fp = popen("ifconfig | grep wlan", "r");
fgets((char*)RW_Data, 2, fp);
pclose(fp);
if(RW_Data[0] == 'w') return 1;
else return 0;
if (get_nic_state("wlan0") == NIC_STATE_NO_EXIST) return 0;
else return 1;
}
void kvm_update_usb_state()
@@ -301,85 +339,104 @@ void kvm_update_hdmi_res(void)
kvm_sys_state.hdmi_height = atoi((char*)RW_Data);
}
int get_nic_state(const char* interface_name)
{
int sock;
struct ifreq ifr;
int ret = NIC_STATE_NO_EXIST;
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
return ret;
}
strcpy(ifr.ifr_name, interface_name);
if (ioctl(sock, SIOCGIFFLAGS, &ifr) < 0) {
close(sock);
return ret;
}
if (ifr.ifr_flags & IFF_UP) {
if (ifr.ifr_flags & IFF_RUNNING) {
ret = NIC_STATE_RUNNING;
} else {
ret = NIC_STATE_UP;
}
} else {
ret = NIC_STATE_DOWN;
}
close(sock);
return ret;
}
void kvm_update_eth_state(void)
{
kvm_sys_state.eth_state = get_nic_state("eth0");
{
static uint8_t nic_state = 0;
nic_state = get_nic_state("eth0");
if(kvm_sys_state.eth_state != NIC_STATE_DOWN){
if(nic_state == NIC_STATE_RUNNING){
// Get IP
if(strcmp(ip_address()["eth0"].c_str(), (char*)kvm_sys_state.eth_addr) != 0){
get_ip_addr(ETH_IP);
if(get_ip_addr(ETH_IP)){
kvm_sys_state.eth_state = 2;
} else {
kvm_sys_state.eth_state = 1;
return;
}
}
// ping route
if(kvm_sys_state.eth_route[0] == 0){
get_ip_addr(ETH_ROUTE);
} else {
if(chack_net_state(ETH_ROUTE)){
// 网络通
kvm_sys_state.eth_state = 3;
} else {
kvm_sys_state.eth_state = 2;
}
}
} else {
kvm_sys_state.eth_state = 0;
patch_eth_wifi();
}
}
void kvm_update_wifi_state(void)
{
{
// 无wifi模块(检测存在?)->有模块&未联网(检测是否联网)->
if(kvm_sys_state.wifi_state == -2) return;
kvm_sys_state.wifi_state = get_nic_state("wlan0");
switch (kvm_sys_state.wifi_state) {
case -2:
system("rm /etc/kvm/wifi_exist");
break;
switch (kvm_sys_state.wifi_state){
case -1:
// 初始缺省值
if (kvm_wifi_exist()) {
kvm_sys_state.wifi_state = 0;
system("touch /etc/kvm/wifi_exist");
}
else {
kvm_sys_state.wifi_state = -2; // 不存在wifi模块,直接跳出
system("rm /etc/kvm/wifi_exist");
return;
}
// break; // 直接开始检测联网
case 0:
system("touch /etc/kvm/wifi_exist");
// 存在WiFi&未联网
system("echo 0 > /kvmapp/kvm/wifi_state");
if (get_ip_addr(WiFi_IP) && get_ip_addr(WiFi_ROUTE)){
// 已获取ip+route
if (chack_net_state(WiFi_ROUTE)){
// ping 通
kvm_sys_state.wifi_state = 1;
}
}
break;
case 1:
// 已联网&持续检测是否能ping通
system("echo 1 > /kvmapp/kvm/wifi_state");
get_ip_addr(WiFi_IP);
break;
if (kvm_sys_state.wifi_route[0] != 0){
if (chack_net_state(WiFi_ROUTE) == 0){
// ping 通
kvm_sys_state.wifi_state = 0;
}
}
// default:
// kvm_sys_state.wifi_state = -1;
}
}
void kvm_update_rndis_state(void)
{
kvm_sys_state.rndis_state = get_nic_state("usb0");
if(kvm_sys_state.rndis_state != NIC_STATE_UP){
get_ip_addr(RNDIS_IP);
if (get_nic_state("usb0") == NIC_STATE_RUNNING) {
if(kvm_sys_state.rndis_state != 1) {
if (get_ip_addr(RNDIS_IP)) {
kvm_sys_state.rndis_state = 1;
}
}
}
else kvm_sys_state.rndis_state = 0;
}
void kvm_update_tailscale_state(void)
{
kvm_sys_state.tail_state = get_nic_state("tailscale0");
if(kvm_sys_state.tail_state != NIC_STATE_UP){
get_ip_addr(Tailscale_IP);
if (get_nic_state("tailscale0") == NIC_STATE_RUNNING) {
if(kvm_sys_state.tail_state != 1){
if (get_ip_addr(Tailscale_IP)) {
kvm_sys_state.tail_state = 1;
}
}
}
else kvm_sys_state.tail_state = 0;
}
//============================================================================
@@ -387,4 +444,4 @@ void kvm_update_tailscale_state(void)
uint8_t ion_free_space(void)
{
//cat /sys/kernel/debug/ion/cvi_carveout_heap_dump/summary | grep "usage rate:" | awk '{print $2}'
}
}

View File

@@ -2,19 +2,21 @@
#define SYSTEM_STATE_H_
#include "config.h"
enum ip_addr_t
{
ETH_IP=1, WiFi_IP, Tailscale_IP, RNDIS_IP, ETH_ROUTE, WiFi_ROUTE, NULL_IP
};
#define NIC_STATE_UP 1
#define NIC_STATE_DOWN 0
#define NIC_STATE_RUNNING 2
#define NIC_STATE_UNKNOWN -1
#define NIC_STATE_NO_EXIST -2
enum ip_addr_t
{
ETH_IP=1, WiFi_IP, Tailscale_IP, RNDIS_IP, ETH_ROUTE, WiFi_ROUTE, NULL_IP
};
// net_port
int get_ip_addr(ip_addr_t ip_type);
int chack_net_state(ip_addr_t use_ip_type);
void patch_eth_wifi(void);
int kvm_wifi_exist();
void kvm_update_usb_state();
void kvm_update_hdmi_state();