当前位置: 首页 > news >正文

netlink进行网卡重命名

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/socket.h>
#include <linux/if.h>
#include <linux/netlink.h>#define MAX_PAYLOAD 1024  // 最大负载长度
#define NLMSG_ERROR 0x2    // 消息类型
  1. 初始化Netlink Socket

      初始化Netlink Socket,创建一个netlink_init函数,用于创建Netlink Socket并绑定到NETLINK_ROUTE

int netlink_init(struct sockaddr_nl *nladdr) {int sockfd;sockfd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);if (sockfd < 0) {perror("socket");return -1;}memset(nladdr, 0, sizeof(struct sockaddr_nl));nladdr->nl_family = AF_NETLINK;nladdr->nl_groups = RTMGRP_LINK;  // 绑定到link组if (bind(sockfd, (struct sockaddr *)nladdr, sizeof(struct sockaddr_nl)) < 0) {perror("bind");close(sockfd);return -1;}return sockfd;
}

  1. 创建Netlink消息

接下来创建Netlink消息,包括Netlink消息头和Netlink消息负载

void build_nlmsg(struct nlmsghdr *nlh, int ifindex, int flags) {memset(nlh, 0, NLMSG_LENGTH(sizeof(struct ifinfomsg)));nlh->nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));nlh->nlmsg_type = RTM_NEWLINK;nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;nlh->nlmsg_seq = 1;nlh->nlmsg_pid = getpid();struct ifinfomsg *ifm = (struct ifinfomsg *)NLMSG_DATA(nlh);ifm->ifi_family = AF_UNSPEC;ifm->ifi_type = 0;ifm->ifi_index = ifindex;ifm->ifi_flags = flags;ifm->ifi_change = 0xffffffff;
}

int send_nlmsg(int sockfd, struct nlmsghdr *nlh, struct sockaddr_nl *nladdr) {int ret;struct iovec iov = { nlh, nlh->nlmsg_len };struct msghdr msg = { nladdr, sizeof(struct sockaddr_nl), &iov, 1, NULL, 0, 0 };ret = sendmsg(sockfd, &msg, 0);if (ret < 0) {perror("sendmsg");return -1;}memset(nlh, 0, NLMSG_LENGTH(sizeof(struct ifinfomsg

struct ifinfomsg是Linux内核中用于表示网络接口信息的结构体,其定义如下

struct ifinfomsg {unsigned char ifi_family;   // 接口地址族,通常为AF_UNSPEC或AF_INET6unsigned short ifi_type;    // 接口类型int ifi_index;              // 接口索引unsigned int ifi_flags;     // 接口标志,如IFF_UP等unsigned int ifi_change;    // 接口状态改变标志
};

在使用Netlink更改网络接口的过程中,可以使用struct ifinfomsg结构体来表示要修改的网络接口的相关信息,包括接口类型、接口索引、接口标志等。在Netlink消息负载中,使用NLMSG_DATA宏来获取struct ifinfomsg结构体的地址,然后填充相关字段即可。

使用struct ifinfomsg结构体的场景包括但不限于:

  1. 在Netlink Socket中使用RTM_NEWLINK消息来创建一个新的网络接口。
  2. 在Netlink Socket中使用RTM_DELLINK消息来删除一个网络接口。
  3. 在Netlink Socket中使用RTM_SETLINK消息来修改一个网络接口的属性,比如接口标志等。

在Netlink Socket中使用RTM_NEWLINK消息来创建一个新的网络接口时,如果填充的接口名称为eth%d,内核会根据当前系统中已经存在的网络接口的数量来确定新接口的名称。

具体来说,内核会在已有的网络接口名称中查找最小的未使用的名称,并将其分配给新的网络接口。对于以eth%d为模板的接口名称,内核会从eth0开始往后逐个尝试,直到找到一个未被占用的名称为止。

因此,在使用Netlink Socket来创建一个新的网络接口时,如果填充的接口名称为eth%d,而系统中已经存在了一些网络接口,那么最终分配给新接口的名称可能会不是eth%d,而是根据内核的算法计算出的一个实际名称。

修改网卡mtu值

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <linux/if.h>
#include <linux/if_arp.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>#define BUFSIZE 8192int main(int argc, char **argv) {struct nlmsghdr *nh;struct ifinfomsg *ifinfo;struct rtattr *attr;char buffer[BUFSIZE];int sockfd, len;// 创建netlink socketif ((sockfd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE)) < 0) {perror("socket");return -1;}// 准备请求消息memset(buffer, 0, sizeof(buffer));nh = (struct nlmsghdr *)buffer;ifinfo = (struct ifinfomsg *)NLMSG_DATA(nh);attr = (struct rtattr *)(((char *)ifinfo) + NLMSG_ALIGN(sizeof(struct ifinfomsg)));nh->nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));nh->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;nh->nlmsg_type = RTM_NEWLINK;ifinfo->ifi_family = AF_UNSPEC;ifinfo->ifi_type = ARPHRD_ETHER;ifinfo->ifi_index = if_nametoindex("eth0");ifinfo->ifi_flags = IFF_UP;ifinfo->ifi_change = 0xFFFFFFFF;// 添加MTU属性attr->rta_type = IFLA_MTU;attr->rta_len = RTA_LENGTH(sizeof(unsigned int));*(unsigned int *)RTA_DATA(attr) = 1500;nh->nlmsg_len += RTA_ALIGN(attr->rta_len);nh->nlmsg_flags |= NLM_F_REQUEST | NLM_F_ACK;// 发送netlink消息len = send(sockfd, nh, nh->nlmsg_len, 0);if (len == -1) {perror("send");close(sockfd);return -1;}// 接收netlink回复len = recv(sockfd, buffer, BUFSIZE, 0);if (len == -1) {perror("recv");close(sockfd);return -1;}// 处理netlink回复for (nh = (struct nlmsghdr *)buffer; NLMSG_OK(nh, len); nh = NLMSG_NEXT(nh, len)) {if (nh->nlmsg_type == NLMSG_ERROR) {perror("NLMSG_ERROR");close(sockfd);return -1;}}printf("MTU has been set to 1500.\n");close(sockfd);return 0;
}

 

实现将网卡eth0改名称为eth1

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>#define BUFSIZE 8192int main(int argc, char **argv) {struct nlmsghdr *nh;struct ifinfomsg *ifinfo;struct rtattr *attr;char buffer[BUFSIZE];int sockfd, len;// 创建netlink socketif ((sockfd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE)) < 0) {perror("socket");return -1;}// 准备请求消息memset(buffer, 0, sizeof(buffer));nh = (struct nlmsghdr *)buffer;ifinfo = (struct ifinfomsg *)NLMSG_DATA(nh);attr = (struct rtattr *)(((char *)ifinfo) + NLMSG_ALIGN(sizeof(struct ifinfomsg)));nh->nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));nh->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;nh->nlmsg_type = RTM_NEWLINK;ifinfo->ifi_family = AF_UNSPEC;ifinfo->ifi_type = ARPHRD_ETHER;ifinfo->ifi_index = if_nametoindex("eth0");ifinfo->ifi_flags = IFF_UP;ifinfo->ifi_change = 0xFFFFFFFF;// 添加新接口名属性attr->rta_type = IFLA_IFNAME;attr->rta_len = RTA_LENGTH(strlen("eth1")+1);strcpy(RTA_DATA(attr), "eth1");nh->nlmsg_len += RTA_ALIGN(attr->rta_len);nh->nlmsg_flags |= NLM_F_REQUEST | NLM_F_ACK;// 发送netlink消息len = send(sockfd, nh, nh->nlmsg_len, 0);if (len == -1) {perror("send");close(sockfd);return -1;}// 接收netlink回复len = recv(sockfd, buffer, BUFSIZE, 0);if (len == -1) {perror("recv");close(sockfd);return -1;}// 处理netlink回复for (nh = (struct nlmsghdr *)buffer; NLMSG_OK(nh, len); nh = NLMSG_NEXT(nh, len)) {if (nh->nlmsg_type == NLMSG_ERROR) {perror("NLMSG_ERROR");close(sockfd);return -1;}}printf("Interface name has been set to eth1.\n");close(sockfd);return 0;
}

相关文章:

netlink进行网卡重命名

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <sys/socket.h> #include <linux/if.h> #include <linux/netlink.h>#define MAX_PAYLOAD 1024 // 最大负载长…...

2023年春【数据分析与挖掘】文献精读(一)-1:针对COVID-19,使用聚类方法有效提取生物特性关联进而识别预防COVID-19的药物

分享给大家——动漫《画江湖之不良人》第四季片尾,主人公 李星云所说的一段话: 悠悠众生,因果循环,大道至简,世间若尽是不如意事, 越是执着,便越是苦,不如安下心来,看该看的风景,做好该做之事。 初行娆疆,所悟如此, 就像曾经有一位紫衣姑娘,第一次来中原时,一样…...

【Go自学第三节】Go的范围(Range)用法

Go 语言中 range 关键字用于 for 循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素。在数组和切片中它返回元素的索引和索引对应的值&#xff0c;在集合中返回 key-value 对。 在讲Go语言的range之前&#xff0c;我们先回顾下Python中range的用法 for i …...

【备战面试】每日10道面试题打卡-Day6

本篇总结的是计算机网络知识相关的面试题&#xff0c;后续也会更新其他相关内容 文章目录1、HTTP 与 HTTPS 有哪些区别&#xff1f;2、HTTPS的加密过程是什么&#xff1f;3、GET与POST有什么区别&#xff1f;4、讲讲HTTP各个版本的区别&#xff1f;5、HTTP与FTP的区别&#xff…...

Stable Diffusion 个人推荐的各种模型及设置参数、扩展应用等合集(不断更新中)

一、说明 | 表示或者 表示 以上 二、模型 适用风景、房子、车子等漫画类风格 模型的VAE不要用模型附带的&#xff0c;好像就是naifu的官方vae&#xff0c;很老了&#xff0c;用 vae-ft-mse-840000-ema-pruned.ckpt 或者是 kl-f8-anime2.ckpt&#xff1b; 嵌入模型要下载作者…...

Salesforce 2023财年逆风增长,现金流达历史最高!

在过去的一年里&#xff0c;Salesforce一直是华尔街最关注的公司之一。3月1日&#xff0c;CRM领域的全球领导者Salesforce公布了截至2023年1月31日的第四季度和整个财年的业绩。 Salesforce主席兼首席执行官Marc Benioff表示&#xff1a; Salesforce全年实现了314亿美元的收入…...

2023年3月全国数据治理工程师认证DAMA-CDGA/CDGP考试怎么通过?

弘博创新是DAMA中国授权的数据治理人才培养基地&#xff0c;贴合市场需求定制教学体系&#xff0c;采用行业资深名师授课&#xff0c;理论与实践案例相结合&#xff0c;快速全面提升个人/企业数据治理专业知识与实践经验&#xff0c;通过考试还能获得数据专业领域证书。 DAMA认…...

【安卓软件】KMPlayer-一款完美的媒体播放器 可以播放所有格式的字幕和视频

KM PlayerKM Player是一款未编码的视频播放器&#xff0c;让您无需编码即可方便地播放各种格式的视频&#xff0c;并为您的新体验添加了字幕支持、视频播放速度和手势等功能。KMPlayer 拥有美观和直观的设计&#xff0c;让您可以更方便地管理和播放视频&#xff01;功能高品质视…...

ClickHouse--分布式查询多副本的路由规则

前言在集群情况下&#xff0c;数据写入可以有写本地表和写分布式表2种方案&#xff0c;但是面向集群查询时&#xff0c;只能通过Distributed表引擎实现。本文主要介绍分布式查询多副本的路由规则。该配置项为&#xff1a;load_balancerandom/nearest_hostname/in_order/first_o…...

Linux 常用命令总结

本篇博客记录读研以来高频使用的 linux 系统下的命令合集 命令分类程序运行系统相关文件处理文件传输相关命令文件显示相关命令文件排列相关命令Anaconda 相关命令tmux 终端复用神器使用tips程序运行 自动保存日志&#xff0c;替代write命令&#xff1a; xxx | tee ./xxx.log…...

超分扩散模型 SR3 可以做图像去雨、去雾等恢复任务吗?

文章目录前言代码及原文链接主要的点如何进行图像恢复前言 关于扩散模型以及条件扩散模型的介绍&#xff0c;大家可以前往我的上一篇博客&#xff1a;扩散模型diffusion model用于图像恢复任务详细原理 (去雨&#xff0c;去雾等皆可)&#xff0c;附实现代码。 SR3是利用扩散模…...

STM32Cube STM32MP157 M4端CAN通讯实战

1、环境 开发系列&#xff1a;STM32MP157 开发软件&#xff1a;STM32CubeIDE 1.4.0 例程目的&#xff1a;在M4端实现CAN通讯 2、目的 近日&#xff0c;有客户需要在STM32MP157中的M4端实现CAN通讯&#xff0c;我也是初次在M4端编写CAN通讯代码&#xff0c;上网研究了其他人写…...

npm install报错unable to resolve dependency tree

一、问题背景npm install安装项目依赖时报错PS D:\test> npm install npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resolving: vue-admin-template4.2.1 npm ERR! Found: webpack5.74.0 npm ERR! node_modules/we…...

力扣sql简单篇练习(二十六)

力扣sql简单篇练习(二十六) 1 每家商店的产品价格 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # 多行变成多列,考虑用sum if分组 SELECT product_id,sum(IF(storestore1,price,null)) store1,sum(IF(storestore2,price,null)) store2, sum(IF(st…...

2022年全国职业院校技能大赛(中职组)网络安全竞赛试题A模块第九套解析(详细)

2022年全国职业院校技能大赛(中职组) 网络安全竞赛试题 (9) (总分100分) 赛题说明 一、竞赛项目简介 “网络安全”竞赛共分A.基础设施设置与安全加固;B.网络安全事件响应、数字取证调查和应用安全;C.CTF夺旗-攻击;D.CTF夺旗-防御等四个模块。根据比赛实际情况,竞…...

C++回顾(十六)—— 异常处理机制

16.1 异常的基本语法 1&#xff09; 若有异常则通过throw操作创建一个异常对象并抛掷。2&#xff09; 将可能抛出异常的程序段嵌在try块之中。控制通过正常的顺序执行到达try语句&#xff0c;然后执行try块内的保护段。3&#xff09; 如果在保护段执行期间没有引起异常&#xf…...

【100个 Unity实用技能】 | Unity 在代码中 动态改变RectTransform位置及宽高 的方法整理

Unity 小科普 老规矩&#xff0c;先介绍一下 Unity 的科普小知识&#xff1a; Unity是 实时3D互动内容创作和运营平台 。包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者&#xff0c;借助 Unity 将创意变成现实。Unity 平台提供一整套完善的软件解决方案&#xff…...

哈希表的实现

哈希表概念 二叉搜索树具有对数时间的表现&#xff0c;但这样的表现建立在一个假设上&#xff1a;输入的数据有足够的随机性。哈希表又名散列表&#xff0c;在插入、删除、搜索等操作上具有「常数平均时间」的表现&#xff0c;而且这种表现是以统计为基础&#xff0c;不需依赖…...

搞懂海明码

海明码搞懂之前先了解奇偶校验。例如&#xff1a;1111 对其进行奇偶校验。 奇检验&#xff1a;11111 奇校验使1的个数保持在奇数 偶校验&#xff1a;01111 偶校验使1的个数保持在偶数 海明码可以拆分为三步&#xff1a; 一、确定校验的位数 公式&#xff1a;2^k > k n …...

数据库:Mysql数据库安装及使用

目录 一、数据库介绍 1、基本概念 2、数据库类型 3、版本演变 二、Mysql安装 1、官网下载yum安装 2、手动配置yum安装 三、Mysql基本操作 1、登录与改密 2、检测数据库健康 3、 库的创建与使用 4、数据类型 5、修饰符 6、表的创建与使用 7、分组查询 8、查询排…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践

在 Kubernetes 集群中&#xff0c;如何在保障应用高可用的同时有效地管理资源&#xff0c;一直是运维人员和开发者关注的重点。随着微服务架构的普及&#xff0c;集群内各个服务的负载波动日趋明显&#xff0c;传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...