Linux MPLS功能详解

Linux上实现mpls,ldpd(Quagga)完整步骤 MPLS LDPD LINUX EXPERIMENT(Quagga)本文为原创,禁止转载。 文章是在个人研究怎么在LINUX上实现MPLS的总结。暂时LINUX上还没法实现BGP MPLS VPN1.Build a linux environment supporting mpls ,quagga and ldpd 阅读详情

使用mpls功能,首先需要加载mpls相关的模块:
$ sudo modprobe mpls_gso
$ sudo modprobe mpls_iptunnel
$ sudo modprobe mpls_router  

使能mpls的接收和设置labels表项的数量,默认情况下内核不接收mpls报文,如果不使能此项,在如下使用ip命令配置本机环回lo接口接收mpls数据包时就会失败。labels转发表项的数量初始为0,将会导致不能配置label转发表项。

sysctl -w net.mpls.conf.lo.input=1
sysctl -w net.mpls.platform_labels=1048575

 

测试MPLS

添加MPLS路由, 使用标签 100 封装 10.10.10.10/32, 使用标签18封装 172.16.48.174/32.

ip route add 10.10.10.10/32 encap mpls 100 via inet 192.168.1.2
ip r add 172.16.48.174/32  encap mpls  18 via 50.0.1.5 


输入标签 100 进行标签交换转发, 封装标签200并转发到 192.168.2.2.

ip -f mpls route add 100 as 200 via inet 192.168.2.2

输入标签300 转发到本地

ip -f mpls route add 300 dev lo
 

配置1:到网络10.1.1.0/30的数据包增加200和300两个label

$ sudo ip route add 10.1.1.0/30 encap mpls 200/300 via 192.168.1.1 dev ens33    
$ 
$ ip route 
10.1.1.0/30  encap mpls  200/300 via 192.168.1.1 dev ens33 
$
 

使用ping测试,tcpdump抓包内容可见,增加了200和300两个label,标签300设置了标签栈底标志[S]。
$ ping 10.1.1.1
PING 10.1.1.1 (10.1.1.1) 56(84) bytes of data.
$
$ sudo tcpdump mpls -vve
tcpdump: listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
23:36:30.813147 00:0c:29:74:7f:04 (oui Unknown) > 00:90:27:fe:c9:34 (oui Unknown), ethertype MPLS unicast (0x8847), length 106: 
MPLS (label 200, exp 0, ttl 64)
     (label 300, exp 0, [S], ttl 64)
     (tos 0x0, ttl 64, id 36751, offset 0, flags [DF], proto ICMP (1), length 84)
    localhost > localhost: ICMP echo request, id 6907, seq 1, length 64

配置2:标签为500的mpls数据包送到本机的环回接口lo:

$ sudo ip -f mpls route add 500 dev lo
$
$ip -f mpls route show
500 dev lo 
$

配置3:标签为100的数据包替换为标签600,发往192.168.1.2。

$ sudo ip -f mpls route add 100 as to 600 via inet 192.168.1.2
$
$ip -f mpls route show
100 as to 600 via inet 192.168.1.2 dev ens33 
500 dev lo 
$


配置4:指定多个下一跳地址,为每个下一跳指定不同的(90/91)标签:

$ sudo ip -f mpls route add 80 nexthop as to 90 via inet 192.168.1.2 nexthop as to 91 via inet 192.168.1.3  
$ 
$ ip -d -f mpls route show
unicast 80 proto boot scope global 
        nexthop as to 90 via inet 192.168.1.2  dev ens33
        nexthop as to 91 via inet 192.168.1.3  dev ens33
$

 

MPLS的路由结构

内核函数mpls_route_add处理MPLS路由的添加工作。所有的MPLS路由全部组织在网络命名空间的成员platform_label指针数组(指针的指针)中,通过标签值可找到对应的MPLS路由。全部路由不超过platform_labels指定的最大数量。

struct netns_mpls {
    size_t platform_labels;
    struct mpls_route __rcu * __rcu *platform_label;
}

一个mpls_route路由表项所占空间与其所有的下一跳mpls_nh的空间,以及每个下一跳的所有label空间之总和不超过4K字节大小。mpls_route路由表项结构图如下:

另外,内核注册了netdev通知链函数mpls_dev_notify处理mpls路由的失效和活动状态。

static struct notifier_block mpls_dev_notifier = {
    .notifier_call = mpls_dev_notify,
};

当接收到设备关闭NETDEV_DOWN事件时,调用mpls_ifdown遍历所有的mpls路由表项,将出口设备为此设备的表项标记为不可用(RTNH_F_DEAD)。如果接收到设备NETDEV_UP的事件,同样的遍历所有的表项,经出口设备为此设备的表项标记为可用,即去掉RTNH_F_DEAD标志。

static int mpls_dev_notify(struct notifier_block *this, unsigned long event, void *ptr)
{
    struct net_device *dev = netdev_notifier_info_to_dev(ptr);
 
    switch (event) {
    case NETDEV_DOWN:
        mpls_ifdown(dev, event);
        break;
    case NETDEV_UP:
        mpls_ifup(dev, RTNH_F_DEAD | RTNH_F_LINKDOWN);
        break;
    }
}


MPLS数据帧处理

Linux内核协议栈注册了一个ETH_P_MPLS_UC(0x8847)类型的数据包处理函数(mpls_packet_type)处理MPLS报文。
           

static struct packet_type mpls_packet_type __read_mostly = {
    .type = cpu_to_be16(ETH_P_MPLS_UC),
    .func = mpls_forward,
};

首先通过MPLS标签解析mpls_entry_decode函数,得到数据包中MPLS标签的4个字段:标签值、TTL、流量类别和标签栈底标志位。标签值字段占用20个bit位,其最大值为2**20 -1,由于mpls协议存在预留值,合法的标签值从16开始(MPLS_LABEL_FIRST_UNRESERVED)。

static inline struct mpls_entry_decoded mpls_entry_decode(struct mpls_shim_hdr *hdr)
{    
    struct mpls_entry_decoded result;
    unsigned entry = be32_to_cpu(hdr->label_stack_entry);
 
    result.label = (entry & MPLS_LS_LABEL_MASK) >> MPLS_LS_LABEL_SHIFT;
    result.ttl = (entry & MPLS_LS_TTL_MASK) >> MPLS_LS_TTL_SHIFT;
    result.tc =  (entry & MPLS_LS_TC_MASK) >> MPLS_LS_TC_SHIFT;
    result.bos = (entry & MPLS_LS_S_MASK) >> MPLS_LS_S_SHIFT;
 
    return result;
}


其次通过得到的MPLS标签值,查询mpls路由表。有之前介绍的mpls路由表结构可知,以标签值做索引即可找到对应的路由项:

static struct mpls_route *mpls_route_input_rcu(struct net *net, unsigned index)
{
    struct mpls_route __rcu **platform_label = rcu_dereference(net->mpls.platform_label);
    rt = rcu_dereference(platform_label[index]);
    return rt;
}


对于仅有一个下一跳的路由表项,直接使用。对于多个下一跳地址,需要在找到的路由项中,选择一个下一跳地址,函数(mpls_select_multipath)完成此功能。检查如果活动的下一跳的个数为0,返回空。否则根据数据包中的以下字段计算hash值:最多4个标签值、IP头的源IP地址、目的IP地址和协议号。得到的hash值与当前活动的下一跳数量(alive)取余得到下一跳地址的索引值。mpls_get_nexthop函数取出mpls路由的下一跳。

如果活动的下一跳数量与下一跳总数相等,说明根据下一跳索引nh_index可以直接取到下一跳结构。否则,需要遍历所有活动的下一跳列表,找到此下一跳。

    alive = READ_ONCE(rt->rt_nhn_alive);
    if (alive == 0) return NULL;
 
    hash = mpls_multipath_hash(rt, skb);
    nh_index = hash % alive;
    if (alive == rt->rt_nhn) goto out;
    for_nexthops(rt) {
        unsigned int nh_flags = READ_ONCE(nh->nh_flags);
        if (nh_flags & (RTNH_F_DEAD | RTNH_F_LINKDOWN))  continue;
        if (n == nh_index) return nh;
        n++;
    } endfor_nexthops(rt);
out:
    return mpls_get_nexthop(rt, nh_index);


如果配置了标签替换,仅替换数据包中的顶层标签。以下代码将mpls路由表项中下一跳对应的标签栈写入到数据包头中。

    hdr = mpls_hdr(skb);
    bos = dec.bos;
    for (i = nh->nh_labels - 1; i >= 0; i--) {
        hdr[i] = mpls_entry_encode(nh->nh_label[i], dec.ttl, 0, bos);
        bos = false;
    }


环境
iproute2版本:4.17.0
内核版本:  Linux-4.15
 

MPLS协议原理与配置详解 多协议标签交换MPLS(Multiprotocol Label Switching ),MPLS在无连接的IP网络上引入面向连接的标签交换概念,将第三层路由技术和第二层交换技术相结合,充分发挥了IP路由的灵活性和二层交换的便捷性 MPLS并不是一种业务或者应用,它实际上是一种隧道技术。这种技术不仅支持多种高层协议与业务,而且在一定程度上可以保证信息传输的安全性 MPLS MP:多协议 LS:标签交换(label switch) 应用场景 用于早期提高转发效率 用于MPLS VPN(二层或三层标 阅读详情

相关推荐

MPLS-Linux体系结构及交换路由性能分析.pdf

MPLS-Linux体系结构及交换路由性能分析.pdf

Linux MPLS 总结

Linux MPLS 总结linux 4.5 以上已支持MPLS, 需升级iproute2.更新Kernel使用 elrepo yum 源 RHEL/CentOS 升级到 4.x 内核rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org RHEL7 rpm -Uvh http://www.elrepo.org/elrepo-relea

奋斗中拥有 4633

基于大模型的自动驾驶智能体:Agent-Driver架构、训练与实战指南

自动驾驶系统正从传统的模块化流水线向以智能体为核心的新范式演进。其核心原理在于将车辆视为一个能够与环境持续交互的自主决策智能体,通过多模态感知、记忆管理和基于大模型的推理能力,实现对复杂交通场景的理解与应对。这一技术价值在于利用大模型的常识推理和泛化能力,有望解决传统方法在长尾场景下面临的挑战。在应用场景上,智能体驱动架构特别适合处理动态交互密集、需高层语义理解的城区驾驶、无保护转弯及突发状况应对。本文聚焦的Agent-Driver项目,正是这一方向的典型实践,它通过融合视觉、语言大模型与强化学习,构建了一

weixin_28729843的博客 529

ip route带 mpls命令使用方法

mpls iproute2

anzhuangguai的专栏 1552

【GESP】C++四级考试大纲知识点梳理, (10) 文件读写和重定向

其实,由于本人也是边学、边实验、边总结,且对考纲深度和广度的把握属于个人理解。因此本文更多的不是一个教程,而是个人知识梳理,如有遗漏、疏忽,欢迎指正、交流。孩子放假,出游一周,没有更新。刚刚归来,继续学习。GESP C++四级官方考试大纲中,共有11条考点,本文针对第10条考点进行分析介绍。(10)掌握文件操作中的重定向,实现文件读写操作,了解文本文件的分类,掌握写操作、读操作、读写操作。GESP C++四级官方考试大纲中,共有11条考点,本文针对第10条考点进行分析介绍。孩子放假,出游一周,没有更新。

CoderCoding的博客 525

西瓜书第二章——模型评估与选择(十折交叉验证/查准查全F1)

第二章——模型评估与选择

xsddys的博客 953

Linux MPLS 初探

使用mpls功能,首先需要加载mpls相关的模块: $ sudo modprobe mpls_gso $ sudo modprobe mpls_iptunnel $ sudo modprobe mpls_router 使能mpls的接收和设置labels表项的数量,默认情况下内核不接收mpls报文,如果不使能此项,在如下使用ip命令配置本机环回lo接口接收mpls数据包时就会失败。lab...

~~ LINUX ~~ 496

基于USB总线的虚拟摄像头(UVC)原理简介

前面文章中我们分析了虚拟声卡的实现,在文章中我们展示了创建一个虚拟麦克风和虚拟扬声器的技术原理。完成了音频的虚拟化之后,这里就要谈论一下对于视频的虚拟化了——虚拟摄像头的实现。关于虚拟麦克风和虚拟扬声器的实现,可以参考。虚拟摄像头应用也是非常普遍的,例如云桌面远程摄像头的实现,直播技术。目前对于虚拟摄像头有三种实现方式:DirectShow虚拟摄像头,这个是一种比较古老的技术;在新版本应用中,该项技术基本失效了,尤其是UWP框架程序,DirectShow虚拟摄像头就失效了。

tianxilink的博客 5415

MPLS的静态配置

MPLS的数据转发主要根据FTN(FEC to NHLFE,转发等价类到下一跳标签转发项)、NHLFE(next hop label forwarding entry,下一跳标签转发项)、ILM(incoming label mapping,如标签映射)。三者通过系统自动创建的tunnel ID联系,该值自动分配且仅本地有效。

weixin_46980289的博客 836

【虚拟化生态平台】虚拟化平台esxi挂载USB硬盘

虚拟化平台安装好之后,一般情况下,只有一个硬盘在工作,其他的外接硬盘(我的只有一个ssd硬盘,其他的均是usb外接,SATA接口的硬盘是否这样我暂时不清楚哈)没有在工作,但是一个硬盘明显不够我们使用的,所以我们需要去挂载外接的硬盘来扩容。...

Rubik Blog 4834

浅析MOS管导通过程及RC吸收电路设计要点

RC吸收电路 米勒电容 MOS导通过程

liangbo1999的博客 2万+

linux内核 mpls,将MPLS编译进linux内核中

系统环境:linux kernel 2.6.35。(此环境是上一篇文章中将ubuntu内核替换后的环境)编译过程如下:1)首先需要下载patch文件:linux-kernel-v2.6.35-mpls1.980.patch。下载链接:或者:2)将下载后的patch文件拷贝到/usr/src/目录下。然后将此文件打进内核中,输入如下命令:# cp linux-kernel-v2.6.35-mpls1...

weixin_39682697的博客 305

【模拟电子设计实战】开源!基于Multisim与AD620的心电采集电路仿真与优化

本文详细介绍了基于Multisim与AD620的心电采集电路仿真与优化实战。通过分析心电信号采集的挑战,重点讲解了AD620仪表放大器和OP07运算放大器的选型优势及电路设计技巧,包括对抗50Hz工频干扰和基线漂移的优化方法。文章还分享了Multisim仿真参数设置与实测对比经验,最终实现性能达标的心电采集电路设计。

weixin_30555125的博客 95

linux3.10内核支持mpls,将MPLS编译进linux内核中

系统环境:linux kernel 2.6.35。(此环境是上一篇文章中将ubuntu内核替换后的环境)编译过程如下:1)首先需要下载patch文件:linux-kernel-v2.6.35-mpls1.980.patch。下载链接:或者:2)将下载后的patch文件拷贝到/usr/src/目录下。然后将此文件打进内核中,输入如下命令:# cp linux-kernel-v2.6.35-mpls1...

weixin_39542710的博客 220

解锁笔记智能对话:手把手配置 Obsidian Copilot 插件与硅基流动模型

本文详细介绍了如何为Obsidian笔记软件配置Copilot插件,并接入硅基流动AI模型,从而为个人知识库添加智能对话能力。通过手把手教程,指导用户完成插件安装、API Key获取、模型配置及索引构建,最终实现基于个人笔记内容的深度语义问答,提升知识管理效率。

corn8的博客 613

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

mpls代码位置

总共3个作者, leu,rw, ig leu的作品 http://repo.or.cz/w/jleu-quagga.git/shortlog/refs/heads/mpls-master quagga 0.99.15的mpls代码 rw的作品 ldpd的实现有一个2012年的版本来自 https://github.com/rwestphal/quagga-public

anzhuangguai的专栏 1210

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

将MPLS编译进linux内核中

系统环境:linux kernel 2.6.35。(此环境是上一篇文章中将ubuntu内核替换后的环境) 编译过程如下: 1)首先需要下载patch文件:linux-kernel-v2.6.35-mpls1.980.patch。下载链接: http://ftp.jaist.ac.jp/pub/sourceforge/m/project/mp/mpls-linux/mpls-linu...

148

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Linux上实现mpls的环境配置

ubuntu和centos的内核升级 在这两个里面安装quagga-ldpd

CJ的博客 3390

Note: How to setup the Ubuntu MPLS Cient

How to enable the MPLS module# modprobe mpls_routermodprobe mpls_gsomodprobe mpls_iptunnelsysctl -w net.mpls.conf.lo.input=1sysctl -w net.mpls.platform_labels=1048575 How to create the virt...

anioaiwm944413的博客 172

LER在MPLS域中的全称是什么?

MPLS是一种在电信网络中使用的路由技术,它基于短路径标签,而非长网络地址,将数据从一个节点指向另一个节点,从而避免了复杂的查找过程,提高了路由表的通信量。标记识别远近节点之间的虚拟链接(路径),而非端点之间的连接。MPLS可以封装各种网络协议的数据包,所以它的名字是“混合体”。该系统支持T1/E1、ATM、帧中继、DSL等多种接入技术。 标记转换路由器 MPLS路由器,它只根据标签来执行路由,称为标签交换路由器(LSR)或中转路由器。该路由器位于MPLS网络的中间。这就需要切换用于路由包的标签。 ..

weixin_58088629的博客 2850

mpls for linux,RSVP-TE daemon for DiffServ over MPLS under Linux Features, Components and Architectu...

This paper describes the features of the daemon, how the daemon was merged from different projects and the resulting architecture. The section ends with a description of how a packet is forwarded thro...

weixin_29790467的博客 204

mpls技术的核心就是标签交换吗?mpls标签转发过程

MPLS,又称为多协议标签交换技术,可以说MPLS技术的核心就是标签交换。 网络发展的热点问题是要找到将路由技术和交换技术结合起来,从而提高网络传输效率的技术。常用的交换方法通常是在数据通信之前......

txinnet的博客 327

究竟他在kernel里加了什么以支持mpls?

1 加了netlink相关命令和属性 MPLS_ATTR_ILM MPLS_CMD_NEWILM 2 arp处加了mpls tunnel接口 ARPHRD_MPLS_TUNNEL 3 网卡中加入mpls属性 net_device mpls_ptr 4 加了 RTA_SHIM (FIXME) 5 加了socket AF_MPLS 6 加了 NET_MPLS 7 f

anzhuangguai的专栏 990

linux mpls补丁,Linux MPLS路由器上拓樸驅動LSP機制的評估與研製

摘要:近年來,MPLS 技術日趨成熟,成為網際網路訊務工程(Traffic Engineering)的重要基礎技術.許多廠商以及研究團隊均提出各式各樣使用 MPLS 技術的方案,透過訊務工程的方式,以解決網路運作所可能遇到的各種不同狀況.然而訊務工程的系統由各種複雜的元件與協定組成,元件之間互動密切.隨著網路持續的運作,網路中各式各樣的訊務工程策略(TE policies)和服務等級合約(SLA,...

weixin_40009026的博客 102
上一篇: Linux进程内核栈与thread_info结构详解--Linux进程的管理与调度(九)
下一篇: linux IP命令总结
废言Pro
博客等级 码龄16年 1093粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值