网络子系统87_veth实现

//使用veth
//1.创建两块虚拟网卡veth1、veth2,然后点对点连接,此后两块网卡的数据会互相发送到对方
$ ip link add veth1 type veth peer name veth2

//2.创建网络命名空间t1
$ ip netns add t1

//3.将veth0加入t1,此时veth0便看不到了,因为被加入到其他命名空间中了
$ ip link set veth0 netns t1

//4.配置veth0的ip地址
$ ip netns exec t1 ifconfig eth0 192.168.1.200/24

//5.设置t1网络的默认路由
$ ip netns exec t1 route add default gw 192.168.1.1

//6.此时将veth2加入本地网桥中,便可以实现veth1在t1中访问外部网络了,过程略,可参考docker中的网络配置步骤

//veth的实现方法(drivers/net/veth.c)
//向ip link注册服务
1.1 static __init int veth_init(void)
{
	return rtnl_link_register(&veth_link_ops);
}

//处理ip link命令
2.1 static struct rtnl_link_ops veth_link_ops = {
	.kind		= DRV_NAME,
	.priv_size	= sizeof(struct veth_priv),
	.setup		= veth_setup,
	.validate	= veth_validate,
	.newlink	= veth_newlink,
	.dellink	= veth_dellink,
	.policy		= veth_policy,
	.maxtype	= VETH_INFO_MAX,
};

//新加入一条veth链接
2.2 static int veth_newlink(struct net_device *dev,
			 struct nlattr *tb[], struct nlattr *data[])
{
	int err;
	struct net_device *peer;
	struct veth_priv *priv;
	char ifname[IFNAMSIZ];
	struct nlattr *peer_tb[IFLA_MAX + 1], **tbp;

	 //首先创建并注册peer
	if (data != NULL && data[VETH_INFO_PEER] != NULL) {
		struct nlattr *nla_peer;
		//解析命令行参数
		nla_peer = data[VETH_INFO_PEER];
		err = nla_parse(peer_tb, IFLA_MAX,
				nla_data(nla_peer) + sizeof(struct ifinfomsg),
				nla_len(nla_peer) - sizeof(struct ifinfomsg),
				ifla_policy);
		...
	} else
		tbp = tb;

	//初始化peer
	...

	//注册peer
	err = register_netdevice(peer);
	if (err < 0)
		goto err_register_peer;

	//初始化peer的对等端
	...

	//注册peer的对等端
	err = register_netdevice(dev);
	if (err < 0)
		goto err_register_dev;

	//互相将peer保存到private中,在xmit的时候使用
	priv = netdev_priv(dev);
	priv->peer = peer;

	priv = netdev_priv(peer);
	priv->peer = dev;
	return 0;

err_register_dev:
err_alloc_name:
	unregister_netdevice(peer);
	return err;

err_register_peer:
	free_netdev(peer);
	return err;
}

//初始化veth设备
2.3 static void veth_setup(struct net_device *dev)
{
	//以太网设备的通用初始化
	ether_setup(dev);

	//veth的操作列表
	dev->netdev_ops = &veth_netdev_ops;
	dev->ethtool_ops = &veth_ethtool_ops;
	dev->features |= NETIF_F_LLTX;
	dev->destructor = veth_dev_free;
}

//通过veth发送skb
2.4 static netdev_tx_t veth_xmit(struct sk_buff *skb, struct net_device *dev)
{
	struct net_device *rcv = NULL;
	struct veth_priv *priv, *rcv_priv;
	struct veth_net_stats *stats, *rcv_stats;
	int length, cpu;

	//获取对等端
	priv = netdev_priv(dev);
	rcv = priv->peer;
	rcv_priv = netdev_priv(rcv);

	...

	//设置skb的设备为对等端
	skb->pkt_type = PACKET_HOST;
	skb->protocol = eth_type_trans(skb, rcv);
	if (dev->features & NETIF_F_NO_CSUM)
		skb->ip_summed = rcv_priv->ip_summed;

	...
	//将skb放入到对等端的接收队列中,从此完成了skb向对等端的发送
	netif_rx(skb);
	return NETDEV_TX_OK;

tx_drop:
	kfree_skb(skb);
	stats->tx_dropped++;
	return NETDEV_TX_OK;

rx_drop:
	kfree_skb(skb);
	rcv_stats->rx_dropped++;
	return NETDEV_TX_OK;
}

网络子系统87_veth实现

时间: 2024-08-25 20:36:40

网络子系统87_veth实现的相关文章

Linux内核分析(四)----进程管理|网络子系统|虚拟文件系统|驱动简介

Linux内核分析(四) 两天没有更新了,上次博文我们分析了linux的内存管理子系统,本来我不想对接下来的进程管理子系统.网络子系统.虚拟文件系统在这个阶段进行分析的,但是为了让大家对内核有个整体的把握,今天还是简单的介绍一下剩余的几个子系统,我们对这几个子系统的分析,只要了解其作用和部分内容即可,不必深究,等我们写上几个驱动,到时候按照驱动再来分析这几个子系统我们就清晰多了. 在http://www.cnblogs.com/wrjvszq/p/4257164.html一文我们提到过linux

Atitit.软件开发概念(11)--网络子系统--url编码 空格问题URLEncoder java js php

Atitit.软件开发概念(11)--网络子系统--url编码 空格问题URLEncoder java js php 1. RFC2396标准 including HTML 4.01 section 17.13.4, and also RFC 1866 (which is supercededby the W3C HTML recommendations). 在form的ContextType是[x-www-form-urlencoded]的时候会对form中的键/值对进行编码,空格被转义成+,

浅析Linux网络子系统(三)

继续分享陈铁飞老师在华为北研所讲座时的讲稿.这次内容有Qos子系统.默认排队规则.网络设备驱动程序和驱动实例.最后陈老师为大家推荐了基本参考书籍以供参考. Linux网络子系统系列课程连接: 本文最后会提供完整的下载版. Qos子系统的简要介绍 默认排队规则 设备无关层的输入流程图 网络设备驱动程序的介绍 一个具体的设备驱动实例 一个具体的设备驱动示例 AF_PACKET协议族的简要介绍 数据包的截获流程图 网络子系统更多内容提要,推荐参考书籍 一些网络编程问题诊断实例 陈老师从宏观的角度分析了

DSP网络子系统

1.  基本架构 网络协处理器(NETCP)有四个主要的模块,分别是PKTDMA控制器.包加速器(PA).安全加速器(SA).GbE交换子系统.这些模块通过包数据流交换部件连接.如图 1.1所示: 图 1.1  网络协处理器功能块图 1.1  时钟控制 网络协处理器有三个主时钟域,分别是PA.SA.GbE交换子系统.这三个时钟域都共享一个公共的时钟源,通常为350MHz.在使用PA.SA或GbE交换模块之前,必须启用各自的时钟域.在某些设备中,这个时钟可以由锁相环产生. NETCP也有辅助时钟,

DSP6678网络子系统之交换子系统

1 基本介绍 网络交换子系统由EMAC模块.SGMII模块.PHY设备.MDIO模块.网络交换机.以及系统集成的其他相关的子模块. NETCP的网络交换子系统的主要作用是提供一个在主设备和其他连接设备间进行数据传输的接口. 网络交换子系统主要包括如下三个模块: ?  网络交换部件 ?  MDIO模块 ?  两个SGMII模块(KeyStone I设备两个:KeyStone II设备四个) 网络交换子系统的交换机有三个端口,以及可以给主机的一组中断.可以通过配置总线进行配置.如图 1.1所示: 图

[国嵌攻略][135][网络子系统深度分析]

网络发包模型 1.选择路由 2.交给邻居子系统(路由中紧挨着发送方的网关).如果没有邻居信息,那么由Linux中的邻居子系统来建立邻居信息. 发送数据过程 //系统调用层和协议无关层 1.发送入口sock_aio_write 2.调用do_sock_write 3.调用__sock_sendmsg //网络协议栈 4.调用udp_sendmsg 5.调用ip_route_output_flow(选择路由) 6.调用udp_push_pending_frames 7.调用ip_push_pendi

Linux网络子系统安全性模块详细分析之文件xfrm_state.c函数介绍

2.4.4.4 外部函数 1. tasklet_hrtimer_start ( ) 函数原型: static inline int tasklet_hrtimer_start(struct tasklet_hrtimer *ttimer, ktime_t time, const enum hrtimer_mode mode) 函数参数:ttimer为含有定时器的小任务,time表示时间结构,mode表示时间的模式是相对时间还是绝对时间. 函数功能:设置带有定时器的小任务. 返回值:定时器如果在队

网络子系统在链路层的收发过程剖析(一)【转】

转自:http://linux.chinaunix.net/techdoc/net/2007/01/30/949381.shtml R.wen ([email protected]) 1),Skb_buff /* To allow 64K frame to be packed as single skb without frag_list */#define MAX_SKB_FRAGS (65536/PAGE_SIZE + 2) typedef struct skb_frag_struct sk

Linux网络子系统之---- PHY 配置

MII即媒体独立接口,也叫介质无关接口. 它包括一个数据接口,以及一个MAC和PHY之间的管理接口(图1). 数据接口包括分别用于发送器和接收器的两条独立信道.每条信道都有自己的数据.时钟和控制信号.MII数据接口总共需16个信号. 管理接口是个双信号接口:一个是时钟信号,另一个是数据信号.通过管理接口,上层能监视和控制PHY. RMII口是用两根线来传输数据的, MII口是用4根线来传输数据的, GMII是用8根线来传输数据的. GMII (Gigabit MII) GMII是8bit并行同步