]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - include/net/inetpeer.h
net/mlx5e: Rx, Fix checksum calculation for new hardware
[mirror_ubuntu-bionic-kernel.git] / include / net / inetpeer.h
CommitLineData
b2441318 1/* SPDX-License-Identifier: GPL-2.0 */
1da177e4
LT
2/*
3 * INETPEER - A storage for permanent information about peers
4 *
1da177e4
LT
5 * Authors: Andrey V. Savochkin <saw@msu.ru>
6 */
7
8#ifndef _NET_INETPEER_H
9#define _NET_INETPEER_H
10
11#include <linux/types.h>
12#include <linux/init.h>
13#include <linux/jiffies.h>
14#include <linux/spinlock.h>
60659823 15#include <linux/rtnetlink.h>
672f007d 16#include <net/ipv6.h>
60063497 17#include <linux/atomic.h>
1da177e4 18
192132b9
DA
19/* IPv4 address key for cache lookups */
20struct ipv4_addr_key {
21 __be32 addr;
22 int vif;
23};
24
5345c2e1
DA
25#define INETPEER_MAXKEYSZ (sizeof(struct in6_addr) / sizeof(u32))
26
27struct inetpeer_addr {
582a72da 28 union {
192132b9 29 struct ipv4_addr_key a4;
5345c2e1
DA
30 struct in6_addr a6;
31 u32 key[INETPEER_MAXKEYSZ];
582a72da 32 };
7a71ed89 33 __u16 family;
8790ca17 34};
582a72da 35
fd2c3ef7 36struct inet_peer {
b145425f 37 struct rb_node rb_node;
8790ca17 38 struct inetpeer_addr daddr;
2b77bdde
ED
39
40 u32 metrics[RTAX_MAX];
41 u32 rate_tokens; /* rate limiting for ICMP */
9ce92d57 42 u32 n_redirects;
2b77bdde 43 unsigned long rate_last;
317fe0e6 44 /*
1cc9a98b 45 * Once inet_peer is queued for deletion (refcnt == 0), following field
73f156a6 46 * is not available: rid
60659823 47 * We can share memory with rcu_head to help keep inet_peer small.
317fe0e6
ED
48 */
49 union {
50 struct {
ddd4aa42 51 atomic_t rid; /* Frag reception counter */
317fe0e6
ED
52 };
53 struct rcu_head rcu;
54 };
2b77bdde
ED
55
56 /* following fields might be frequently dirtied */
57 __u32 dtime; /* the time of last use of not referenced entries */
1cc9a98b 58 refcount_t refcnt;
1da177e4
LT
59};
60
c3426b47 61struct inet_peer_base {
b145425f 62 struct rb_root rb_root;
c3426b47
DM
63 seqlock_t lock;
64 int total;
65};
66
1fd51155 67void inet_peer_base_init(struct inet_peer_base *);
c3426b47 68
1fd51155 69void inet_initpeers(void) __init;
1da177e4 70
144001bd
DM
71#define INETPEER_METRICS_NEW (~(u32) 0)
72
3abef286
DA
73static inline void inetpeer_set_addr_v4(struct inetpeer_addr *iaddr, __be32 ip)
74{
192132b9 75 iaddr->a4.addr = ip;
887dc9f2 76 iaddr->a4.vif = 0;
3abef286
DA
77 iaddr->family = AF_INET;
78}
79
80static inline __be32 inetpeer_get_addr_v4(struct inetpeer_addr *iaddr)
81{
192132b9 82 return iaddr->a4.addr;
3abef286
DA
83}
84
85static inline void inetpeer_set_addr_v6(struct inetpeer_addr *iaddr,
86 struct in6_addr *in6)
87{
5345c2e1 88 iaddr->a6 = *in6;
3abef286
DA
89 iaddr->family = AF_INET6;
90}
91
92static inline struct in6_addr *inetpeer_get_addr_v6(struct inetpeer_addr *iaddr)
93{
5345c2e1 94 return &iaddr->a6;
3abef286
DA
95}
96
1da177e4 97/* can be called with or without local BH being disabled */
c0efc887 98struct inet_peer *inet_getpeer(struct inet_peer_base *base,
c8a627ed
G
99 const struct inetpeer_addr *daddr,
100 int create);
b534ecf1 101
c0efc887 102static inline struct inet_peer *inet_getpeer_v4(struct inet_peer_base *base,
54db0cc2 103 __be32 v4daddr,
192132b9 104 int vif, int create)
b534ecf1 105{
8790ca17 106 struct inetpeer_addr daddr;
b534ecf1 107
192132b9
DA
108 daddr.a4.addr = v4daddr;
109 daddr.a4.vif = vif;
b534ecf1 110 daddr.family = AF_INET;
c0efc887 111 return inet_getpeer(base, &daddr, create);
b534ecf1 112}
1da177e4 113
c0efc887 114static inline struct inet_peer *inet_getpeer_v6(struct inet_peer_base *base,
54db0cc2
G
115 const struct in6_addr *v6daddr,
116 int create)
672f007d 117{
8790ca17 118 struct inetpeer_addr daddr;
672f007d 119
5345c2e1 120 daddr.a6 = *v6daddr;
672f007d 121 daddr.family = AF_INET6;
c0efc887 122 return inet_getpeer(base, &daddr, create);
672f007d
DM
123}
124
d39d14ff
DA
125static inline int inetpeer_addr_cmp(const struct inetpeer_addr *a,
126 const struct inetpeer_addr *b)
127{
5345c2e1
DA
128 int i, n;
129
130 if (a->family == AF_INET)
131 n = sizeof(a->a4) / sizeof(u32);
132 else
133 n = sizeof(a->a6) / sizeof(u32);
d39d14ff
DA
134
135 for (i = 0; i < n; i++) {
5345c2e1 136 if (a->key[i] == b->key[i])
d39d14ff 137 continue;
5345c2e1 138 if (a->key[i] < b->key[i])
d39d14ff
DA
139 return -1;
140 return 1;
141 }
142
143 return 0;
144}
145
1da177e4 146/* can be called from BH context or outside */
1fd51155
JP
147void inet_putpeer(struct inet_peer *p);
148bool inet_peer_xrlim_allow(struct inet_peer *peer, int timeout);
1da177e4 149
1fd51155 150void inetpeer_invalidate_tree(struct inet_peer_base *);
5faa5df1 151
1da177e4 152#endif /* _NET_INETPEER_H */