diff --git a/hack/packetgen/templates/length.tmpl b/hack/packetgen/templates/length.tmpl
new file mode 100644
index 0000000000000000000000000000000000000000..28dfc0a814c4ffc84d3e9dae91609bf61c94207f
--- /dev/null
+++ b/hack/packetgen/templates/length.tmpl
@@ -0,0 +1,35 @@
+{{$name := index . 0 -}}
+{{$pointer := index . 1 -}}
+{{$value := index . 2 -}}
+
+{{if some $value.Map -}}
+    {{$ifaceName := printf "%s%s" $name $value.Map.Name -}}
+
+    {{$prefixPointer := printf "%s.%s()" $pointer $ifaceName -}}
+
+    {{template "length" (list $name $prefixPointer $value.Map.Prefix)}}
+
+	length += {{$pointer}}.Length()
+{{else if some $value.Remaining -}}
+
+{{else if some $value.Basic -}}
+
+{{else if some $value.Array -}}
+
+{{else if some $value.Struct -}}
+    {{$structName := printf "%s%s" $name $value.Struct.Name -}}
+
+    {{range $field := $value.Struct.Fields -}}
+        {{$fieldPointer := printf "%s.%s" $pointer $field.Name -}}
+
+        {{template "length" (list $structName $fieldPointer $field)}}
+    {{end -}}
+{{else if some $value.LengthPrefixedSlice -}}
+
+{{else if some $value.NullableLengthPrefixedSlice -}}
+
+{{else if some $value.ZeroByteTerminatedSlice -}}
+
+{{else if some $value.ZeroTerminatedSlice -}}
+
+{{end -}}
diff --git a/hack/packetgen/templates/packets.tmpl b/hack/packetgen/templates/packets.tmpl
index 78311a7ccf56e1c37620593921efc75d8f863a9a..3d7a962dbb68a0e0bd9699688231185f54a81737 100644
--- a/hack/packetgen/templates/packets.tmpl
+++ b/hack/packetgen/templates/packets.tmpl
@@ -24,6 +24,12 @@ const (
 
 	type {{$name}} {{template "type" (list $name $packet)}}
 
+	func (T *{{$name}}) Length() (length int) {
+		{{template "length" (list $name "(*T)" $packet)}}
+
+		return
+	}
+
 	func (T *{{$name}}) ReadFrom(decoder *fed.Decoder) (err error) {
 		{{if some $packet.Type -}}
 			if decoder.Type() != {{$name}}Type {
diff --git a/hack/packetgen/templates/preType.tmpl b/hack/packetgen/templates/preType.tmpl
index 2f63581966b62af91b41c9863f6442f7d99e772f..8d50f4c6fa325aaaa2c02ce80fcbe5306ab872d2 100644
--- a/hack/packetgen/templates/preType.tmpl
+++ b/hack/packetgen/templates/preType.tmpl
@@ -15,6 +15,12 @@
 			return {{$item.Type}}
 		}
 
+		func (T *{{$itemName}}) Length() (length int) {
+			{{template "length" (list $name "(*T)" $item)}}
+
+			return
+		}
+
 		func (T *{{$itemName}}) ReadFrom(decoder *fed.Decoder) (err error) {
 			{{template "decode" (list $itemName "(*T)" $item)}}
 
@@ -32,6 +38,7 @@
 	type {{$ifaceName}} interface{
 		{{$ifaceName}}() {{template "type" (list $name $value.Map.Prefix)}}
 
+		Length() int
 		ReadFrom(decoder *fed.Decoder) error
 		WriteTo(encoder *fed.Encoder) error
 	}