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

配置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功能详解

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

redwingz的博客 5138

开关电源辅助电源设计全流程拆解

地类型定义包含电路功率地(PGND)高压侧地,与主功率电路地相连整流桥负极、原边电感地、UC3842的功率地信号地(SGND)低压侧地,与控制/采样电路地相连副边整流管地、TL431地、MCU/运放地。

lyzh971103的博客 1469

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

别再死记硬背参数了!用ADS手把手教你仿真一个4GHz镜像抑制混频器(附完整工程文件)

本文详细解析了4GHz镜像抑制混频器的ADS仿真全流程,从理论到实践,涵盖混频器设计基础、ADS工程搭建、二极管选型、非线性仿真及性能优化。通过实战案例,帮助工程师掌握关键参数平衡与调试技巧,提升射频电路设计效率。

weixin_42552716的博客 339

Unity3D实现视频和模型融合效果

在Unity中,视频和3D模型融合通常涉及到将视频表面内嵌到3D场景中。视频不影响模型的展示, 这可以通过使用Shader和Texture来实现。大家好,我是心疼你的一切,不定时更新Unity开发技巧,觉得有用记得一键三连哦。下面就让我们进入正文吧!提示:以下是本篇文章正文内容,下面案例可供参考本次介绍的就是视频和模型融合的实现,以后有其他的需要添加的会继续添加不定时更新Unity开发技巧,觉得有用记得一键三连哦。么么哒。

心疼你的一切博客 5357

ip route带 mpls命令使用方法

mpls iproute2

anzhuangguai的专栏 1552

【Burp入门第三十三篇】BurpSuite+Proxifier安装配置,实现微信小程序抓包

本文介绍Burp+Proxifier安装配置,实现微信小程序抓包

等风来 5873

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

【系统架构设计师】论文模板样例:论软件系统架构风格

本人于年月参与项目,该系统为*,在该项目组中我担任系统架构师岗位,主要负责系统整体架构设计。本文以该车联网项目为例,主要讨论了软件架构风格在该项目中的具体应用。底层架构风格我们采用了虚拟机风格中的解释器,因该公交共有几十种不同的数据协议,使用解释器风格可以满足整车数据协议兼容性需求;中间层关于应用层的数据流转采用了独立构件风格中的隐式调用,以减低系统间耦合度、简化软件架构,提高可修改性方面的架构属性;应用系统层采用了B/S的架构风格,统一解决公交行业性难题“实施推广难、维护难”问题。

数据知道的博客 9927

Nmap源码分析(端口扫描)

端口扫描是Nmap的核心功能,用于确定目标机的端口状态(开放、关闭、过滤等),也为Nmap的服务与版本扫描、OS扫描、脚本扫描提供基本的指引信息。所以,深入理解端口扫描的实现对分析其他的扫描方式很有帮助。 1简单回顾   首先简要回顾一下端口扫描的原理以及命令行选项。 1.1扫描原理   Nmap提供的10多种类型的端口扫描方法,如TCP SYN/ACK/FIN/Xmas/NULL/ Windows/Connect,FTP Bounce, Idle scan, UDP port u...

墨痕诉清风的博客 1597

MPLS的静态配置

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

weixin_46980289的博客 836

VLA数据采集以及训练

直到15s计时结束,弹出下面的内容,这个时候不会录制视频了,这里就是需要复位物体到初始位置,尽量保证物体的初始位置放在一样的位置,计时3s,同样根据自己的复位时间来修改(--dataset.reset_time_s=3),这里和前面录制数据的区别就是fps后面多了一个nment,可以作为一个标记,知道什么时候开始去复位而不会拍到自己的手臂。复制网址,在浏览器打开,会出现下面的窗口,依次检查每一轮是否存在问题,例如是否出现录制不完整,是否存在除了机械臂以外的其他移动物体,这些都可能会影响最终训练的效果。

weixin_45303602的博客 496

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

Cesium功能集(十二):Cesium中流体仿真

【代码】Cesium功能集(十二):Cesium中流体仿真。

GIS肆月 601

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

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

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

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

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

将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

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

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

weixin_58088629的博客 2850

Linux上实现mpls的环境配置

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

CJ的博客 3390

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

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

SR-BE 承载 BGP & SR 与 MPLS 标签互通

mapping-server prefix-sid-mapping 10.1.1.1 32 11 SR为10.1.1.1/32的路由分配 prefix-sid。lsp-trigger segment-routing-interworking best-effort host #让MPLS为SR-BE 主机分标签。在 NE5(双站中间节点)上为10.1.2.2/32 的路由 SR 分配标签—mapping-server。让 NE2、4、6、5 运行 SR,分配 SR 标签。

1127
上一篇: 被神话的Linux, 一文带你看清Linux在多核可扩展性设计上的不足
下一篇: 300来行代码带你实现一个能跑的最小Linux文件系统
废言Pro
博客等级 码龄16年 1093粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值