Documentation
¶
Overview ¶
Package ip6defrag implements a IPv6 defragmenter
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type IPv6Defragmenter ¶
type IPv6Defragmenter struct {
// contains filtered or unexported fields
}
IPv6Defragmenter is a struct which embedded a map of all fragment/packet.
func NewIPv6Defragmenter ¶
func NewIPv6Defragmenter() *IPv6Defragmenter
NewIPv6Defragmenter returns a new IPv6Defragmenter with an initialized map.
func (*IPv6Defragmenter) DefragIPv6 ¶
func (d *IPv6Defragmenter) DefragIPv6(ipv6 *layers.IPv6, fg *layers.IPv6Fragment) *layers.IPv6
DefragIPv6 takes in an IPv6 packet with a fragment payload.
It do not modify the IPv6 layer fragment in place, It returns a ready-to be used IPv6 layer.
If and we don't have all fragments, it will return nil and store whatever internal information it needs to eventually defrag the packet.
If the IPv6 fragment is the last fragment needed to reconstruct the packet, a new IPv6 layer will be returned, and will be set to the entire defragmented packet,
It use a map of all the running flows ¶
Usage example:
var d = NewIPv6Defragmenter()
func HandlePacket(p gopacket.Packet) {
ipv6, ok := p.NetworkLayer().(*layers.IPv6)
if !ok {
// ignore: not ipv6
return
}
if fg, ok := p.Layer(layers.LayerTypeIPv6Fragment).(*layers.IPv6Fragment); ok {
if fg.NextHeader != layers.IPProtocolUDP && fg.NextHeader != layers.IPProtocolTCP {
// ignore: !TCP and !UDP fragment
return
}
ipv6 = d.DefragIPv6(ipv6, fg)
if ipv6 == nil {
// ignore: do nothing, wait next fragment
return
}
}
// You got the ipv6 layer
}
func (*IPv6Defragmenter) DiscardOlderThan ¶
func (d *IPv6Defragmenter) DiscardOlderThan(t time.Time) int
DiscardOlderThan forgets all packets without any activity since time t. It returns the number of FragmentList aka number of fragment packets it has discarded.