嵌入式 hi3518平台增加路由代码
2023-09-27 14:29:31 时间
span
/********************************** (C) COPYRIGHT *******************************
* File Name : add_route.c
* Author : skdkjzz
* Date : 2014/08/09
* Description : 设置静态ip,添加路由表
*********************************************************************************/
#include error.h
#include stdio.h
#include string.h
#include net/if.h
#include stdlib.h
#include arpa/inet.h
#include asm/types.h /* glibc 2 conflicts with linux/types.h */
#include net/route.h
#include sys/errno.h
#include sys/ioctl.h
#include sys/types.h
#include sys/socket.h
#include netinet/in.h
#include net/if_arp.h
#include netinet/if_ether.h
#include fcntl.h
#include stdio.h
#include stdlib.h
#include errno.h
#include string.h
#include unistd.h
#include signal.h
#include dirent.h
#include arpa/inet.h
#include pthread.h
#include sys/vfs.h
#include sys/time.h
#include sys/wait.h
#include sys/ioctl.h
#include sys/types.h
#include sys/socket.h
#include net/if.h
#include netinet/in.h
#include net/route.h
#include net/if_arp.h
#define SET_SA_FAMILY(addr, family) \
memset ((char *) (addr), \0, sizeof(addr)); \
addr.sa_family = (family);
#define SIN_ADDR(x) (((struct sockaddr_in *) ( (x)))- sin_addr.s_addr)
int SetIfAddr(char *Ifname, char *Ipaddr, char *mask)
{
int fd;
//int rc;
struct ifreq ifr;
struct sockaddr_in *sin;
struct rtentry rt;
fd = socket(AF_INET, SOCK_DGRAM, 0);
if(fd 0)
{
perror("socket error");
return -2;
}
memset( ifr,0,sizeof(ifr));
strcpy(ifr.ifr_name,Ifname);
sin = (struct sockaddr_in*) ifr.ifr_addr;
sin- sin_family = AF_INET;
//IP地址
if(inet_aton(Ipaddr, (sin- sin_addr)) 0)
{
perror("inet_aton error");
return -3;
}
if(ioctl(fd,SIOCSIFADDR, ifr) 0)
{
perror("ioctl SIOCSIFADDR error");
return -4;
}
//子网掩码
if(inet_aton(mask, (sin- sin_addr)) 0)
{
perror("inet_pton error");
return -5;
}
if(ioctl(fd, SIOCSIFNETMASK, ifr) 0)
{
perror("ioctl");
return -6;
}
return 0;
close(fd);
* funtion:set the file lock
* params:fd is file Num,type is F_WRLCk,F_RDLCK or F_UNLCK
-----------------------
* time:2012-08-22 22:17
* version:1.0
*/
int joseph_lock_set(int fd, int type)
struct flock lock_file;
lock_file.l_whence = SEEK_SET;
lock_file.l_start = 0;
lock_file.l_len = 0;
lock_file.l_type = type;
lock_file.l_pid = -1;
fcntl(fd, F_GETLK, lock_file);
if (lock_file.l_type != F_UNLCK)
{
if (lock_file.l_type == F_RDLCK)
{
}
else if (lock_file.l_type == F_WRLCK)
{
}
}
lock_file.l_type = type;
if ((fcntl(fd, F_SETLKW, lock_file)) 0)
{
return 1;
}
switch(lock_file.l_type)
{
case F_RDLCK:
{
}
break;
case F_WRLCK:
{
}
break;
case F_UNLCK:
{
return 1;
}
break;
default:
break;
}/* end of switch */
return 0;
#define JOSEPH_ETH0_IFCG "/etc/sysconfig/network-scripts/ifcfg-eth0"
int joseph_read_user_file(char *param_name)
int fd;
int param_value;
char buf_name[64];
char buf[128];
FILE *fp;
strcpy(buf_name,param_name);
fp = fopen(JOSEPH_ETH0_IFCG, "r");
if(fp == NULL)
{
return -1;
}
fd=fileno(fp);
joseph_lock_set(fd, F_RDLCK);//set the write lock
while(fgets(buf, sizeof(buf), fp)){
if(strstr(buf,buf_name)){
printf("%s:[%d] %s = %s",__FUNCTION__,__LINE__,param_name,(buf+strlen(buf_name)+1));
}
}
joseph_lock_set(fd, F_UNLCK);// unlock the file
fclose(fp);
return 0;
void joseph_alter_ipnc_param(char *joseph_param_name, char *joseph_param_values)
char buf[1024];
char conf_path[64] = JOSEPH_ETH0_IFCG;
if((joseph_param_name == NULL) ||( joseph_param_values == NULL))
{
return;
}
if((strlen(joseph_param_name) == 0) ||( strlen(joseph_param_values) == 0))
{
return;
}
sprintf(buf,"sed -i s/%s=.*/%s=%s/g %s",\
joseph_param_name,joseph_param_name,joseph_param_values,conf_path);
system(buf);
return;
int main ()
#if 1
static int sock_fd = -1; /* socket for doing interface ioctls */
struct rtentry rt;
FILE *db_fd = (FILE *) 0;
char ifname[32];
u_int32_t dstaddr, gateway;
int j,k;
char *p;
FILE *fp;
char cmd[30];
char cmd1[5][20];
memset(cmd, 0, sizeof(cmd));
memset(cmd1, 0, sizeof(cmd1));
if((fp=fopen("/etc/sysconfig/network-scripts/ifcfg-eth0","r"))==NULL){
printf("Read ifcfg-eth0 error!\n");
return -1;
}
for(j=0;j 5;j++){
if((p=fgets(cmd,1024,fp))==NULL){
printf("read data error!\n");
return -2;
}
while(*p!==)p++;
p++;
k=0;
while(*p!=\n)
{
cmd1[j][k]=*p;
k++;
p++;
}
memset(cmd, 0, sizeof(cmd));
}
if(SetIfAddr(cmd1[0],cmd1[1],cmd1[2])!=0)
{
printf("config ip failed!\n");
return -7;
}
strcpy(ifname, cmd1[0]);
dstaddr = inet_addr(cmd1[3]);
gateway = inet_addr(cmd1[4]);
/* Get an internet socket for doing socket ioctls. */
sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
/*open for debug*/
db_fd = fopen("/tmp/addrt_db.txt","a+");
fprintf(db_fd, "ifname=%s ouraddr=%x gateway=%x\n", ifname, dstaddr, gateway);
memset ( rt, 0, sizeof (rt));
/*set Destination addr*/
SET_SA_FAMILY (rt.rt_dst, AF_INET);
SIN_ADDR(rt.rt_dst) = dstaddr;
/*set gw addr*/
SET_SA_FAMILY (rt.rt_gateway, AF_INET);
SIN_ADDR(rt.rt_gateway) = gateway;
fprintf(db_fd,"mygateway=%x\n", SIN_ADDR(rt.rt_gateway));
/*set genmask addr*/
SET_SA_FAMILY (rt.rt_genmask, AF_INET);
SIN_ADDR(rt.rt_genmask) = 0L;
rt.rt_dev = ifname;
rt.rt_flags = RTF_GATEWAY;
if (ioctl(sock_fd, SIOCADDRT, rt) 0)
{
fprintf(db_fd,"route add err num=%m\n",errno);
printf("Err\n");
return 0;
}
fprintf(db_fd,"route add success route=%x\n", SIN_ADDR(rt.rt_gateway));
fclose(db_fd);
#else
joseph_read_user_file("DEVICE");
joseph_read_user_file("IPADDR");
joseph_read_user_file("GATEWAY");
joseph_read_user_file("DNS");
joseph_read_user_file("BROADCAST");
joseph_read_user_file("BOOTPROTO");
joseph_read_user_file("ONBOOT");
joseph_alter_ipnc_param("IPADDR","10.10.1.250");
joseph_read_user_file("IPADDR");
#endif
return 0;
/span
RISC-V MCU开发 (十一):跨内核工程转换 大多数嵌入式工程师使用Keil进行开发,但Keil目前不支持RISC-V内核,只支持ARM内核。MounRiver® Studio(MRS)同时支持两种内核,为了方便工程师从ARM内核迁移至RISC-V内核,MRS增加了Keil工程转换的功能。
JS轻应用热更新 - 无需连线轻松进行嵌入式设备开发调试 不同于传统嵌入式开发流程,轻应用的JavaScript应用在PC端开发完成后,无需编译、链接、固件烧录等繁琐步骤,用户可直接使用命令行工具动态推送最新的应用到指定设备,这个过程我们称之为应用热更新。
关于嵌入式安全性的6个要点 保护嵌入式设备正成为一个热门话题,尤其是当这些设备开始连接到Internet时。嵌入式软件设计人员可以做些什么来提高设备的安全性?以下是开发人员需要了解的七个关键要点。1.不是RTOS而是用户代码有许多RTOS供应商非常担心这些嵌入式系统中的后门和缺陷通常存在于何处。
RISC-V MCU开发 (十一):跨内核工程转换 大多数嵌入式工程师使用Keil进行开发,但Keil目前不支持RISC-V内核,只支持ARM内核。MounRiver® Studio(MRS)同时支持两种内核,为了方便工程师从ARM内核迁移至RISC-V内核,MRS增加了Keil工程转换的功能。
JS轻应用热更新 - 无需连线轻松进行嵌入式设备开发调试 不同于传统嵌入式开发流程,轻应用的JavaScript应用在PC端开发完成后,无需编译、链接、固件烧录等繁琐步骤,用户可直接使用命令行工具动态推送最新的应用到指定设备,这个过程我们称之为应用热更新。
关于嵌入式安全性的6个要点 保护嵌入式设备正成为一个热门话题,尤其是当这些设备开始连接到Internet时。嵌入式软件设计人员可以做些什么来提高设备的安全性?以下是开发人员需要了解的七个关键要点。1.不是RTOS而是用户代码有许多RTOS供应商非常担心这些嵌入式系统中的后门和缺陷通常存在于何处。
相关文章
- 嵌入式工控机定制化 专用化成为未来趋势
- 嵌入式电路设计(物联网esp32最小电路设计)
- 嵌入式系统硬件设计与实践(第一步下载eda软件)
- 随想录(十年嵌入式总结)
- 随想录(搭建自己嵌入式项目的编译系统)
- 嵌入式工控机与传统工控机的优势比较
- 嵌入式开发(传送门)
- 利用mtd工具实现嵌入式设备在线升级
- 嵌入式 H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流
- 嵌入式 hi3518平台增加路由代码
- 嵌入式 详解udev
- 嵌入式 使用udev高效、动态地管理Linux 设备文件
- 嵌入式系统烧写uboot/bootloader/kernel的一般方法
- 使用GDB进行嵌入式远程调试
- 嵌入式 hi3518c平台网卡模式MII与RMII模式在Uboot和kernel中切换小结
- ARM 开发板嵌入式linux系统与主机PC通过串口传输文件