/* * netsniff-ng - the packet sniffing beast * Copyright 2012 Markus Amend , Deutsche Flugsicherung GmbH * Subject to the GPL, version 2. * * IPv6 Destination Options Header described in RFC2460 */ #include #include #include /* for ntohs() */ #include "proto.h" #include "protos.h" #include "dissector_eth.h" #include "built_in.h" #include "pkt_buff.h" struct dest_optshdr { uint8_t h_next_header; uint8_t hdr_len; } __packed; static void dissect_opt_dest(struct pkt_buff *pkt, ssize_t *opt_len) { /* Have to been upgraded. * http://tools.ietf.org/html/rfc2460#section-4.2 * Look also for proto_ipv6_hop_by_hop.h, it needs * dissect_opt(), too. */ if (*opt_len) tprintf(", Option(s) recognized "); /* If adding dissector reduce opt_len for each using of pkt_pull * to the same size. */ } static void dest_opts(struct pkt_buff *pkt) { uint16_t hdr_ext_len; ssize_t opt_len; struct dest_optshdr *dest_ops; dest_ops = (struct dest_optshdr *) pkt_pull(pkt, sizeof(*dest_ops)); if (dest_ops == NULL) return; /* Total Header Length in Bytes */ hdr_ext_len = (dest_ops->hdr_len + 1) * 8; /* Options length in Bytes */ opt_len = hdr_ext_len - sizeof(*dest_ops); tprintf("\t [ Destination Options "); tprintf("NextHdr (%u), ", dest_ops->h_next_header); if (opt_len > pkt_len(pkt) || opt_len < 0) { tprintf("HdrExtLen (%u, %u Bytes, %s)", dest_ops->hdr_len, hdr_ext_len, colorize_start_full(black, red) "invalid" colorize_end()); return; } tprintf("HdrExtLen (%u, %u Bytes)", dest_ops->hdr_len, hdr_ext_len); dissect_opt_dest(pkt, &opt_len); tprintf(" ]\n"); pkt_pull(pkt, opt_len); pkt_set_proto(pkt, ð_lay3, dest_ops->h_next_header); } static void dest_opts_less(struct pkt_buff *pkt) { uint16_t hdr_ext_len; ssize_t opt_len; struct dest_optshdr *dest_ops; dest_ops = (struct dest_optshdr *) pkt_pull(pkt, sizeof(*dest_ops)); if (dest_ops == NULL) return; /* Total Header Length in Bytes */ hdr_ext_len = (dest_ops->hdr_len + 1) * 8; /* Options length in Bytes */ opt_len = hdr_ext_len - sizeof(*dest_ops); if (opt_len > pkt_len(pkt) || opt_len < 0) return; tprintf(" Dest Ops"); pkt_pull(pkt, opt_len); pkt_set_proto(pkt, ð_lay3, dest_ops->h_next_header); } struct protocol ipv6_dest_opts_ops = { .key = 0x3C, .print_full = dest_opts, .print_less = dest_opts_less, }; /table>
path: root/net
AgeCommit message (Expand)AuthorFilesLines
2017-02-03tcp: clear pfmemalloc on outgoing skbEric Dumazet1-0/+7
2017-02-03net: ipv6: Set protocol to kernel for local routesDavid Ahern1-0/+1
2017-02-03bridge: vlan dst_metadata hooks in ingress and egress pathsRoopa Prabhu6-2/+82
2017-02-03bridge: per vlan dst_metadata netlink supportRoopa Prabhu7-48/+641
2017-02-03net/sched: act_ife: Change to use ife moduleYotam Gigi2-78/+33
2017-02-03net: Introduce ife encapsulation moduleYotam Gigi5-0/+165
2017-02-03net/sched: act_ife: Unexport ife_tlv_meta_encodeYotam Gigi1-2/+2
2017-02-03tcp: add tcp_mss_clamp() helperEric Dumazet4-23/+8
2017-02-02net: add LINUX_MIB_PFMEMALLOCDROP counterEric Dumazet2-2/+4
2017-02-02net: ipv4: remove fib_lookup.h from devinet.c include listDavid Ahern1-2/+0
2017-02-02net: remove useless pfmemalloc settingEric Dumazet1-1/+0
2017-02-02unix: add ioctl to open a unix socket file with O_PATHAndrey Vagin1-0/+41
2017-02-02Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/netDavid S. Miller12-104/+93
2017-02-01Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/netLinus Torvalds10-103/+86
2017-02-01net/sched: act_psample: Remove unnecessary ASSERT_RTNLYotam Gigi1-1/+0
2017-02-01net/sched: act_sample: Fix error path in initYotam Gigi1-1/+4
2017-02-01tcp: fix 0 divide in __tcp_select_window()Eric Dumazet1-2/+4
2017-02-01ipv6: pointer math error in ip6_tnl_parse_tlv_enc_lim()Dan Carpenter1-1/+1
2017-02-01net: ipv6: add NLM_F_APPEND in notifications when applicableDavid Ahern1-0/+3
2017-02-01net: reduce skb_warn_bad_offload() noiseEric Dumazet1-3/+9
2017-02-01net/sched: matchall: Fix configuration raceYotam Gigi1-82/+45
2017-02-01rtnetlink: Handle IFLA_MASTER parameter when processing rtnl_newlinkTheuns Verwoerd1-1/+6