diff options
Diffstat (limited to 'net/ipv6/exthdrs.c')
-rw-r--r-- | net/ipv6/exthdrs.c | 40 |
1 files changed, 4 insertions, 36 deletions
diff --git a/net/ipv6/exthdrs.c b/net/ipv6/exthdrs.c index de6559e3aa0a..70fbf6bc5a87 100644 --- a/net/ipv6/exthdrs.c +++ b/net/ipv6/exthdrs.c | |||
@@ -48,6 +48,7 @@ | |||
48 | #endif | 48 | #endif |
49 | 49 | ||
50 | #include <asm/uaccess.h> | 50 | #include <asm/uaccess.h> |
51 | #include "ip6_offload.h" | ||
51 | 52 | ||
52 | int ipv6_find_tlv(struct sk_buff *skb, int offset, int type) | 53 | int ipv6_find_tlv(struct sk_buff *skb, int offset, int type) |
53 | { | 54 | { |
@@ -528,20 +529,12 @@ unknown_rh: | |||
528 | 529 | ||
529 | static const struct inet6_protocol rthdr_protocol = { | 530 | static const struct inet6_protocol rthdr_protocol = { |
530 | .handler = ipv6_rthdr_rcv, | 531 | .handler = ipv6_rthdr_rcv, |
531 | .flags = INET6_PROTO_NOPOLICY | INET6_PROTO_GSO_EXTHDR, | 532 | .flags = INET6_PROTO_NOPOLICY, |
532 | }; | ||
533 | |||
534 | static const struct net_offload rthdr_offload = { | ||
535 | .flags = INET6_PROTO_GSO_EXTHDR, | ||
536 | }; | 533 | }; |
537 | 534 | ||
538 | static const struct inet6_protocol destopt_protocol = { | 535 | static const struct inet6_protocol destopt_protocol = { |
539 | .handler = ipv6_destopt_rcv, | 536 | .handler = ipv6_destopt_rcv, |
540 | .flags = INET6_PROTO_NOPOLICY | INET6_PROTO_GSO_EXTHDR, | 537 | .flags = INET6_PROTO_NOPOLICY, |
541 | }; | ||
542 | |||
543 | static const struct net_offload dstopt_offload = { | ||
544 | .flags = INET6_PROTO_GSO_EXTHDR, | ||
545 | }; | 538 | }; |
546 | 539 | ||
547 | static const struct inet6_protocol nodata_protocol = { | 540 | static const struct inet6_protocol nodata_protocol = { |
@@ -549,32 +542,6 @@ static const struct inet6_protocol nodata_protocol = { | |||
549 | .flags = INET6_PROTO_NOPOLICY, | 542 | .flags = INET6_PROTO_NOPOLICY, |
550 | }; | 543 | }; |
551 | 544 | ||
552 | static int ipv6_exthdrs_offload_init(void) | ||
553 | { | ||
554 | int ret; | ||
555 | |||
556 | ret = inet6_add_offload(&rthdr_offload, IPPROTO_ROUTING); | ||
557 | if (!ret) | ||
558 | goto out; | ||
559 | |||
560 | ret = inet6_add_offload(&dstopt_offload, IPPROTO_DSTOPTS); | ||
561 | if (!ret) | ||
562 | goto out_rt; | ||
563 | |||
564 | out: | ||
565 | return ret; | ||
566 | |||
567 | out_rt: | ||
568 | inet_del_offload(&rthdr_offload, IPPROTO_ROUTING); | ||
569 | goto out; | ||
570 | } | ||
571 | |||
572 | static void ipv6_exthdrs_offload_exit(void) | ||
573 | { | ||
574 | inet_del_offload(&rthdr_offload, IPPROTO_ROUTING); | ||
575 | inet_del_offload(&rthdr_offload, IPPROTO_DSTOPTS); | ||
576 | } | ||
577 | |||
578 | int __init ipv6_exthdrs_init(void) | 545 | int __init ipv6_exthdrs_init(void) |
579 | { | 546 | { |
580 | int ret; | 547 | int ret; |
@@ -608,6 +575,7 @@ out_offload: | |||
608 | 575 | ||
609 | void ipv6_exthdrs_exit(void) | 576 | void ipv6_exthdrs_exit(void) |
610 | { | 577 | { |
578 | ipv6_exthdrs_offload_exit(); | ||
611 | inet6_del_protocol(&nodata_protocol, IPPROTO_NONE); | 579 | inet6_del_protocol(&nodata_protocol, IPPROTO_NONE); |
612 | inet6_del_protocol(&destopt_protocol, IPPROTO_DSTOPTS); | 580 | inet6_del_protocol(&destopt_protocol, IPPROTO_DSTOPTS); |
613 | inet6_del_protocol(&rthdr_protocol, IPPROTO_ROUTING); | 581 | inet6_del_protocol(&rthdr_protocol, IPPROTO_ROUTING); |