mirror of
https://github.com/wader/fq.git
synced 2024-11-28 03:02:55 +03:00
1ddea1ada3
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.
92 lines
3.5 KiB
Go
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
|
|
}
|