1
1
mirror of https://github.com/wader/fq.git synced 2024-12-24 22:05:31 +03:00
fq/format/inet/icmpv6.go
Mattias Wadman 1ddea1ada3 interp,format: Refactor registry usage and use function helpers
Move registry to interp and add support for functions and filesystems.
This will be used later for allow formats to add own functions and fq code.

Add gojqextra function helpers to have more comfortable API to add functions.
Takes care of argument type casting and JQValue:s and some more things.

Refactor interp package to use new function helper and registry. Probably
fixes a bunch of JQValue bugs and other type errors.

Refactor out some mpeg nal things to mpeg format.

Refactor interp jq code into display.q and init.jq.

Remove undocumented aes_ctr funciton, was a test. Hopefully will add more crypto things laster.
2022-07-16 19:24:13 +02:00

92 lines
3.5 KiB
Go

package inet
import (
"github.com/wader/fq/format"
"github.com/wader/fq/pkg/decode"
"github.com/wader/fq/pkg/interp"
"github.com/wader/fq/pkg/scalar"
)
func init() {
interp.RegisterFormat(decode.Format{
Name: format.ICMPV6,
Description: "Internet Control Message Protocol v6",
Groups: []string{format.IP_PACKET},
DecodeFn: decodeICMPv6,
})
}
// based on https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol_for_IPv6
var icmpv6TypeMap = scalar.UToScalar{
1: {Sym: "unreachable", Description: "Destination unreachable"},
2: {Sym: "too_big", Description: "Packet too big"},
3: {Sym: "time_exceeded", Description: "Time exceeded"},
4: {Sym: "parameter_problem", Description: "Parameter problem"},
100: {Description: "Private experimentation"},
101: {Description: "Private experimentation"},
127: {Description: "Reserved for expansion of ICMPv6 error messages"},
128: {Sym: "echo_reply", Description: "Echo Request"},
129: {Sym: "echo_request", Description: "Echo Reply"},
130: {Description: "Multicast Listener Query (MLD)"},
131: {Description: "Multicast Listener Report (MLD)"},
132: {Description: "Multicast Listener Done (MLD)"},
133: {Description: "Router Solicitation (NDP)"},
134: {Description: "Router Advertisement (NDP)"},
135: {Description: "Neighbor Solicitation (NDP)"},
136: {Description: "Neighbor Advertisement (NDP)"},
137: {Description: "Redirect Message (NDP)"},
138: {Description: "Router Renumbering Router Renumbering Command"},
139: {Description: "ICMP Node Information Query"},
140: {Description: "ICMP Node Information Response"},
141: {Description: "Inverse Neighbor Discovery Solicitation Message"},
142: {Description: "Inverse Neighbor Discovery Advertisement Message"},
143: {Description: "Multicast Listener Discovery (MLDv2) reports (RFC 3810)"},
144: {Description: "Home Agent Address Discovery Request Message"},
145: {Description: "Home Agent Address Discovery Reply Message"},
146: {Description: "Mobile Prefix Solicitation"},
147: {Description: "Mobile Prefix Advertisement"},
148: {Description: "Certification Path Solicitation (SEND)"},
149: {Description: "Certification Path Advertisement (SEND)"},
151: {Description: "Multicast Router Advertisement (MRD)"},
152: {Description: "Multicast Router Solicitation (MRD)"},
153: {Description: "Multicast Router Termination (MRD)"},
155: {Description: "RPL Control Message"},
200: {Description: "Private experimentation"},
201: {Description: "Private experimentation"},
255: {Description: "Reserved for expansion of ICMPv6 informational messages"},
}
var icmpv6CodeMapMap = map[uint64]scalar.UToDescription{
1: {
1: "Communication with destination administratively prohibited",
2: "Beyond scope of source address",
3: "Address unreachable",
4: "Port unreachable",
5: "Source address failed ingress/egress policy",
6: "Reject route to destination",
7: "Error in Source Routing Header",
},
3: {
0: "Hop limit exceeded in transit",
1: "Fragment reassembly time exceeded",
},
4: {
0: "Erroneous header field encountered",
1: "Unrecognized Next Header type encountered",
2: "Unrecognized IPv6 option encountered",
},
}
func decodeICMPv6(d *decode.D, in any) any {
if ipi, ok := in.(format.IPPacketIn); ok && ipi.Protocol != format.IPv4ProtocolICMPv6 {
d.Fatalf("incorrect protocol %d", ipi.Protocol)
}
typ := d.FieldU8("type", icmpv6TypeMap)
d.FieldU8("code", icmpv6CodeMapMap[typ])
d.FieldU16("checksum")
d.FieldRawLen("content", d.BitsLeft())
return nil
}