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
  • 3755

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

使用L2TP进行双重接入

转自:http://wiki.openwrt.org/zh-cn/doc/howto/connect_by_l2tp             http://wiki.openwrt.org/doc/...
  • ccwwff
  • ccwwff
  • 2013年09月01日 22:32
  • 8553

L2TP详解

1.L2TP简介    L2TP(Layer 2 Tunneling Protocol,二层隧道协议)是VPDN(Virtual PrivateDial-up Network,虚拟私有拨号网)隧道协议...

L2TP技术原理

L2TP L2TP概述 L2TP(Layer 2 Tunneling Protocol,二层隧道协议)是VPDN(Virtual Private Dial-up Network,虚拟私有拨号网)隧道协...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Linux PPP 实现源码分析

nux PPP实现源码分析 2013-05-21 23:44 6091人阅读 评论(18) 收藏 举报  分类: Linux 版权声明:本文为博主原创文章,...

linux2.6内核ppp分析

1 简介ppp协议(点到点协议),在拨号网络中应用比较广泛,逐渐在替代slip协议。ppp数据包格式为:| 协议码 | 载荷   |填充符ppp主要有四类协议码:   1 0x0001 - 0x3ff...
  • linweig
  • linweig
  • 2010年04月12日 21:06
  • 4777

比较详细的l2tpv3配置

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

团体程序设计天梯赛L2-004 这是二叉搜索树吗?(数据结构)

思路:对于一颗合法的二叉搜索树,那么即满足对于区间[l,r],存在一个点i,a[l] #include #include #include using namespace std; con...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux l2tp kernel(包含了L2TPv3的版本)主要数据结构理解
举报原因:
原因补充:

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