aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv6/ip6_output.c
diff options
context:
space:
mode:
authorVlad Yasevich <vyasevic@redhat.com>2012-11-15 03:49:20 -0500
committerDavid S. Miller <davem@davemloft.net>2012-11-15 17:39:23 -0500
commit3c73a0368e995f047c14388a05dcfba599053bef (patch)
tree1c5d8d505ec43c325ebc200ddd124f9c131e6558 /net/ipv6/ip6_output.c
parent2207afc8bfd80d596b524d4feb6b27f5ce359d59 (diff)
ipv6: Update ipv6 static library with newly needed functions
UDP offload needs some additional functions to be in the static kernel for it work correclty. Move those functions into the core. Signed-off-by: Vlad Yasevich <vyasevic@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6/ip6_output.c')
-rw-r--r--net/ipv6/ip6_output.c65
1 files changed, 0 insertions, 65 deletions
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
index 3deaa4e2e8e2..5552d13ae92f 100644
--- a/net/ipv6/ip6_output.c
+++ b/net/ipv6/ip6_output.c
@@ -544,71 +544,6 @@ static void ip6_copy_metadata(struct sk_buff *to, struct sk_buff *from)
544 skb_copy_secmark(to, from); 544 skb_copy_secmark(to, from);
545} 545}
546 546
547int ip6_find_1stfragopt(struct sk_buff *skb, u8 **nexthdr)
548{
549 u16 offset = sizeof(struct ipv6hdr);
550 struct ipv6_opt_hdr *exthdr =
551 (struct ipv6_opt_hdr *)(ipv6_hdr(skb) + 1);
552 unsigned int packet_len = skb->tail - skb->network_header;
553 int found_rhdr = 0;
554 *nexthdr = &ipv6_hdr(skb)->nexthdr;
555
556 while (offset + 1 <= packet_len) {
557
558 switch (**nexthdr) {
559
560 case NEXTHDR_HOP:
561 break;
562 case NEXTHDR_ROUTING:
563 found_rhdr = 1;
564 break;
565 case NEXTHDR_DEST:
566#if IS_ENABLED(CONFIG_IPV6_MIP6)
567 if (ipv6_find_tlv(skb, offset, IPV6_TLV_HAO) >= 0)
568 break;
569#endif
570 if (found_rhdr)
571 return offset;
572 break;
573 default :
574 return offset;
575 }
576
577 offset += ipv6_optlen(exthdr);
578 *nexthdr = &exthdr->nexthdr;
579 exthdr = (struct ipv6_opt_hdr *)(skb_network_header(skb) +
580 offset);
581 }
582
583 return offset;
584}
585
586void ipv6_select_ident(struct frag_hdr *fhdr, struct rt6_info *rt)
587{
588 static atomic_t ipv6_fragmentation_id;
589 int old, new;
590
591 if (rt && !(rt->dst.flags & DST_NOPEER)) {
592 struct inet_peer *peer;
593 struct net *net;
594
595 net = dev_net(rt->dst.dev);
596 peer = inet_getpeer_v6(net->ipv6.peers, &rt->rt6i_dst.addr, 1);
597 if (peer) {
598 fhdr->identification = htonl(inet_getid(peer, 0));
599 inet_putpeer(peer);
600 return;
601 }
602 }
603 do {
604 old = atomic_read(&ipv6_fragmentation_id);
605 new = old + 1;
606 if (!new)
607 new = 1;
608 } while (atomic_cmpxchg(&ipv6_fragmentation_id, old, new) != old);
609 fhdr->identification = htonl(new);
610}
611
612int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) 547int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *))
613{ 548{
614 struct sk_buff *frag; 549 struct sk_buff *frag;