Blame view
net/ipv6/xfrm6_mode_ro.c
2.29 KB
1d71627d6 [XFRM] STATE: Int... |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
/* * xfrm6_mode_ro.c - Route optimization mode for IPv6. * * Copyright (C)2003-2006 Helsinki University of Technology * Copyright (C)2003-2006 USAGI/WIDE Project * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * Authors: * Noriaki TAKAMIYA @USAGI * Masahide NAKAMURA @USAGI */ #include <linux/init.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/skbuff.h> |
a2deb6d26 [IPSEC]: Move x->... |
31 |
#include <linux/spinlock.h> |
1d71627d6 [XFRM] STATE: Int... |
32 |
#include <linux/stringify.h> |
45b17f48e [IPSEC]: Move RO-... |
33 |
#include <linux/time.h> |
1d71627d6 [XFRM] STATE: Int... |
34 35 36 37 38 39 40 |
#include <net/ipv6.h> #include <net/xfrm.h> /* Add route optimization header space. * * The IP header and mutable extension headers will be moved forward to make * space for the route optimization header. |
1d71627d6 [XFRM] STATE: Int... |
41 |
*/ |
eb878e845 [IPSEC]: output m... |
42 |
static int xfrm6_ro_output(struct xfrm_state *x, struct sk_buff *skb) |
1d71627d6 [XFRM] STATE: Int... |
43 |
{ |
1d71627d6 [XFRM] STATE: Int... |
44 45 46 |
struct ipv6hdr *iph; u8 *prevhdr; int hdr_len; |
0660e03f6 [SK_BUFF]: Introd... |
47 |
iph = ipv6_hdr(skb); |
1d71627d6 [XFRM] STATE: Int... |
48 49 |
hdr_len = x->type->hdr_offset(x, skb, &prevhdr); |
007f0211a [IPSEC]: Store IP... |
50 |
skb_set_mac_header(skb, (prevhdr - x->props.header_len) - skb->data); |
7b277b1a5 [IPSEC]: Set skb-... |
51 |
skb_set_network_header(skb, -x->props.header_len); |
37fedd3aa [IPSEC]: Use IPv6... |
52 |
skb->transport_header = skb->network_header + hdr_len; |
7b277b1a5 [IPSEC]: Set skb-... |
53 54 |
__skb_pull(skb, hdr_len); memmove(ipv6_hdr(skb), iph, hdr_len); |
45b17f48e [IPSEC]: Move RO-... |
55 56 |
x->lastused = get_seconds(); |
1d71627d6 [XFRM] STATE: Int... |
57 58 |
return 0; } |
1d71627d6 [XFRM] STATE: Int... |
59 |
static struct xfrm_mode xfrm6_ro_mode = { |
1d71627d6 [XFRM] STATE: Int... |
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
.output = xfrm6_ro_output, .owner = THIS_MODULE, .encap = XFRM_MODE_ROUTEOPTIMIZATION, }; static int __init xfrm6_ro_init(void) { return xfrm_register_mode(&xfrm6_ro_mode, AF_INET6); } static void __exit xfrm6_ro_exit(void) { int err; err = xfrm_unregister_mode(&xfrm6_ro_mode, AF_INET6); BUG_ON(err); } module_init(xfrm6_ro_init); module_exit(xfrm6_ro_exit); MODULE_LICENSE("GPL"); MODULE_ALIAS_XFRM_MODE(AF_INET6, XFRM_MODE_ROUTEOPTIMIZATION); |