Skip to content

Commit

Permalink
[IPV6]: Find option offset by type.
Browse files Browse the repository at this point in the history
This is a helper to search option offset from extension header which
can carry TLV option like destination options header.

Mobile IPv6 home address option will use it.

Based on MIPL2 kernel patch.

Signed-off-by: Masahide NAKAMURA <[email protected]>
Signed-off-by: YOSHIFUJI Hideaki <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
Masahide NAKAMURA authored and David S. Miller committed Sep 22, 2006
1 parent 280a9d3 commit c61a404
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 0 deletions.
2 changes: 2 additions & 0 deletions include/net/ipv6.h
Original file line number Diff line number Diff line change
Expand Up @@ -506,6 +506,8 @@ extern int ipv6_skip_exthdr(const struct sk_buff *, int start,

extern int ipv6_ext_hdr(u8 nexthdr);

extern int ipv6_find_tlv(struct sk_buff *skb, int offset, int type);

extern struct ipv6_txoptions * ipv6_invert_rthdr(struct sock *sk,
struct ipv6_rt_hdr *hdr);

Expand Down
43 changes: 43 additions & 0 deletions net/ipv6/exthdrs.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,49 @@

#include <asm/uaccess.h>

int ipv6_find_tlv(struct sk_buff *skb, int offset, int type)
{
int packet_len = skb->tail - skb->nh.raw;
struct ipv6_opt_hdr *hdr;
int len;

if (offset + 2 > packet_len)
goto bad;
hdr = (struct ipv6_opt_hdr*)(skb->nh.raw + offset);
len = ((hdr->hdrlen + 1) << 3);

if (offset + len > packet_len)
goto bad;

offset += 2;
len -= 2;

while (len > 0) {
int opttype = skb->nh.raw[offset];
int optlen;

if (opttype == type)
return offset;

switch (opttype) {
case IPV6_TLV_PAD0:
optlen = 1;
break;
default:
optlen = skb->nh.raw[offset + 1] + 2;
if (optlen > len)
goto bad;
break;
}
offset += optlen;
len -= optlen;
}
/* not_found */
return -1;
bad:
return -1;
}

/*
* Parsing tlv encoded headers.
*
Expand Down

0 comments on commit c61a404

Please sign in to comment.