cregit-Linux how code gets into the kernel

Release 4.7 include/net/inetpeer.h

Directory: include/net
/*
 *              INETPEER - A storage for permanent information about peers
 *
 *  Authors:    Andrey V. Savochkin <saw@msu.ru>
 */

#ifndef _NET_INETPEER_H

#define _NET_INETPEER_H

#include <linux/types.h>
#include <linux/init.h>
#include <linux/jiffies.h>
#include <linux/spinlock.h>
#include <linux/rtnetlink.h>
#include <net/ipv6.h>
#include <linux/atomic.h>

/* IPv4 address key for cache lookups */

struct ipv4_addr_key {
	
__be32	addr;
	
int	vif;
};


#define INETPEER_MAXKEYSZ   (sizeof(struct in6_addr) / sizeof(u32))


struct inetpeer_addr {
	union {
		
struct ipv4_addr_key	a4;
		
struct in6_addr		a6;
		
u32			key[INETPEER_MAXKEYSZ];
	};
	
__u16				family;
};


struct inet_peer {
	/* group together avl_left,avl_right,v4daddr to speedup lookups */
	

struct inet_peer __rcu	*avl_left, *avl_right;
	
struct inetpeer_addr	daddr;
	
__u32			avl_height;

	
u32			metrics[RTAX_MAX];
	
u32			rate_tokens;	/* rate limiting for ICMP */
	
unsigned long		rate_last;
	union {
		
struct list_head	gc_list;
		
struct rcu_head     gc_rcu;
	};
	/*
         * Once inet_peer is queued for deletion (refcnt == -1), following field
         * is not available: rid
         * We can share memory with rcu_head to help keep inet_peer small.
         */
	union {
		struct {
			
atomic_t			rid;		/* Frag reception counter */
		};
		
struct rcu_head         rcu;
		
struct inet_peer	*gc_next;
	};

	/* following fields might be frequently dirtied */
	
__u32			dtime;	/* the time of last use of not referenced entries */
	
atomic_t		refcnt;
};


struct inet_peer_base {
	
struct inet_peer __rcu	*root;
	
seqlock_t		lock;
	
int			total;
};

void inet_peer_base_init(struct inet_peer_base *);

void inet_initpeers(void) __init;


#define INETPEER_METRICS_NEW	(~(u32) 0)


static inline void inetpeer_set_addr_v4(struct inetpeer_addr *iaddr, __be32 ip) { iaddr->a4.addr = ip; iaddr->a4.vif = 0; iaddr->family = AF_INET; }

Contributors

PersonTokensPropCommitsCommitProp
david aherndavid ahern2978.38%266.67%
eric dumazeteric dumazet821.62%133.33%
Total37100.00%3100.00%


static inline __be32 inetpeer_get_addr_v4(struct inetpeer_addr *iaddr) { return iaddr->a4.addr; }

Contributors

PersonTokensPropCommitsCommitProp
david aherndavid ahern19100.00%2100.00%
Total19100.00%2100.00%


static inline void inetpeer_set_addr_v6(struct inetpeer_addr *iaddr, struct in6_addr *in6) { iaddr->a6 = *in6; iaddr->family = AF_INET6; }

Contributors

PersonTokensPropCommitsCommitProp
david aherndavid ahern30100.00%2100.00%
Total30100.00%2100.00%


static inline struct in6_addr *inetpeer_get_addr_v6(struct inetpeer_addr *iaddr) { return &iaddr->a6; }

Contributors

PersonTokensPropCommitsCommitProp
david aherndavid ahern20100.00%2100.00%
Total20100.00%2100.00%

/* can be called with or without local BH being disabled */ struct inet_peer *inet_getpeer(struct inet_peer_base *base, const struct inetpeer_addr *daddr, int create);
static inline struct inet_peer *inet_getpeer_v4(struct inet_peer_base *base, __be32 v4daddr, int vif, int create) { struct inetpeer_addr daddr; daddr.a4.addr = v4daddr; daddr.a4.vif = vif; daddr.family = AF_INET; return inet_getpeer(base, &daddr, create); }

Contributors

PersonTokensPropCommitsCommitProp
david s. millerdavid s. miller4270.00%350.00%
david aherndavid ahern1321.67%116.67%
gao fenggao feng58.33%233.33%
Total60100.00%6100.00%


static inline struct inet_peer *inet_getpeer_v6(struct inet_peer_base *base, const struct in6_addr *v6daddr, int create) { struct inetpeer_addr daddr; daddr.a6 = *v6daddr; daddr.family = AF_INET6; return inet_getpeer(base, &daddr, create); }

Contributors

PersonTokensPropCommitsCommitProp
david s. millerdavid s. miller4282.35%337.50%
gao fenggao feng59.80%225.00%
alexey dobriyanalexey dobriyan23.92%112.50%
eric dumazeteric dumazet11.96%112.50%
david aherndavid ahern11.96%112.50%
Total51100.00%8100.00%


static inline int inetpeer_addr_cmp(const struct inetpeer_addr *a, const struct inetpeer_addr *b) { int i, n; if (a->family == AF_INET) n = sizeof(a->a4) / sizeof(u32); else n = sizeof(a->a6) / sizeof(u32); for (i = 0; i < n; i++) { if (a->key[i] == b->key[i]) continue; if (a->key[i] < b->key[i]) return -1; return 1; } return 0; }

Contributors

PersonTokensPropCommitsCommitProp
david aherndavid ahern119100.00%2100.00%
Total119100.00%2100.00%

/* can be called from BH context or outside */ void inet_putpeer(struct inet_peer *p); bool inet_peer_xrlim_allow(struct inet_peer *peer, int timeout); void inetpeer_invalidate_tree(struct inet_peer_base *); #endif /* _NET_INETPEER_H */

Overall Contributors

PersonTokensPropCommitsCommitProp
david aherndavid ahern25644.60%411.43%
david s. millerdavid s. miller17129.79%1028.57%
pre-gitpre-git6310.98%12.86%
eric dumazeteric dumazet559.58%1337.14%
gao fenggao feng152.61%25.71%
steffen klassertsteffen klassert91.57%12.86%
alexey dobriyanalexey dobriyan20.35%12.86%
rusty russellrusty russell10.17%12.86%
arun sharmaarun sharma10.17%12.86%
adrian bunkadrian bunk10.17%12.86%
Total574100.00%35100.00%
Directory: include/net
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
{% endraw %}