VIDEOS 》 Linux Kernel dst_entry data-structure

For more details refer Linux Source:
skb_dst() - http://lxr.free-electrons.com/source/include/linux/skbuff.h#L845
skb_dst_set() - http://lxr.free-electrons.com/source/include/linux/skbuff.h#L864

And here is the copy paste of struct dst_entry data-structure (/include/net/dst.h) from the Kernel-source version 4.13 for quick reference:

struct dst_entry {
	struct net_device       *dev;
	struct rcu_head		rcu_head;
	struct dst_entry	*child;
	struct  dst_ops	        *ops;
	unsigned long		_metrics;
	unsigned long           expires;
	struct dst_entry	*path;
	struct dst_entry	*from;
	struct xfrm_state	*xfrm;
	void			*__pad1;
	int			(*input)(struct sk_buff *);
	int			(*output)(struct net *net, struct sock *sk, struct sk_buff *skb);

	unsigned short		flags;
#define DST_HOST		0x0001
#define DST_NOXFRM		0x0002
#define DST_NOPOLICY		0x0004
#define DST_NOCOUNT		0x0008
#define DST_FAKE_RTABLE		0x0010
#define DST_XFRM_TUNNEL		0x0020
#define DST_XFRM_QUEUE		0x0040
#define DST_METADATA		0x0080

	short			error;

	/* A non-zero value of dst->obsolete forces by-hand validation
	 * of the route entry.  Positive values are set by the generic
	 * dst layer to indicate that the entry has been forcefully
	 * destroyed.
	 * Negative values are used by the implementation layer code to
	 * force invocation of the dst_ops->check() method.
	short			obsolete;
	unsigned short		header_len;	/* more space at head required */
	unsigned short		trailer_len;	/* space to reserve at tail */
	unsigned short		__pad3;

	__u32			tclassid;
	__u32			__pad2;

#ifdef CONFIG_64BIT
	 * Align __refcnt to a 64 bytes alignment
	 * (L1_CACHE_SIZE would be too much)
	long			__pad_to_align_refcnt[2];
	 * __refcnt wants to be on a different cache line from
	 * input/output/ops or performance tanks badly
	atomic_t		__refcnt;	/* client references	*/
	int			__use;
	unsigned long		lastuse;
	struct lwtunnel_state   *lwtstate;
	union {
		struct dst_entry	*next;
		struct rtable __rcu	*rt_next;
		struct rt6_info		*rt6_next;
		struct dn_route __rcu	*dn_next;

And here is the copy paste of API skb_dst() which returns the dst_entry linked to the corresponding skbuff instance (include/linux/skbuff.h) from the Kernel-source version 4.13 for quick reference:

 * skb_dst - returns skb dst_entry
 * @skb: buffer
 * Returns skb dst_entry, regardless of reference taken or not.
static inline struct dst_entry *skb_dst(const struct sk_buff *skb)
	/* If refdst was not refcounted, check we still are in a 
	 * rcu_read_lock section
	WARN_ON((skb->_skb_refdst & SKB_DST_NOREF) &&
		!rcu_read_lock_held() &&
	return (struct dst_entry *)(skb->_skb_refdst & SKB_DST_PTRMASK);

Here is the Network data/API flow through kernel for quick reference:
Source: https://wiki.linuxfoundation.org/images/1/1c/Network_data_flow_through_kernel.png
Network data/API flow through kernel for quick reference

Suggested Topics:

Video Episodes :: Linux Kernel programming

Join The Linux Channel :: Facebook Group ↗

Visit The Linux Channel :: on Youtube ↗

Join a course:

💎 Linux, Kernel, Networking and Device Drivers: PDF Brochure
💎 PhD or equivalent (or Post Doctoral) looking for assistance: Details
💎 ... or unlimited life-time mentorship: Details

💗 Help shape the future: Sponsor/Donate

Recommended Topics:
Featured Video:
Watch on Youtube - [421/0] 0x169 Synchronization in Linux user-space - Architecting multi-process and multi-threads ↗

Trending Video:
Watch on Youtube - [89/0] 205 VLOG - Choose the right harddisk for your NAS ↗

Recommended Video:
Watch on Youtube - [498/0] 333 Linux Kernel Routing Table and Administrative Distance (AD) - Episode2 (follow-up) - for Network Software Developers ↗