linux l2tp kernel(包含了L2TPv3的版本)主要数据结构理解

原创 2012年04月10日 10:57:03

主要结构体

 原来的注释就挺全的,就不多废话了,无非就是通过指针相互指,通过全局的hash保存。

1

struct l2tp_net {
	struct list_head l2tp_tunnel_list; //保存了所有tunnel的双向列表的表头
	spinlock_t l2tp_tunnel_list_lock;
	struct hlist_head l2tp_session_hlist[L2TP_HASH_SIZE_2]; /*保存了所有的session的hash列表的表头偏移量由hash_32计算,此处的size(1<<8)更大,hash冲突比tunnel结构体里的小(1<<4)(不过一个tunnel基本上也不会包含很多个session,具体请参考hash_32的实现),通过调用RCU的api方式访问*/
	spinlock_t l2tp_session_hlist_lock;
};

2

struct l2tp_tunnel {
	int			magic;		/* Should be L2TP_TUNNEL_MAGIC */
	rwlock_t		hlist_lock;	/* protect session_hlist */
	struct hlist_head	session_hlist[L2TP_HASH_SIZE]; //size比较下,是1<<4
						/* hashed list of sessions,
						 * hashed by id */
	u32			tunnel_id;
	u32			peer_tunnel_id;
	int			version;	/* 2=>L2TPv2, 3=>L2TPv3 */

	char			name[20];	/* for logging */ //"tunl %u"
	int			debug;		/* bitmask of debug message
						 * categories */
	enum l2tp_encap_type	encap;
	struct l2tp_stats	stats;

	struct list_head	list;		/* Keep a list of all tunnels */ //双向链接到l2tp_net结构体的l2tp_tunnel_list列表中,见上
	struct net		*l2tp_net;	/* the net we belong to */

	atomic_t		ref_count;
#ifdef CONFIG_DEBUG_FS
	void (*show)(struct seq_file *m, void *arg);
#endif
	int (*recv_payload_hook)(struct sk_buff *skb);
	void (*old_sk_destruct)(struct sock *);
	struct sock		*sock;		/* Parent socket */
	int			fd;

	uint8_t			priv[0];	/* private data */
};
3
struct l2tp_session {
	int			magic;		/* should be
						 * L2TP_SESSION_MAGIC */

	struct l2tp_tunnel	*tunnel;	/* back pointer to tunnel
						 * context */ //指向所属tunnel
	u32			session_id;
	u32			peer_session_id;
	u8			cookie[8];
	int			cookie_len;
	u8			peer_cookie[8];
	int			peer_cookie_len;
	u16			offset;		/* offset from end of L2TP header
						   to beginning of data */
	u16			l2specific_len;
	u16			l2specific_type;
	u16			hdr_len;
	u32			nr;		/* session NR state (receive) */
	u32			ns;		/* session NR state (send) */
	struct sk_buff_head	reorder_q;	/* receive reorder queue */
	struct hlist_node	hlist;		/* Hash list node */ //链接到l2tp_tunnel结构体的sesson_hlist中,见上
	atomic_t		ref_count;

	char			name[32];	/* for logging */
	char			ifname[IFNAMSIZ];
	unsigned		data_seq:2;	/* data sequencing level
						 * 0 => none, 1 => IP only,
						 * 2 => all
						 */
	unsigned		recv_seq:1;	/* expect receive packets with
						 * sequence numbers? */
	unsigned		send_seq:1;	/* send packets with sequence
						 * numbers? */
	unsigned		lns_mode:1;	/* behave as LNS? LAC enables
						 * sequence numbers under
						 * control of LNS. */
	int			debug;		/* bitmask of debug message
						 * categories */
	int			reorder_timeout; /* configured reorder timeout
						  * (in jiffies) */
	int			mtu;
	int			mru;
	enum l2tp_pwtype	pwtype;
	struct l2tp_stats	stats;
	struct hlist_node	global_hlist;	/* Global hash list node */ //链接到l2tp_net结构体的l2tp_session_hlist中,见上

	int (*build_header)(struct l2tp_session *session, void *buf);
	void (*recv_skb)(struct l2tp_session *session, struct sk_buff *skb, int data_len);
	void (*session_close)(struct l2tp_session *session);
	void (*ref)(struct l2tp_session *session);
	void (*deref)(struct l2tp_session *session);
#if defined(CONFIG_L2TP_DEBUGFS) || defined(CONFIG_L2TP_DEBUGFS_MODULE)
	void (*show)(struct seq_file *m, void *priv);
#endif
	uint8_t			priv[0];	/* private data */
};
4
/* Private data of each session. This data lives at the end of struct
 * l2tp_session, referenced via session->priv[]. 即处于上面结构体l2tp_session的最后部分,通过l2tp_session_priv(struct l2tp_session session)返回相应的地址指针,这里是上层承载ppp的包
 */
struct pppol2tp_session {
	int			owner;		/* pid that opened the socket */

	struct sock		*sock;		/* Pointer to the session
						 * PPPoX socket */
	struct sock		*tunnel_sock;	/* Pointer to the tunnel UDP
						 * socket */
	int			flags;		/* accessed by PPPIOCGFLAGS.
						 * Unused. */
};


linux安装VPN server之L2TP VPN

Linux搭建L2TP VPN的server的环境,本次搭建的Linux环境是centos7,其操作步骤如下: 1、一些预先准备的环境 yum install -y make gcc gmp-deve...
  • sdulsj
  • sdulsj
  • 2016年11月21日 15:01
  • 5136

linux下VPN协议PPTP、L2TP、OpenVPN区别与配置使用详解

本文给大家介绍linux下VPN协议PPTP、L2TP、OpenVPN区别与配置使用详解。 一、PPTP、L2TP、OpenVPN三种隧道协议的概念 1、PPTP(Point to Poi...
  • sixfish2013
  • sixfish2013
  • 2017年03月31日 22:48
  • 2174

比较详细的l2tpv3配置

  • 2009年11月24日 15:42
  • 337KB
  • 下载

linux l2tp kernel(包含了L2TPv3的版本)主要数据结构理解

主要结构体  原来的注释就挺全的,就不多废话了,无非就是通过指针相互指,通过全局的hash保存。 1 struct l2tp_net { struct list_head l2tp_t...
  • seds19841231
  • seds19841231
  • 2012年04月10日 10:57
  • 2038

理解openl2tp架构——1

背景介绍: l2tp有多种实现,即便是开源的linux下就有多个版本,由于工作需要,需要对linux下的l2tp实现做一些定制化工作。为了避免重复发明轮子以及时间上等等多方面全方位的考虑,选择ope...
  • seds19841231
  • seds19841231
  • 2012年03月08日 14:25
  • 3556

ubuntu-l2tpv3配置介绍

ubuntu-l2tpv3配置介绍 参考连接http://manpages.ubuntu.com/manpages/trusty/man8/ip-l2tp.8.html trusty (8) ip...
  • bingyu9875
  • bingyu9875
  • 2018年01月16日 15:43
  • 19

L2TP VPN应用场景

L2TP VPN的原生使用环境                                 第9期专栏讲的是VPN的起源,这一期讲讲VPN中的VPDN(Virtual Priva...
  • u013485792
  • u013485792
  • 2016年03月11日 10:42
  • 1498

Linux内核网络:实现和理论(2014)-第十章 IPsec

... XFRM框架       IPsec基于XFRM(读作“transform”)框架实现,该框架源于USAGI项目,其目标是提供一种产品化的IPv6和IPsec协议栈。术语“transform”...
  • naipeng
  • naipeng
  • 2017年05月10日 21:04
  • 574

L2TP技术原理

L2TP L2TP概述 L2TP(Layer 2 Tunneling Protocol,二层隧道协议)是VPDN(Virtual Private Dial-up Network,虚拟私有拨号网)隧道协...
  • xiaoshengqdlg
  • xiaoshengqdlg
  • 2014年07月16日 15:40
  • 5533

怎样知道Linux kernel每一个历史版本的主要变化

人事有代谢,往来成古今。 江山留胜迹,我辈复登临。 研究Linux的历史版本变化,对解决一些现实问题,往往也具备很大的参考意义。 关注Linuxer,订阅Linux技术文章 ...
  • juS3Ve
  • juS3Ve
  • 2017年11月21日 00:00
  • 336
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux l2tp kernel(包含了L2TPv3的版本)主要数据结构理解
举报原因:
原因补充:

(最多只允许输入30个字)