mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-17 02:36:21 +00:00
[IPV4]: encapsulation annotations
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
4806126d78
commit
d5a0a1e310
@ -19,10 +19,10 @@ struct ip_tunnel_parm
|
|||||||
{
|
{
|
||||||
char name[IFNAMSIZ];
|
char name[IFNAMSIZ];
|
||||||
int link;
|
int link;
|
||||||
__u16 i_flags;
|
__be16 i_flags;
|
||||||
__u16 o_flags;
|
__be16 o_flags;
|
||||||
__u32 i_key;
|
__be32 i_key;
|
||||||
__u32 o_key;
|
__be32 o_key;
|
||||||
struct iphdr iph;
|
struct iphdr iph;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -211,8 +211,8 @@ struct xfrm_user_tmpl {
|
|||||||
|
|
||||||
struct xfrm_encap_tmpl {
|
struct xfrm_encap_tmpl {
|
||||||
__u16 encap_type;
|
__u16 encap_type;
|
||||||
__u16 encap_sport;
|
__be16 encap_sport;
|
||||||
__u16 encap_dport;
|
__be16 encap_dport;
|
||||||
xfrm_address_t encap_oa;
|
xfrm_address_t encap_oa;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
* into IP header for icv calculation. Options are already checked
|
* into IP header for icv calculation. Options are already checked
|
||||||
* for validity, so paranoia is not required. */
|
* for validity, so paranoia is not required. */
|
||||||
|
|
||||||
static int ip_clear_mutable_options(struct iphdr *iph, u32 *daddr)
|
static int ip_clear_mutable_options(struct iphdr *iph, __be32 *daddr)
|
||||||
{
|
{
|
||||||
unsigned char * optptr = (unsigned char*)(iph+1);
|
unsigned char * optptr = (unsigned char*)(iph+1);
|
||||||
int l = iph->ihl*4 - sizeof(struct iphdr);
|
int l = iph->ihl*4 - sizeof(struct iphdr);
|
||||||
@ -162,7 +162,7 @@ static int ah_input(struct xfrm_state *x, struct sk_buff *skb)
|
|||||||
iph->frag_off = 0;
|
iph->frag_off = 0;
|
||||||
iph->check = 0;
|
iph->check = 0;
|
||||||
if (ihl > sizeof(*iph)) {
|
if (ihl > sizeof(*iph)) {
|
||||||
u32 dummy;
|
__be32 dummy;
|
||||||
if (ip_clear_mutable_options(iph, &dummy))
|
if (ip_clear_mutable_options(iph, &dummy))
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
@ -67,7 +67,7 @@ static int esp_output(struct xfrm_state *x, struct sk_buff *skb)
|
|||||||
if (x->encap) {
|
if (x->encap) {
|
||||||
struct xfrm_encap_tmpl *encap = x->encap;
|
struct xfrm_encap_tmpl *encap = x->encap;
|
||||||
struct udphdr *uh;
|
struct udphdr *uh;
|
||||||
u32 *udpdata32;
|
__be32 *udpdata32;
|
||||||
|
|
||||||
uh = (struct udphdr *)esph;
|
uh = (struct udphdr *)esph;
|
||||||
uh->source = encap->encap_sport;
|
uh->source = encap->encap_sport;
|
||||||
@ -81,7 +81,7 @@ static int esp_output(struct xfrm_state *x, struct sk_buff *skb)
|
|||||||
esph = (struct ip_esp_hdr *)(uh + 1);
|
esph = (struct ip_esp_hdr *)(uh + 1);
|
||||||
break;
|
break;
|
||||||
case UDP_ENCAP_ESPINUDP_NON_IKE:
|
case UDP_ENCAP_ESPINUDP_NON_IKE:
|
||||||
udpdata32 = (u32 *)(uh + 1);
|
udpdata32 = (__be32 *)(uh + 1);
|
||||||
udpdata32[0] = udpdata32[1] = 0;
|
udpdata32[0] = udpdata32[1] = 0;
|
||||||
esph = (struct ip_esp_hdr *)(udpdata32 + 2);
|
esph = (struct ip_esp_hdr *)(udpdata32 + 2);
|
||||||
break;
|
break;
|
||||||
|
@ -144,7 +144,7 @@ static struct net_device *ipgre_fb_tunnel_dev;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#define HASH_SIZE 16
|
#define HASH_SIZE 16
|
||||||
#define HASH(addr) ((addr^(addr>>4))&0xF)
|
#define HASH(addr) (((__force u32)addr^((__force u32)addr>>4))&0xF)
|
||||||
|
|
||||||
static struct ip_tunnel *tunnels[4][HASH_SIZE];
|
static struct ip_tunnel *tunnels[4][HASH_SIZE];
|
||||||
|
|
||||||
@ -157,7 +157,7 @@ static DEFINE_RWLOCK(ipgre_lock);
|
|||||||
|
|
||||||
/* Given src, dst and key, find appropriate for input tunnel. */
|
/* Given src, dst and key, find appropriate for input tunnel. */
|
||||||
|
|
||||||
static struct ip_tunnel * ipgre_tunnel_lookup(u32 remote, u32 local, u32 key)
|
static struct ip_tunnel * ipgre_tunnel_lookup(__be32 remote, __be32 local, __be32 key)
|
||||||
{
|
{
|
||||||
unsigned h0 = HASH(remote);
|
unsigned h0 = HASH(remote);
|
||||||
unsigned h1 = HASH(key);
|
unsigned h1 = HASH(key);
|
||||||
@ -194,9 +194,9 @@ static struct ip_tunnel * ipgre_tunnel_lookup(u32 remote, u32 local, u32 key)
|
|||||||
|
|
||||||
static struct ip_tunnel **ipgre_bucket(struct ip_tunnel *t)
|
static struct ip_tunnel **ipgre_bucket(struct ip_tunnel *t)
|
||||||
{
|
{
|
||||||
u32 remote = t->parms.iph.daddr;
|
__be32 remote = t->parms.iph.daddr;
|
||||||
u32 local = t->parms.iph.saddr;
|
__be32 local = t->parms.iph.saddr;
|
||||||
u32 key = t->parms.i_key;
|
__be32 key = t->parms.i_key;
|
||||||
unsigned h = HASH(key);
|
unsigned h = HASH(key);
|
||||||
int prio = 0;
|
int prio = 0;
|
||||||
|
|
||||||
@ -236,9 +236,9 @@ static void ipgre_tunnel_unlink(struct ip_tunnel *t)
|
|||||||
|
|
||||||
static struct ip_tunnel * ipgre_tunnel_locate(struct ip_tunnel_parm *parms, int create)
|
static struct ip_tunnel * ipgre_tunnel_locate(struct ip_tunnel_parm *parms, int create)
|
||||||
{
|
{
|
||||||
u32 remote = parms->iph.daddr;
|
__be32 remote = parms->iph.daddr;
|
||||||
u32 local = parms->iph.saddr;
|
__be32 local = parms->iph.saddr;
|
||||||
u32 key = parms->i_key;
|
__be32 key = parms->i_key;
|
||||||
struct ip_tunnel *t, **tp, *nt;
|
struct ip_tunnel *t, **tp, *nt;
|
||||||
struct net_device *dev;
|
struct net_device *dev;
|
||||||
unsigned h = HASH(key);
|
unsigned h = HASH(key);
|
||||||
@ -319,12 +319,12 @@ static void ipgre_err(struct sk_buff *skb, u32 info)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
struct iphdr *iph = (struct iphdr*)skb->data;
|
struct iphdr *iph = (struct iphdr*)skb->data;
|
||||||
u16 *p = (u16*)(skb->data+(iph->ihl<<2));
|
__be16 *p = (__be16*)(skb->data+(iph->ihl<<2));
|
||||||
int grehlen = (iph->ihl<<2) + 4;
|
int grehlen = (iph->ihl<<2) + 4;
|
||||||
int type = skb->h.icmph->type;
|
int type = skb->h.icmph->type;
|
||||||
int code = skb->h.icmph->code;
|
int code = skb->h.icmph->code;
|
||||||
struct ip_tunnel *t;
|
struct ip_tunnel *t;
|
||||||
u16 flags;
|
__be16 flags;
|
||||||
|
|
||||||
flags = p[0];
|
flags = p[0];
|
||||||
if (flags&(GRE_CSUM|GRE_KEY|GRE_SEQ|GRE_ROUTING|GRE_VERSION)) {
|
if (flags&(GRE_CSUM|GRE_KEY|GRE_SEQ|GRE_ROUTING|GRE_VERSION)) {
|
||||||
@ -370,7 +370,7 @@ static void ipgre_err(struct sk_buff *skb, u32 info)
|
|||||||
}
|
}
|
||||||
|
|
||||||
read_lock(&ipgre_lock);
|
read_lock(&ipgre_lock);
|
||||||
t = ipgre_tunnel_lookup(iph->daddr, iph->saddr, (flags&GRE_KEY) ? *(((u32*)p) + (grehlen>>2) - 1) : 0);
|
t = ipgre_tunnel_lookup(iph->daddr, iph->saddr, (flags&GRE_KEY) ? *(((__be32*)p) + (grehlen>>2) - 1) : 0);
|
||||||
if (t == NULL || t->parms.iph.daddr == 0 || MULTICAST(t->parms.iph.daddr))
|
if (t == NULL || t->parms.iph.daddr == 0 || MULTICAST(t->parms.iph.daddr))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
@ -388,14 +388,14 @@ out:
|
|||||||
#else
|
#else
|
||||||
struct iphdr *iph = (struct iphdr*)dp;
|
struct iphdr *iph = (struct iphdr*)dp;
|
||||||
struct iphdr *eiph;
|
struct iphdr *eiph;
|
||||||
u16 *p = (u16*)(dp+(iph->ihl<<2));
|
__be16 *p = (__be16*)(dp+(iph->ihl<<2));
|
||||||
int type = skb->h.icmph->type;
|
int type = skb->h.icmph->type;
|
||||||
int code = skb->h.icmph->code;
|
int code = skb->h.icmph->code;
|
||||||
int rel_type = 0;
|
int rel_type = 0;
|
||||||
int rel_code = 0;
|
int rel_code = 0;
|
||||||
__be32 rel_info = 0;
|
__be32 rel_info = 0;
|
||||||
__u32 n = 0;
|
__u32 n = 0;
|
||||||
u16 flags;
|
__be16 flags;
|
||||||
int grehlen = (iph->ihl<<2) + 4;
|
int grehlen = (iph->ihl<<2) + 4;
|
||||||
struct sk_buff *skb2;
|
struct sk_buff *skb2;
|
||||||
struct flowi fl;
|
struct flowi fl;
|
||||||
@ -556,9 +556,9 @@ static int ipgre_rcv(struct sk_buff *skb)
|
|||||||
{
|
{
|
||||||
struct iphdr *iph;
|
struct iphdr *iph;
|
||||||
u8 *h;
|
u8 *h;
|
||||||
u16 flags;
|
__be16 flags;
|
||||||
u16 csum = 0;
|
u16 csum = 0;
|
||||||
u32 key = 0;
|
__be32 key = 0;
|
||||||
u32 seqno = 0;
|
u32 seqno = 0;
|
||||||
struct ip_tunnel *tunnel;
|
struct ip_tunnel *tunnel;
|
||||||
int offset = 4;
|
int offset = 4;
|
||||||
@ -568,7 +568,7 @@ static int ipgre_rcv(struct sk_buff *skb)
|
|||||||
|
|
||||||
iph = skb->nh.iph;
|
iph = skb->nh.iph;
|
||||||
h = skb->data;
|
h = skb->data;
|
||||||
flags = *(u16*)h;
|
flags = *(__be16*)h;
|
||||||
|
|
||||||
if (flags&(GRE_CSUM|GRE_KEY|GRE_ROUTING|GRE_SEQ|GRE_VERSION)) {
|
if (flags&(GRE_CSUM|GRE_KEY|GRE_ROUTING|GRE_SEQ|GRE_VERSION)) {
|
||||||
/* - Version must be 0.
|
/* - Version must be 0.
|
||||||
@ -592,11 +592,11 @@ static int ipgre_rcv(struct sk_buff *skb)
|
|||||||
offset += 4;
|
offset += 4;
|
||||||
}
|
}
|
||||||
if (flags&GRE_KEY) {
|
if (flags&GRE_KEY) {
|
||||||
key = *(u32*)(h + offset);
|
key = *(__be32*)(h + offset);
|
||||||
offset += 4;
|
offset += 4;
|
||||||
}
|
}
|
||||||
if (flags&GRE_SEQ) {
|
if (flags&GRE_SEQ) {
|
||||||
seqno = ntohl(*(u32*)(h + offset));
|
seqno = ntohl(*(__be32*)(h + offset));
|
||||||
offset += 4;
|
offset += 4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -605,7 +605,7 @@ static int ipgre_rcv(struct sk_buff *skb)
|
|||||||
if ((tunnel = ipgre_tunnel_lookup(iph->saddr, iph->daddr, key)) != NULL) {
|
if ((tunnel = ipgre_tunnel_lookup(iph->saddr, iph->daddr, key)) != NULL) {
|
||||||
secpath_reset(skb);
|
secpath_reset(skb);
|
||||||
|
|
||||||
skb->protocol = *(u16*)(h + 2);
|
skb->protocol = *(__be16*)(h + 2);
|
||||||
/* WCCP version 1 and 2 protocol decoding.
|
/* WCCP version 1 and 2 protocol decoding.
|
||||||
* - Change protocol to IP
|
* - Change protocol to IP
|
||||||
* - When dealing with WCCPv2, Skip extra 4 bytes in GRE header
|
* - When dealing with WCCPv2, Skip extra 4 bytes in GRE header
|
||||||
@ -673,13 +673,13 @@ static int ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||||||
struct iphdr *old_iph = skb->nh.iph;
|
struct iphdr *old_iph = skb->nh.iph;
|
||||||
struct iphdr *tiph;
|
struct iphdr *tiph;
|
||||||
u8 tos;
|
u8 tos;
|
||||||
u16 df;
|
__be16 df;
|
||||||
struct rtable *rt; /* Route to the other host */
|
struct rtable *rt; /* Route to the other host */
|
||||||
struct net_device *tdev; /* Device to other host */
|
struct net_device *tdev; /* Device to other host */
|
||||||
struct iphdr *iph; /* Our new IP header */
|
struct iphdr *iph; /* Our new IP header */
|
||||||
int max_headroom; /* The extra header space needed */
|
int max_headroom; /* The extra header space needed */
|
||||||
int gre_hlen;
|
int gre_hlen;
|
||||||
u32 dst;
|
__be32 dst;
|
||||||
int mtu;
|
int mtu;
|
||||||
|
|
||||||
if (tunnel->recursion++) {
|
if (tunnel->recursion++) {
|
||||||
@ -860,11 +860,11 @@ static int ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||||||
iph->ttl = dst_metric(&rt->u.dst, RTAX_HOPLIMIT);
|
iph->ttl = dst_metric(&rt->u.dst, RTAX_HOPLIMIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
((u16*)(iph+1))[0] = tunnel->parms.o_flags;
|
((__be16*)(iph+1))[0] = tunnel->parms.o_flags;
|
||||||
((u16*)(iph+1))[1] = skb->protocol;
|
((__be16*)(iph+1))[1] = skb->protocol;
|
||||||
|
|
||||||
if (tunnel->parms.o_flags&(GRE_KEY|GRE_CSUM|GRE_SEQ)) {
|
if (tunnel->parms.o_flags&(GRE_KEY|GRE_CSUM|GRE_SEQ)) {
|
||||||
u32 *ptr = (u32*)(((u8*)iph) + tunnel->hlen - 4);
|
__be32 *ptr = (__be32*)(((u8*)iph) + tunnel->hlen - 4);
|
||||||
|
|
||||||
if (tunnel->parms.o_flags&GRE_SEQ) {
|
if (tunnel->parms.o_flags&GRE_SEQ) {
|
||||||
++tunnel->o_seqno;
|
++tunnel->o_seqno;
|
||||||
@ -877,7 +877,7 @@ static int ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||||||
}
|
}
|
||||||
if (tunnel->parms.o_flags&GRE_CSUM) {
|
if (tunnel->parms.o_flags&GRE_CSUM) {
|
||||||
*ptr = 0;
|
*ptr = 0;
|
||||||
*(__u16*)ptr = ip_compute_csum((void*)(iph+1), skb->len - sizeof(struct iphdr));
|
*(__be16*)ptr = ip_compute_csum((void*)(iph+1), skb->len - sizeof(struct iphdr));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1068,7 +1068,7 @@ static int ipgre_header(struct sk_buff *skb, struct net_device *dev, unsigned sh
|
|||||||
{
|
{
|
||||||
struct ip_tunnel *t = netdev_priv(dev);
|
struct ip_tunnel *t = netdev_priv(dev);
|
||||||
struct iphdr *iph = (struct iphdr *)skb_push(skb, t->hlen);
|
struct iphdr *iph = (struct iphdr *)skb_push(skb, t->hlen);
|
||||||
u16 *p = (u16*)(iph+1);
|
__be16 *p = (__be16*)(iph+1);
|
||||||
|
|
||||||
memcpy(iph, &t->parms.iph, sizeof(struct iphdr));
|
memcpy(iph, &t->parms.iph, sizeof(struct iphdr));
|
||||||
p[0] = t->parms.o_flags;
|
p[0] = t->parms.o_flags;
|
||||||
|
@ -118,7 +118,7 @@
|
|||||||
#include <net/xfrm.h>
|
#include <net/xfrm.h>
|
||||||
|
|
||||||
#define HASH_SIZE 16
|
#define HASH_SIZE 16
|
||||||
#define HASH(addr) ((addr^(addr>>4))&0xF)
|
#define HASH(addr) (((__force u32)addr^((__force u32)addr>>4))&0xF)
|
||||||
|
|
||||||
static int ipip_fb_tunnel_init(struct net_device *dev);
|
static int ipip_fb_tunnel_init(struct net_device *dev);
|
||||||
static int ipip_tunnel_init(struct net_device *dev);
|
static int ipip_tunnel_init(struct net_device *dev);
|
||||||
@ -134,7 +134,7 @@ static struct ip_tunnel **tunnels[4] = { tunnels_wc, tunnels_l, tunnels_r, tunne
|
|||||||
|
|
||||||
static DEFINE_RWLOCK(ipip_lock);
|
static DEFINE_RWLOCK(ipip_lock);
|
||||||
|
|
||||||
static struct ip_tunnel * ipip_tunnel_lookup(u32 remote, u32 local)
|
static struct ip_tunnel * ipip_tunnel_lookup(__be32 remote, __be32 local)
|
||||||
{
|
{
|
||||||
unsigned h0 = HASH(remote);
|
unsigned h0 = HASH(remote);
|
||||||
unsigned h1 = HASH(local);
|
unsigned h1 = HASH(local);
|
||||||
@ -160,8 +160,8 @@ static struct ip_tunnel * ipip_tunnel_lookup(u32 remote, u32 local)
|
|||||||
|
|
||||||
static struct ip_tunnel **ipip_bucket(struct ip_tunnel *t)
|
static struct ip_tunnel **ipip_bucket(struct ip_tunnel *t)
|
||||||
{
|
{
|
||||||
u32 remote = t->parms.iph.daddr;
|
__be32 remote = t->parms.iph.daddr;
|
||||||
u32 local = t->parms.iph.saddr;
|
__be32 local = t->parms.iph.saddr;
|
||||||
unsigned h = 0;
|
unsigned h = 0;
|
||||||
int prio = 0;
|
int prio = 0;
|
||||||
|
|
||||||
@ -203,8 +203,8 @@ static void ipip_tunnel_link(struct ip_tunnel *t)
|
|||||||
|
|
||||||
static struct ip_tunnel * ipip_tunnel_locate(struct ip_tunnel_parm *parms, int create)
|
static struct ip_tunnel * ipip_tunnel_locate(struct ip_tunnel_parm *parms, int create)
|
||||||
{
|
{
|
||||||
u32 remote = parms->iph.daddr;
|
__be32 remote = parms->iph.daddr;
|
||||||
u32 local = parms->iph.saddr;
|
__be32 local = parms->iph.saddr;
|
||||||
struct ip_tunnel *t, **tp, *nt;
|
struct ip_tunnel *t, **tp, *nt;
|
||||||
struct net_device *dev;
|
struct net_device *dev;
|
||||||
unsigned h = 0;
|
unsigned h = 0;
|
||||||
@ -519,13 +519,13 @@ static int ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||||||
struct net_device_stats *stats = &tunnel->stat;
|
struct net_device_stats *stats = &tunnel->stat;
|
||||||
struct iphdr *tiph = &tunnel->parms.iph;
|
struct iphdr *tiph = &tunnel->parms.iph;
|
||||||
u8 tos = tunnel->parms.iph.tos;
|
u8 tos = tunnel->parms.iph.tos;
|
||||||
u16 df = tiph->frag_off;
|
__be16 df = tiph->frag_off;
|
||||||
struct rtable *rt; /* Route to the other host */
|
struct rtable *rt; /* Route to the other host */
|
||||||
struct net_device *tdev; /* Device to other host */
|
struct net_device *tdev; /* Device to other host */
|
||||||
struct iphdr *old_iph = skb->nh.iph;
|
struct iphdr *old_iph = skb->nh.iph;
|
||||||
struct iphdr *iph; /* Our new IP header */
|
struct iphdr *iph; /* Our new IP header */
|
||||||
int max_headroom; /* The extra header space needed */
|
int max_headroom; /* The extra header space needed */
|
||||||
u32 dst = tiph->daddr;
|
__be32 dst = tiph->daddr;
|
||||||
int mtu;
|
int mtu;
|
||||||
|
|
||||||
if (tunnel->recursion++) {
|
if (tunnel->recursion++) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user