diff --git a/fuzzing/packet/.gitignore b/fuzzing/packet/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..caa15264d86c49b6614d36db1444140617445726
--- /dev/null
+++ b/fuzzing/packet/.gitignore
@@ -0,0 +1,3 @@
+packet-fuzz.zip
+crashers
+suppressions
diff --git a/fuzzing/packet/Makefile b/fuzzing/packet/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..c4b419aee951dc61b5d91037828ac177735b2234
--- /dev/null
+++ b/fuzzing/packet/Makefile
@@ -0,0 +1,16 @@
+
+$(GOPATH)/bin/go-fuzz-build:
+	go get -u github.com/dvyukov/go-fuzz/...
+
+$(GOPATH)/bin/go-fuzz:
+	go get -u github.com/dvyukov/go-fuzz/...
+
+packet-fuzz.zip: $(GOPATH)/bin/go-fuzz-build
+	$(GOPATH)/bin/go-fuzz-build github.com/bio-routing/bio-rd/protocols/bgp/packet
+
+corpus:
+	mkdir -p corpus
+	go run gen_initial_corpus.go
+
+fuzz: packet-fuzz.zip corpus $(GOPATH)/bin/go-fuzz
+	$(GOPATH)/bin/go-fuzz -bin=./packet-fuzz.zip -workdir=.
diff --git a/fuzzing/packet/README.md b/fuzzing/packet/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..b7f396f1a377c3bf8437fe26dc04cb3e1216572f
--- /dev/null
+++ b/fuzzing/packet/README.md
@@ -0,0 +1,8 @@
+# Fuzzing
+
+To start a new fuzzing run, execute:
+```bash
+make fuzz
+```
+This will create an initial corpus if there is no corpus, download the fuzzing tool and build all required 
+assets.
\ No newline at end of file
diff --git a/fuzzing/packet/corpus/0.bytes b/fuzzing/packet/corpus/0.bytes
new file mode 100644
index 0000000000000000000000000000000000000000..78ebde2e66d5283d5601ba30a9cd3ebb3f054081
Binary files /dev/null and b/fuzzing/packet/corpus/0.bytes differ
diff --git a/fuzzing/packet/corpus/0157cd8525a62f2930fa2231f77a6e82daf84144-4 b/fuzzing/packet/corpus/0157cd8525a62f2930fa2231f77a6e82daf84144-4
new file mode 100644
index 0000000000000000000000000000000000000000..fcc54e44eb93269d878fe4d0993a6d42a48cf9e4
Binary files /dev/null and b/fuzzing/packet/corpus/0157cd8525a62f2930fa2231f77a6e82daf84144-4 differ
diff --git a/fuzzing/packet/corpus/015c42a3fb61be0244e05a16922602dbf2fe05f0-5 b/fuzzing/packet/corpus/015c42a3fb61be0244e05a16922602dbf2fe05f0-5
new file mode 100644
index 0000000000000000000000000000000000000000..78a6f3afd603cc0c1d2ca59b1ad65718925099f5
Binary files /dev/null and b/fuzzing/packet/corpus/015c42a3fb61be0244e05a16922602dbf2fe05f0-5 differ
diff --git a/fuzzing/packet/corpus/060a1ddeabb5354f79c43182a6d0f9252ddb7db8-1 b/fuzzing/packet/corpus/060a1ddeabb5354f79c43182a6d0f9252ddb7db8-1
new file mode 100644
index 0000000000000000000000000000000000000000..08dc6dddb954f97714f7dc009aed3130e5efd9c7
Binary files /dev/null and b/fuzzing/packet/corpus/060a1ddeabb5354f79c43182a6d0f9252ddb7db8-1 differ
diff --git a/fuzzing/packet/corpus/0a8e36b04544c744cf7915e2d85bf93c1dae13d0-4 b/fuzzing/packet/corpus/0a8e36b04544c744cf7915e2d85bf93c1dae13d0-4
new file mode 100644
index 0000000000000000000000000000000000000000..9694ef60b9f7abbade8a07127e047742cfcb7364
Binary files /dev/null and b/fuzzing/packet/corpus/0a8e36b04544c744cf7915e2d85bf93c1dae13d0-4 differ
diff --git a/fuzzing/packet/corpus/0ace70936b8b67cfeeed133ff8f281b00d502e1b-1 b/fuzzing/packet/corpus/0ace70936b8b67cfeeed133ff8f281b00d502e1b-1
new file mode 100644
index 0000000000000000000000000000000000000000..fca5e54c0c0b31138223cac205cc5d2eec19dab6
Binary files /dev/null and b/fuzzing/packet/corpus/0ace70936b8b67cfeeed133ff8f281b00d502e1b-1 differ
diff --git a/fuzzing/packet/corpus/0ba3ebb1b2a1029e09c1cb83bc1b09762f231cd8-1 b/fuzzing/packet/corpus/0ba3ebb1b2a1029e09c1cb83bc1b09762f231cd8-1
new file mode 100644
index 0000000000000000000000000000000000000000..4ebdac5e15dc9c6190df6e8730e626b6d389fecf
Binary files /dev/null and b/fuzzing/packet/corpus/0ba3ebb1b2a1029e09c1cb83bc1b09762f231cd8-1 differ
diff --git a/fuzzing/packet/corpus/0df74acbb6cdec38f5849c0e49f4cacdf1dac629-5 b/fuzzing/packet/corpus/0df74acbb6cdec38f5849c0e49f4cacdf1dac629-5
new file mode 100644
index 0000000000000000000000000000000000000000..1e1eda6a2120468d20537d993740fb29b567237e
Binary files /dev/null and b/fuzzing/packet/corpus/0df74acbb6cdec38f5849c0e49f4cacdf1dac629-5 differ
diff --git a/fuzzing/packet/corpus/1.bytes b/fuzzing/packet/corpus/1.bytes
new file mode 100644
index 0000000000000000000000000000000000000000..04273bea1f62cdd2a9296e73e70d9b6623b5172c
Binary files /dev/null and b/fuzzing/packet/corpus/1.bytes differ
diff --git a/fuzzing/packet/corpus/11f3430fd4d0e65e44a6e401bd08e312512c7940-10 b/fuzzing/packet/corpus/11f3430fd4d0e65e44a6e401bd08e312512c7940-10
new file mode 100644
index 0000000000000000000000000000000000000000..6360ddac79ce4d1eaa8c50b3b6f81bd7e04076f9
Binary files /dev/null and b/fuzzing/packet/corpus/11f3430fd4d0e65e44a6e401bd08e312512c7940-10 differ
diff --git a/fuzzing/packet/corpus/17e6634985d31dbeaf2043b77a1e69ba45a02fa3-9 b/fuzzing/packet/corpus/17e6634985d31dbeaf2043b77a1e69ba45a02fa3-9
new file mode 100644
index 0000000000000000000000000000000000000000..2a5dacba3c5838bc8c24e218a6ba509a546dc580
Binary files /dev/null and b/fuzzing/packet/corpus/17e6634985d31dbeaf2043b77a1e69ba45a02fa3-9 differ
diff --git a/fuzzing/packet/corpus/1aae43a31211124ffd7c24147cd0112e788d5aae-11 b/fuzzing/packet/corpus/1aae43a31211124ffd7c24147cd0112e788d5aae-11
new file mode 100644
index 0000000000000000000000000000000000000000..3cbff3cb4764b6c040c9e393355da55b2ea90da6
Binary files /dev/null and b/fuzzing/packet/corpus/1aae43a31211124ffd7c24147cd0112e788d5aae-11 differ
diff --git a/fuzzing/packet/corpus/1b0227c44ad735c7e2c9467cd3ad72ae73b41a8d b/fuzzing/packet/corpus/1b0227c44ad735c7e2c9467cd3ad72ae73b41a8d
new file mode 100644
index 0000000000000000000000000000000000000000..cd42ccf2e75eac44cdddaf0f89b19c4875a84cd9
Binary files /dev/null and b/fuzzing/packet/corpus/1b0227c44ad735c7e2c9467cd3ad72ae73b41a8d differ
diff --git a/fuzzing/packet/corpus/2.bytes b/fuzzing/packet/corpus/2.bytes
new file mode 100644
index 0000000000000000000000000000000000000000..1e1a88bf442e0b13f058e7acf0460c1b703b9073
Binary files /dev/null and b/fuzzing/packet/corpus/2.bytes differ
diff --git a/fuzzing/packet/corpus/246d9b10f27ea92b3318a513ea1223c1dff40be3-7 b/fuzzing/packet/corpus/246d9b10f27ea92b3318a513ea1223c1dff40be3-7
new file mode 100644
index 0000000000000000000000000000000000000000..3fdac995b8aad35e3e2d027813fbadec3ee9c6f7
Binary files /dev/null and b/fuzzing/packet/corpus/246d9b10f27ea92b3318a513ea1223c1dff40be3-7 differ
diff --git a/fuzzing/packet/corpus/257d2fe4f97aa4541ded8b1a41d6a65ef53d06f1-11 b/fuzzing/packet/corpus/257d2fe4f97aa4541ded8b1a41d6a65ef53d06f1-11
new file mode 100644
index 0000000000000000000000000000000000000000..f678e21962289f0b8d8f786baeb1d647472f92c1
Binary files /dev/null and b/fuzzing/packet/corpus/257d2fe4f97aa4541ded8b1a41d6a65ef53d06f1-11 differ
diff --git a/fuzzing/packet/corpus/25e08ee00ac1320e41d90fa58d3149b3733448a6-8 b/fuzzing/packet/corpus/25e08ee00ac1320e41d90fa58d3149b3733448a6-8
new file mode 100644
index 0000000000000000000000000000000000000000..fa25df350a0a887488fcabd5fa90a5109e03e16a
Binary files /dev/null and b/fuzzing/packet/corpus/25e08ee00ac1320e41d90fa58d3149b3733448a6-8 differ
diff --git a/fuzzing/packet/corpus/3.bytes b/fuzzing/packet/corpus/3.bytes
new file mode 100644
index 0000000000000000000000000000000000000000..0bb83b59d69896621882b77884c4ab519e407ee5
Binary files /dev/null and b/fuzzing/packet/corpus/3.bytes differ
diff --git a/fuzzing/packet/corpus/3a199e742da9c4c4898f7a80306b1f68f7ab66c6-3 b/fuzzing/packet/corpus/3a199e742da9c4c4898f7a80306b1f68f7ab66c6-3
new file mode 100644
index 0000000000000000000000000000000000000000..bdeac6422ad6918320549b196d904d3e524557e0
Binary files /dev/null and b/fuzzing/packet/corpus/3a199e742da9c4c4898f7a80306b1f68f7ab66c6-3 differ
diff --git a/fuzzing/packet/corpus/3b1d7d76919291b6744b54fd2158f5df5c61ed2d-1 b/fuzzing/packet/corpus/3b1d7d76919291b6744b54fd2158f5df5c61ed2d-1
new file mode 100644
index 0000000000000000000000000000000000000000..886f01d35d0c580a4e4ed0bdc5ed8dabedb2811c
Binary files /dev/null and b/fuzzing/packet/corpus/3b1d7d76919291b6744b54fd2158f5df5c61ed2d-1 differ
diff --git a/fuzzing/packet/corpus/3e079343af2c1e793bbd2c8fcd672ec56dc6c25c-4 b/fuzzing/packet/corpus/3e079343af2c1e793bbd2c8fcd672ec56dc6c25c-4
new file mode 100644
index 0000000000000000000000000000000000000000..346bb1b3db8c5d09d21891a2d0e38d1af60cabc2
Binary files /dev/null and b/fuzzing/packet/corpus/3e079343af2c1e793bbd2c8fcd672ec56dc6c25c-4 differ
diff --git a/fuzzing/packet/corpus/4.bytes b/fuzzing/packet/corpus/4.bytes
new file mode 100644
index 0000000000000000000000000000000000000000..10fc460ddcfa541f70d4d1ea6bbdf76369b98205
Binary files /dev/null and b/fuzzing/packet/corpus/4.bytes differ
diff --git a/fuzzing/packet/corpus/4466603d1b8c2cbd09564a017acf94ab067a978a-5 b/fuzzing/packet/corpus/4466603d1b8c2cbd09564a017acf94ab067a978a-5
new file mode 100644
index 0000000000000000000000000000000000000000..32b10d9c709e0bebc9d8f782e58e84d16212a1bb
Binary files /dev/null and b/fuzzing/packet/corpus/4466603d1b8c2cbd09564a017acf94ab067a978a-5 differ
diff --git a/fuzzing/packet/corpus/48bc0d32526f356c3bd18a551c02562dcd5e6beb-15 b/fuzzing/packet/corpus/48bc0d32526f356c3bd18a551c02562dcd5e6beb-15
new file mode 100644
index 0000000000000000000000000000000000000000..06d333bb9d462f922ac6ddf5b22db17e978b7ce0
Binary files /dev/null and b/fuzzing/packet/corpus/48bc0d32526f356c3bd18a551c02562dcd5e6beb-15 differ
diff --git a/fuzzing/packet/corpus/48befb084cbe2e3036885a4e93fa62530717e2c4-2 b/fuzzing/packet/corpus/48befb084cbe2e3036885a4e93fa62530717e2c4-2
new file mode 100644
index 0000000000000000000000000000000000000000..4302f83d6d18a86ddd8abb6fa301f48731c60ffb
Binary files /dev/null and b/fuzzing/packet/corpus/48befb084cbe2e3036885a4e93fa62530717e2c4-2 differ
diff --git a/fuzzing/packet/corpus/4f4a2076a52f15811fb83a19c9d17941d9685338-12 b/fuzzing/packet/corpus/4f4a2076a52f15811fb83a19c9d17941d9685338-12
new file mode 100644
index 0000000000000000000000000000000000000000..9f1c3ef95bc12dbc7a754a26d0aa00be10b0db2f
Binary files /dev/null and b/fuzzing/packet/corpus/4f4a2076a52f15811fb83a19c9d17941d9685338-12 differ
diff --git a/fuzzing/packet/corpus/4f901d0f63c4332a3127984bd32e7770d5e620af-4 b/fuzzing/packet/corpus/4f901d0f63c4332a3127984bd32e7770d5e620af-4
new file mode 100644
index 0000000000000000000000000000000000000000..b55847d062bbd05c8a1d6af6ae15948619377e9d
Binary files /dev/null and b/fuzzing/packet/corpus/4f901d0f63c4332a3127984bd32e7770d5e620af-4 differ
diff --git a/fuzzing/packet/corpus/5.bytes b/fuzzing/packet/corpus/5.bytes
new file mode 100644
index 0000000000000000000000000000000000000000..2c7f282c3e1ff5041b60af15b15876e339cb6d2f
Binary files /dev/null and b/fuzzing/packet/corpus/5.bytes differ
diff --git a/fuzzing/packet/corpus/58417300797958a8d956a72f0d461c46bebf266e-3 b/fuzzing/packet/corpus/58417300797958a8d956a72f0d461c46bebf266e-3
new file mode 100644
index 0000000000000000000000000000000000000000..d14799d5d94c1f78b1a38e7a0fb4ff0fa10e2937
Binary files /dev/null and b/fuzzing/packet/corpus/58417300797958a8d956a72f0d461c46bebf266e-3 differ
diff --git a/fuzzing/packet/corpus/5c090c615e4374b511fba28f50ac4f8b43d1a1b6-5 b/fuzzing/packet/corpus/5c090c615e4374b511fba28f50ac4f8b43d1a1b6-5
new file mode 100644
index 0000000000000000000000000000000000000000..c8cf0f89c46c42df944919f7373d50e4bae43842
Binary files /dev/null and b/fuzzing/packet/corpus/5c090c615e4374b511fba28f50ac4f8b43d1a1b6-5 differ
diff --git a/fuzzing/packet/corpus/5fd3ce661a420848e4aaedfd43ace8bd2898ff24-7 b/fuzzing/packet/corpus/5fd3ce661a420848e4aaedfd43ace8bd2898ff24-7
new file mode 100644
index 0000000000000000000000000000000000000000..e2a95b9ba53a202301da06c811046ed46fbe1dfd
Binary files /dev/null and b/fuzzing/packet/corpus/5fd3ce661a420848e4aaedfd43ace8bd2898ff24-7 differ
diff --git a/fuzzing/packet/corpus/6.bytes b/fuzzing/packet/corpus/6.bytes
new file mode 100644
index 0000000000000000000000000000000000000000..47a09db59b6e2e494c99f0aee1d98566507bde2d
Binary files /dev/null and b/fuzzing/packet/corpus/6.bytes differ
diff --git a/fuzzing/packet/corpus/6148ec90437b1a05fe8768e94f5bec529f1a8cee-13 b/fuzzing/packet/corpus/6148ec90437b1a05fe8768e94f5bec529f1a8cee-13
new file mode 100644
index 0000000000000000000000000000000000000000..42b3b136c20ca4ef6ea05075b2272c81cf71037e
Binary files /dev/null and b/fuzzing/packet/corpus/6148ec90437b1a05fe8768e94f5bec529f1a8cee-13 differ
diff --git a/fuzzing/packet/corpus/62371dc5941146bd5d11d3a664a6242e36bcc01f-1 b/fuzzing/packet/corpus/62371dc5941146bd5d11d3a664a6242e36bcc01f-1
new file mode 100644
index 0000000000000000000000000000000000000000..1edd95f27beef0eab0a661f2caa2ee31a720f746
--- /dev/null
+++ b/fuzzing/packet/corpus/62371dc5941146bd5d11d3a664a6242e36bcc01f-1
@@ -0,0 +1 @@
+����������������
\ No newline at end of file
diff --git a/fuzzing/packet/corpus/63e58e734f4d8ab5d25f4fb42a0a97fbb981e49a-10 b/fuzzing/packet/corpus/63e58e734f4d8ab5d25f4fb42a0a97fbb981e49a-10
new file mode 100644
index 0000000000000000000000000000000000000000..823a32b86a4c7f33f16fed2a30f9055933cbe552
Binary files /dev/null and b/fuzzing/packet/corpus/63e58e734f4d8ab5d25f4fb42a0a97fbb981e49a-10 differ
diff --git a/fuzzing/packet/corpus/6698ba73735503c91bd06725a28dd97520492943-6 b/fuzzing/packet/corpus/6698ba73735503c91bd06725a28dd97520492943-6
new file mode 100644
index 0000000000000000000000000000000000000000..9c8f6e57161994df837b8bbcd98113dbcfdd531f
Binary files /dev/null and b/fuzzing/packet/corpus/6698ba73735503c91bd06725a28dd97520492943-6 differ
diff --git a/fuzzing/packet/corpus/6d51a3c633b809e379ccf02b1d89e651ed886248-2 b/fuzzing/packet/corpus/6d51a3c633b809e379ccf02b1d89e651ed886248-2
new file mode 100644
index 0000000000000000000000000000000000000000..9330e79e146399577b359e7132ecc2449948e42e
Binary files /dev/null and b/fuzzing/packet/corpus/6d51a3c633b809e379ccf02b1d89e651ed886248-2 differ
diff --git a/fuzzing/packet/corpus/6f9ac81c48e9f8adb7162137978afe333b73d5be-3 b/fuzzing/packet/corpus/6f9ac81c48e9f8adb7162137978afe333b73d5be-3
new file mode 100644
index 0000000000000000000000000000000000000000..6fdb34b7aa71ec77f33ba2691a575b81964c3ff5
Binary files /dev/null and b/fuzzing/packet/corpus/6f9ac81c48e9f8adb7162137978afe333b73d5be-3 differ
diff --git a/fuzzing/packet/corpus/728a5dac32c733c2fe484621b5baa43d9bb6b314-8 b/fuzzing/packet/corpus/728a5dac32c733c2fe484621b5baa43d9bb6b314-8
new file mode 100644
index 0000000000000000000000000000000000000000..1adc98e18c7d7006182eb6f08bb95e75ebcf042a
Binary files /dev/null and b/fuzzing/packet/corpus/728a5dac32c733c2fe484621b5baa43d9bb6b314-8 differ
diff --git a/fuzzing/packet/corpus/7967fa67234cffeb39b049156ddc642d832147de-7 b/fuzzing/packet/corpus/7967fa67234cffeb39b049156ddc642d832147de-7
new file mode 100644
index 0000000000000000000000000000000000000000..f2aa4fd7d347d2353ba27846d34d6b44e9a9a105
Binary files /dev/null and b/fuzzing/packet/corpus/7967fa67234cffeb39b049156ddc642d832147de-7 differ
diff --git a/fuzzing/packet/corpus/7f76af64fe02e90fda68781e3a1a92e7f7fa3686-14 b/fuzzing/packet/corpus/7f76af64fe02e90fda68781e3a1a92e7f7fa3686-14
new file mode 100644
index 0000000000000000000000000000000000000000..1d4b88d03c5758b09263f02cad7755fa92ec7e86
Binary files /dev/null and b/fuzzing/packet/corpus/7f76af64fe02e90fda68781e3a1a92e7f7fa3686-14 differ
diff --git a/fuzzing/packet/corpus/83e5382679a52a38b6ee66e19234850c6445276b-9 b/fuzzing/packet/corpus/83e5382679a52a38b6ee66e19234850c6445276b-9
new file mode 100644
index 0000000000000000000000000000000000000000..d0e0d2fc3c388b86b978dee344b41b24e071d569
Binary files /dev/null and b/fuzzing/packet/corpus/83e5382679a52a38b6ee66e19234850c6445276b-9 differ
diff --git a/fuzzing/packet/corpus/85e53271e14006f0265921d02d4d736cdc580b0b-1 b/fuzzing/packet/corpus/85e53271e14006f0265921d02d4d736cdc580b0b-1
new file mode 100644
index 0000000000000000000000000000000000000000..ce542efaa5124a0437f0c4db329d7ec4b7ba70a7
--- /dev/null
+++ b/fuzzing/packet/corpus/85e53271e14006f0265921d02d4d736cdc580b0b-1
@@ -0,0 +1 @@
+�
\ No newline at end of file
diff --git a/fuzzing/packet/corpus/92ad1f06bf6ed61ed2283e10bfe243f7102ee774-8 b/fuzzing/packet/corpus/92ad1f06bf6ed61ed2283e10bfe243f7102ee774-8
new file mode 100644
index 0000000000000000000000000000000000000000..36cf7b38b97e2e4faf5c38ae1f699462cfa020b2
Binary files /dev/null and b/fuzzing/packet/corpus/92ad1f06bf6ed61ed2283e10bfe243f7102ee774-8 differ
diff --git a/fuzzing/packet/corpus/a1a7f1b3b949cdd10400b4f6a06287b263a36477-4 b/fuzzing/packet/corpus/a1a7f1b3b949cdd10400b4f6a06287b263a36477-4
new file mode 100644
index 0000000000000000000000000000000000000000..c63b223b6abc0b81cf213f7f28516e84de3b7209
Binary files /dev/null and b/fuzzing/packet/corpus/a1a7f1b3b949cdd10400b4f6a06287b263a36477-4 differ
diff --git a/fuzzing/packet/corpus/a3d0c7741496b9936f0f467f7651f03578fb761e-6 b/fuzzing/packet/corpus/a3d0c7741496b9936f0f467f7651f03578fb761e-6
new file mode 100644
index 0000000000000000000000000000000000000000..3c3ea8f7921fda46cc2120fd5e43a86421da6fdb
Binary files /dev/null and b/fuzzing/packet/corpus/a3d0c7741496b9936f0f467f7651f03578fb761e-6 differ
diff --git a/fuzzing/packet/corpus/a8e7928916f90886b3d773931170eb8f562d72fe-5 b/fuzzing/packet/corpus/a8e7928916f90886b3d773931170eb8f562d72fe-5
new file mode 100644
index 0000000000000000000000000000000000000000..f3d634a6e0fcbad8ce496a353e6947f48b67b85f
Binary files /dev/null and b/fuzzing/packet/corpus/a8e7928916f90886b3d773931170eb8f562d72fe-5 differ
diff --git a/fuzzing/packet/corpus/ac28a95fa7e5373eddd5acd8a6ff1fe04b96e671-6 b/fuzzing/packet/corpus/ac28a95fa7e5373eddd5acd8a6ff1fe04b96e671-6
new file mode 100644
index 0000000000000000000000000000000000000000..1e84f9501569fa98d389232d4e4aa47e8cb0c51f
Binary files /dev/null and b/fuzzing/packet/corpus/ac28a95fa7e5373eddd5acd8a6ff1fe04b96e671-6 differ
diff --git a/fuzzing/packet/corpus/ad17b9fa9045080d6e1aa6c5c7580a10eed4ecb8-3 b/fuzzing/packet/corpus/ad17b9fa9045080d6e1aa6c5c7580a10eed4ecb8-3
new file mode 100644
index 0000000000000000000000000000000000000000..f412b003b5743bd2c3d881ba903805c62f93b902
Binary files /dev/null and b/fuzzing/packet/corpus/ad17b9fa9045080d6e1aa6c5c7580a10eed4ecb8-3 differ
diff --git a/fuzzing/packet/corpus/afa974e4717ef61591231fb3cac26787aa908258 b/fuzzing/packet/corpus/afa974e4717ef61591231fb3cac26787aa908258
new file mode 100644
index 0000000000000000000000000000000000000000..22685bbfc411a8f24521b95cb7b212b9fc80fdd0
--- /dev/null
+++ b/fuzzing/packet/corpus/afa974e4717ef61591231fb3cac26787aa908258
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuzzing/packet/corpus/b334ba4f2e51dd6bfdf68994e9e572ef59fb31d4-2 b/fuzzing/packet/corpus/b334ba4f2e51dd6bfdf68994e9e572ef59fb31d4-2
new file mode 100644
index 0000000000000000000000000000000000000000..53bb04d5f81ec9b64e56928692c9e913ee61febf
Binary files /dev/null and b/fuzzing/packet/corpus/b334ba4f2e51dd6bfdf68994e9e572ef59fb31d4-2 differ
diff --git a/fuzzing/packet/corpus/b6dc94ef39eb455c359b60e2813ae55665c6c085-1 b/fuzzing/packet/corpus/b6dc94ef39eb455c359b60e2813ae55665c6c085-1
new file mode 100644
index 0000000000000000000000000000000000000000..1f3855616eb73206f1461e5b155add4be7320f93
Binary files /dev/null and b/fuzzing/packet/corpus/b6dc94ef39eb455c359b60e2813ae55665c6c085-1 differ
diff --git a/fuzzing/packet/corpus/b7bdc0d8438edee7257cbdf70c36cb7d1f7035fa-10 b/fuzzing/packet/corpus/b7bdc0d8438edee7257cbdf70c36cb7d1f7035fa-10
new file mode 100644
index 0000000000000000000000000000000000000000..5f0af85d8332a28978c53ef26ceb11dcfdaf6556
Binary files /dev/null and b/fuzzing/packet/corpus/b7bdc0d8438edee7257cbdf70c36cb7d1f7035fa-10 differ
diff --git a/fuzzing/packet/corpus/b851290ca41de3bd9cacf5dd88650582409f9527-2 b/fuzzing/packet/corpus/b851290ca41de3bd9cacf5dd88650582409f9527-2
new file mode 100644
index 0000000000000000000000000000000000000000..b22466e4b93c989e41cb4e2cccf9dc38cd43c641
Binary files /dev/null and b/fuzzing/packet/corpus/b851290ca41de3bd9cacf5dd88650582409f9527-2 differ
diff --git a/fuzzing/packet/corpus/b9266e7167c429092cb26b3dff879f40891c3b7d-2 b/fuzzing/packet/corpus/b9266e7167c429092cb26b3dff879f40891c3b7d-2
new file mode 100644
index 0000000000000000000000000000000000000000..391ca0052bf8c728fb4b8c336f4a5da65426223c
Binary files /dev/null and b/fuzzing/packet/corpus/b9266e7167c429092cb26b3dff879f40891c3b7d-2 differ
diff --git a/fuzzing/packet/corpus/bc6400ae15329575a729943ccc9d0087c5ddfa75-1 b/fuzzing/packet/corpus/bc6400ae15329575a729943ccc9d0087c5ddfa75-1
new file mode 100644
index 0000000000000000000000000000000000000000..22b00376b7bce3e66d18782ab69121547269d01c
Binary files /dev/null and b/fuzzing/packet/corpus/bc6400ae15329575a729943ccc9d0087c5ddfa75-1 differ
diff --git a/fuzzing/packet/corpus/be687b1f2a8136b143e55a736b9b78cc3ea7c3ba-4 b/fuzzing/packet/corpus/be687b1f2a8136b143e55a736b9b78cc3ea7c3ba-4
new file mode 100644
index 0000000000000000000000000000000000000000..4aee6a1587c2b976c703a0971134f5035724ff0c
Binary files /dev/null and b/fuzzing/packet/corpus/be687b1f2a8136b143e55a736b9b78cc3ea7c3ba-4 differ
diff --git a/fuzzing/packet/corpus/c184ca210e236d050e56fc256f73e606f4ba3822-9 b/fuzzing/packet/corpus/c184ca210e236d050e56fc256f73e606f4ba3822-9
new file mode 100644
index 0000000000000000000000000000000000000000..9f38d6cfb57a4cebba6080e2ba017e5c41d826c4
Binary files /dev/null and b/fuzzing/packet/corpus/c184ca210e236d050e56fc256f73e606f4ba3822-9 differ
diff --git a/fuzzing/packet/corpus/c18bebbf42f8553ed0ba3a214155e9b8e7f88e10-1 b/fuzzing/packet/corpus/c18bebbf42f8553ed0ba3a214155e9b8e7f88e10-1
new file mode 100644
index 0000000000000000000000000000000000000000..2877cb62182ad6ce38e8b5b849c7b2341440915c
Binary files /dev/null and b/fuzzing/packet/corpus/c18bebbf42f8553ed0ba3a214155e9b8e7f88e10-1 differ
diff --git a/fuzzing/packet/corpus/c2d1525fc885f57c4a3222fdd1280d6113808867 b/fuzzing/packet/corpus/c2d1525fc885f57c4a3222fdd1280d6113808867
new file mode 100644
index 0000000000000000000000000000000000000000..7add13f25a123154590c62b7c24c2d87f895a0ae
Binary files /dev/null and b/fuzzing/packet/corpus/c2d1525fc885f57c4a3222fdd1280d6113808867 differ
diff --git a/fuzzing/packet/corpus/c817dce08db2ba5edf12dba94b54c8c84685cfdb-6 b/fuzzing/packet/corpus/c817dce08db2ba5edf12dba94b54c8c84685cfdb-6
new file mode 100644
index 0000000000000000000000000000000000000000..aaa9da984d35dfe69097c9bf20d853400cf0f394
Binary files /dev/null and b/fuzzing/packet/corpus/c817dce08db2ba5edf12dba94b54c8c84685cfdb-6 differ
diff --git a/fuzzing/packet/corpus/caf0fa4d68cf307435b48a4b673807f7e5eab117-1 b/fuzzing/packet/corpus/caf0fa4d68cf307435b48a4b673807f7e5eab117-1
new file mode 100644
index 0000000000000000000000000000000000000000..d4c0159f724d0c2ea9725f50aafc15734665f517
Binary files /dev/null and b/fuzzing/packet/corpus/caf0fa4d68cf307435b48a4b673807f7e5eab117-1 differ
diff --git a/fuzzing/packet/corpus/ce6cfb94676fdceb717db4b1513bdaf00e8b5b95 b/fuzzing/packet/corpus/ce6cfb94676fdceb717db4b1513bdaf00e8b5b95
new file mode 100644
index 0000000000000000000000000000000000000000..452f3353cce296d859cb4a771c63f964d10e451d
Binary files /dev/null and b/fuzzing/packet/corpus/ce6cfb94676fdceb717db4b1513bdaf00e8b5b95 differ
diff --git a/fuzzing/packet/corpus/ce8172f26f9352332a6dd74d2bbf557182fbb77c-1 b/fuzzing/packet/corpus/ce8172f26f9352332a6dd74d2bbf557182fbb77c-1
new file mode 100644
index 0000000000000000000000000000000000000000..198f6a3ac64a668b3803faaa92f1a387b7393787
Binary files /dev/null and b/fuzzing/packet/corpus/ce8172f26f9352332a6dd74d2bbf557182fbb77c-1 differ
diff --git a/fuzzing/packet/corpus/cf35187f48183cd066ab36204b2bed41a1636e8f-8 b/fuzzing/packet/corpus/cf35187f48183cd066ab36204b2bed41a1636e8f-8
new file mode 100644
index 0000000000000000000000000000000000000000..0f9f67d9e93dad4486354c0d8bfdadf76e33925b
Binary files /dev/null and b/fuzzing/packet/corpus/cf35187f48183cd066ab36204b2bed41a1636e8f-8 differ
diff --git a/fuzzing/packet/corpus/d25c953c2dfc83461f6308c7b153dfc582ad65f8-3 b/fuzzing/packet/corpus/d25c953c2dfc83461f6308c7b153dfc582ad65f8-3
new file mode 100644
index 0000000000000000000000000000000000000000..7e9df35c1cd8ff889a34b9ba5be3a13f79d22f31
Binary files /dev/null and b/fuzzing/packet/corpus/d25c953c2dfc83461f6308c7b153dfc582ad65f8-3 differ
diff --git a/fuzzing/packet/corpus/d834b8ed259157d28b3d8340b1000fc5332165cd-2 b/fuzzing/packet/corpus/d834b8ed259157d28b3d8340b1000fc5332165cd-2
new file mode 100644
index 0000000000000000000000000000000000000000..2b38f32e0c77532d08cee62fcd0e5f7fb16620c2
Binary files /dev/null and b/fuzzing/packet/corpus/d834b8ed259157d28b3d8340b1000fc5332165cd-2 differ
diff --git a/fuzzing/packet/corpus/d947e66423d44f11981817d9a4ed5f36edc1d73b-1 b/fuzzing/packet/corpus/d947e66423d44f11981817d9a4ed5f36edc1d73b-1
new file mode 100644
index 0000000000000000000000000000000000000000..dc069282d48156996b283a49aea3be81ebb2ef87
Binary files /dev/null and b/fuzzing/packet/corpus/d947e66423d44f11981817d9a4ed5f36edc1d73b-1 differ
diff --git a/fuzzing/packet/corpus/dc619c747104de130ec7e3424f9834e77e804c45-7 b/fuzzing/packet/corpus/dc619c747104de130ec7e3424f9834e77e804c45-7
new file mode 100644
index 0000000000000000000000000000000000000000..e6492c7022a473f45bb0a9830f4651e1f4a5b5f8
Binary files /dev/null and b/fuzzing/packet/corpus/dc619c747104de130ec7e3424f9834e77e804c45-7 differ
diff --git a/fuzzing/packet/corpus/e4b7cbca02328634bc87979b88ecbd2dfb3c74fd-6 b/fuzzing/packet/corpus/e4b7cbca02328634bc87979b88ecbd2dfb3c74fd-6
new file mode 100644
index 0000000000000000000000000000000000000000..a2415dafb9f3ff3b60be056b9a500cef21a5f985
Binary files /dev/null and b/fuzzing/packet/corpus/e4b7cbca02328634bc87979b88ecbd2dfb3c74fd-6 differ
diff --git a/fuzzing/packet/corpus/e6126c61f9505667f0a7cb2b90fb60c31dfded40-12 b/fuzzing/packet/corpus/e6126c61f9505667f0a7cb2b90fb60c31dfded40-12
new file mode 100644
index 0000000000000000000000000000000000000000..6b7b4d0daa83d60d257c357e510229a6a905dc89
Binary files /dev/null and b/fuzzing/packet/corpus/e6126c61f9505667f0a7cb2b90fb60c31dfded40-12 differ
diff --git a/fuzzing/packet/corpus/e70ffd323bf2dde3ff5ca80b4e6395724467b98d-4 b/fuzzing/packet/corpus/e70ffd323bf2dde3ff5ca80b4e6395724467b98d-4
new file mode 100644
index 0000000000000000000000000000000000000000..b7f8489eca2e83a61625423e289e9de86979bea5
Binary files /dev/null and b/fuzzing/packet/corpus/e70ffd323bf2dde3ff5ca80b4e6395724467b98d-4 differ
diff --git a/fuzzing/packet/corpus/e7952b4c14d15d88eaf665083a22778642302998-3 b/fuzzing/packet/corpus/e7952b4c14d15d88eaf665083a22778642302998-3
new file mode 100644
index 0000000000000000000000000000000000000000..5292b1fd24d40ebc5f1dff6473d539e47a6cd064
Binary files /dev/null and b/fuzzing/packet/corpus/e7952b4c14d15d88eaf665083a22778642302998-3 differ
diff --git a/fuzzing/packet/corpus/f1c58f297ddbe60dd6307cd156c4074e192a9453-15 b/fuzzing/packet/corpus/f1c58f297ddbe60dd6307cd156c4074e192a9453-15
new file mode 100644
index 0000000000000000000000000000000000000000..f2f40f0b8de0a17c0b3eacdab1fcbf7e7da8d258
Binary files /dev/null and b/fuzzing/packet/corpus/f1c58f297ddbe60dd6307cd156c4074e192a9453-15 differ
diff --git a/fuzzing/packet/corpus/fa4f6be24ac4351604432e26ce02b1c38b213abb-6 b/fuzzing/packet/corpus/fa4f6be24ac4351604432e26ce02b1c38b213abb-6
new file mode 100644
index 0000000000000000000000000000000000000000..cebbd01da53b2bdd3ec5c9f0e265ef83c5771537
Binary files /dev/null and b/fuzzing/packet/corpus/fa4f6be24ac4351604432e26ce02b1c38b213abb-6 differ
diff --git a/fuzzing/packet/corpus/fd371aa158566c6ff56ed1ad10898d075ea37216-4 b/fuzzing/packet/corpus/fd371aa158566c6ff56ed1ad10898d075ea37216-4
new file mode 100644
index 0000000000000000000000000000000000000000..d0e8c3419a3c7ceb124d1eb064549a6a8324274e
Binary files /dev/null and b/fuzzing/packet/corpus/fd371aa158566c6ff56ed1ad10898d075ea37216-4 differ
diff --git a/fuzzing/packet/corpus/ff1f57671f3d6cc4ea97c845bcad6b38160a444b-13 b/fuzzing/packet/corpus/ff1f57671f3d6cc4ea97c845bcad6b38160a444b-13
new file mode 100644
index 0000000000000000000000000000000000000000..26b8b7312e74a5635f60f407f11f49aa0868aae1
Binary files /dev/null and b/fuzzing/packet/corpus/ff1f57671f3d6cc4ea97c845bcad6b38160a444b-13 differ
diff --git a/fuzzing/packet/corpus/routerefresh b/fuzzing/packet/corpus/routerefresh
new file mode 100644
index 0000000000000000000000000000000000000000..70aeda65c4c08d45cfd8af18e6c98419708d7c46
Binary files /dev/null and b/fuzzing/packet/corpus/routerefresh differ
diff --git a/fuzzing/packet/corpus/tes b/fuzzing/packet/corpus/tes
new file mode 100644
index 0000000000000000000000000000000000000000..1b7d448f25a57662e92ebf3292f450b04c7ee1c3
Binary files /dev/null and b/fuzzing/packet/corpus/tes differ
diff --git a/fuzzing/packet/corpus/updatepcap1 b/fuzzing/packet/corpus/updatepcap1
new file mode 100644
index 0000000000000000000000000000000000000000..0f9cb9ec4cf3c58f3c3b2c6aa3f4c07ca6629a52
Binary files /dev/null and b/fuzzing/packet/corpus/updatepcap1 differ
diff --git a/fuzzing/packet/gen_initial_corpus.go b/fuzzing/packet/gen_initial_corpus.go
new file mode 100644
index 0000000000000000000000000000000000000000..ef8ee4d3b0e23ff3682ec30d1a09542071aff318
--- /dev/null
+++ b/fuzzing/packet/gen_initial_corpus.go
@@ -0,0 +1,109 @@
+// +build !test
+
+package main
+
+import (
+	"fmt"
+	"log"
+	"os"
+)
+
+func main() {
+	tests := []struct {
+		testNum  int
+		input    []byte
+		wantFail bool
+		expected interface{}
+	}{
+		{
+			// Proper packet
+			testNum: 1,
+			input: []byte{
+				255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, // Marker
+				0, 19, // Length
+				4, // Type = Keepalive
+
+			},
+			wantFail: false,
+		},
+		{
+			// Invalid marker
+			testNum: 2,
+			input: []byte{
+				1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, // Marker
+				0, 19, // Length
+				4, // Type = Keepalive
+
+			},
+			wantFail: true,
+		},
+		{
+			// Proper NOTIFICATION packet
+			testNum: 3,
+			input: []byte{
+				255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, // Marker
+				0, 21, // Length
+				3,    // Type = Notification
+				1, 1, // Message Header Error, Connection Not Synchronized.
+			},
+			wantFail: false,
+		},
+		{
+			// Proper OPEN packet
+			testNum: 4,
+			input: []byte{
+				255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, // Marker
+				0, 29, // Length
+				1,      // Type = Open
+				4,      // Version
+				0, 200, //ASN,
+				0, 15, // Holdtime
+				10, 20, 30, 40, // BGP Identifier
+				0, // Opt Parm Len
+			},
+			wantFail: false,
+		},
+		{
+			// Incomplete OPEN packet
+			testNum: 5,
+			input: []byte{
+				255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, // Marker
+				0, 28, // Length
+				1,      // Type = Open
+				4,      // Version
+				0, 200, //ASN,
+				0, 15, // Holdtime
+				0, 0, 0, 100, // BGP Identifier
+			},
+			wantFail: true,
+		},
+		{
+			testNum: 6,
+			input: []byte{
+				255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, // Marker
+				0, 28, // Length
+				2,                               // Type = Update
+				0, 5, 8, 10, 16, 192, 168, 0, 0, // 2 withdraws
+			},
+			wantFail: false,
+		},
+		{
+			testNum: 7,
+			input: []byte{
+				255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, // Marker
+				0, 28, // Length
+				5,                               // Type = Invalid
+				0, 5, 8, 10, 16, 192, 168, 0, 0, // Some more stuff
+			},
+			wantFail: true,
+		},
+	}
+	for i, t := range tests {
+		f, err := os.Create(fmt.Sprintf("corpus/%v.bytes", i))
+		if err != nil {
+			log.Fatalf(err.Error())
+		}
+		f.Write(t.input)
+		f.Close()
+	}
+}
diff --git a/net/ip.go b/net/ip.go
index 616658ca14977195a4d3b81a3db73f64d61f3399..44b84d192402d5e309ea9e394ee5237664cecae2 100644
--- a/net/ip.go
+++ b/net/ip.go
@@ -62,6 +62,21 @@ func IPFromBytes(b []byte) (IP, error) {
 	return IP{}, fmt.Errorf("byte slice has an invalid legth. Expected either 4 (IPv4) or 16 (IPv6) bytes but got: %d", len(b))
 }
 
+// IPFromString returns an IP address for a given string
+func IPFromString(str string) (IP, error) {
+	ip := net.ParseIP(str)
+	if ip == nil {
+		return IP{}, fmt.Errorf("%s is not a valid IP address", str)
+	}
+
+	ip4 := ip.To4()
+	if ip4 != nil {
+		return IPFromBytes(ip4)
+	}
+
+	return IPFromBytes(ip.To16())
+}
+
 // Equal returns true if ip is equal to other
 func (ip IP) Equal(other IP) bool {
 	return ip == other
diff --git a/net/ip_test.go b/net/ip_test.go
index 4720985f825ba242b1c78cf75773499d55bdd9bf..961730c01844a3c13c569de97eb7caed0be0567e 100644
--- a/net/ip_test.go
+++ b/net/ip_test.go
@@ -370,3 +370,46 @@ func TestBitAtPosition(t *testing.T) {
 		}
 	}
 }
+
+func TestIPFromString(t *testing.T) {
+	tests := []struct {
+		name     string
+		input    string
+		expected IP
+		wantFail bool
+	}{
+		{
+			name:     "ipv4",
+			input:    "192.168.1.234",
+			expected: IPv4FromOctets(192, 168, 1, 234),
+		},
+		{
+			name:     "ipv6",
+			input:    "2001:678:1e0::cafe",
+			expected: IPv6FromBlocks(0x2001, 0x678, 0x1e0, 0, 0, 0, 0, 0xcafe),
+		},
+		{
+			name:     "invalid",
+			input:    "foo",
+			wantFail: true,
+		},
+	}
+
+	for _, test := range tests {
+		t.Run(test.name, func(t *testing.T) {
+			ip, err := IPFromString(test.input)
+			if err == nil && test.wantFail {
+				t.Fatal("expected error but got nil")
+			}
+			if err != nil {
+				if test.wantFail {
+					return
+				}
+
+				t.Fatal(err)
+			}
+
+			assert.Equal(t, test.expected, ip)
+		})
+	}
+}
diff --git a/protocols/bgp/packet/fuzzing.go b/protocols/bgp/packet/fuzzing.go
new file mode 100644
index 0000000000000000000000000000000000000000..0adaded071d6eb2f23ecd4eb92055daa266cd8bb
--- /dev/null
+++ b/protocols/bgp/packet/fuzzing.go
@@ -0,0 +1,49 @@
+// foobar
+// +bu ild go fuzz
+
+package packet
+
+import (
+	"bytes"
+
+	"github.com/bio-routing/bio-rd/protocols/bgp/types"
+)
+
+const (
+	INC_PRIO = 1
+	KEEP     = 0
+	DISMISS  = -1
+)
+
+func Fuzz(data []byte) int {
+
+	buf := bytes.NewBuffer(data)
+	for _, option := range getAllOptions() {
+		msg, err := Decode(buf, &option)
+		if err != nil {
+			if msg != nil {
+				panic("msg != nil on error")
+			}
+
+		}
+		return INC_PRIO
+	}
+	return KEEP
+}
+
+func getAllOptions() []types.Options {
+	parameters := []bool{true, false}
+	var ret []types.Options
+	for _, octet := range parameters {
+		for _, multi := range parameters {
+			for _, addPathX := range parameters {
+				ret = append(ret, types.Options{
+					Supports4OctetASN:     octet,
+					SupportsMultiProtocol: multi,
+					AddPathRX:             addPathX,
+				})
+			}
+		}
+	}
+	return ret
+}
diff --git a/protocols/bgp/packet/mp_reach_nlri.go b/protocols/bgp/packet/mp_reach_nlri.go
index 55a709f53e96d50afae44d5894427f08c1ef7bf6..32009637f8b17fd282392ad0a7231a67940ce44b 100644
--- a/protocols/bgp/packet/mp_reach_nlri.go
+++ b/protocols/bgp/packet/mp_reach_nlri.go
@@ -42,8 +42,13 @@ func (n *MultiProtocolReachNLRI) serialize(buf *bytes.Buffer, opt *EncodeOptions
 func deserializeMultiProtocolReachNLRI(b []byte) (MultiProtocolReachNLRI, error) {
 	n := MultiProtocolReachNLRI{}
 	nextHopLength := uint8(0)
-	variable := make([]byte, len(b)-4)
 
+	variableLength := len(b) - 4 // 4 <- AFI + SAFI + NextHopLength
+	if variableLength <= 0 {
+		return n, fmt.Errorf("Invalid length of MP_REACH_NLRI: expected more than 4 bytes but got %d", len(b))
+	}
+
+	variable := make([]byte, variableLength)
 	fields := []interface{}{
 		&n.AFI,
 		&n.SAFI,
@@ -55,19 +60,25 @@ func deserializeMultiProtocolReachNLRI(b []byte) (MultiProtocolReachNLRI, error)
 		return MultiProtocolReachNLRI{}, err
 	}
 
+	budget := variableLength
+	if budget < int(nextHopLength) {
+		return MultiProtocolReachNLRI{},
+			fmt.Errorf("Failed to decode next hop IP: expected %d bytes for NLRI, only %d remaining", nextHopLength, budget)
+	}
+
 	n.NextHop, err = bnet.IPFromBytes(variable[:nextHopLength])
 	if err != nil {
 		return MultiProtocolReachNLRI{}, fmt.Errorf("Failed to decode next hop IP: %v", err)
 	}
-
-	variable = variable[1+nextHopLength:]
+	budget -= int(nextHopLength)
 
 	n.Prefixes = make([]bnet.Prefix, 0)
-
-	if len(variable) == 0 {
+	if budget == 0 {
 		return n, nil
 	}
 
+	variable = variable[1+nextHopLength:] // 1 <- RESERVED field
+
 	idx := uint16(0)
 	for idx < uint16(len(variable)) {
 		pfxLen := variable[idx]
diff --git a/protocols/bgp/packet/mp_unreach_nlri.go b/protocols/bgp/packet/mp_unreach_nlri.go
index 6431577ce4188837811f26bb8d819f4015c2d2a3..fd72618c51b58fe3437b5f7445f827f0b3820bcd 100644
--- a/protocols/bgp/packet/mp_unreach_nlri.go
+++ b/protocols/bgp/packet/mp_unreach_nlri.go
@@ -34,36 +34,41 @@ func (n *MultiProtocolUnreachNLRI) serialize(buf *bytes.Buffer, opt *EncodeOptio
 
 func deserializeMultiProtocolUnreachNLRI(b []byte) (MultiProtocolUnreachNLRI, error) {
 	n := MultiProtocolUnreachNLRI{}
-	prefix := make([]byte, len(b)-3)
 
+	prefixesLength := len(b) - 3 // 3 <- AFI + SAFI
+	if prefixesLength < 0 {
+		return n, fmt.Errorf("Invalid length of MP_UNREACH_NLRI: expected more than 3 bytes but got %d", len(b))
+	}
+
+	prefixes := make([]byte, prefixesLength)
 	fields := []interface{}{
 		&n.AFI,
 		&n.SAFI,
-		&prefix,
+		&prefixes,
 	}
 	err := decode(bytes.NewBuffer(b), fields)
 	if err != nil {
 		return MultiProtocolUnreachNLRI{}, err
 	}
 
-	if len(prefix) == 0 {
+	if len(prefixes) == 0 {
 		return n, nil
 	}
 
 	idx := uint16(0)
-	for idx < uint16(len(prefix)) {
-		pfxLen := prefix[idx]
+	for idx < uint16(len(prefixes)) {
+		pfxLen := prefixes[idx]
 		numBytes := uint16(BytesInAddr(pfxLen))
 		idx++
 
-		r := uint16(len(prefix)) - idx
+		r := uint16(len(prefixes)) - idx
 		if r < numBytes {
 			return MultiProtocolUnreachNLRI{}, fmt.Errorf("expected %d bytes for NLRI, only %d remaining", numBytes, r)
 		}
 
 		start := idx
 		end := idx + numBytes
-		pfx, err := deserializePrefix(prefix[start:end], pfxLen, n.AFI)
+		pfx, err := deserializePrefix(prefixes[start:end], pfxLen, n.AFI)
 		if err != nil {
 			return MultiProtocolUnreachNLRI{}, err
 		}
diff --git a/protocols/bgp/packet/path_attributes_test.go b/protocols/bgp/packet/path_attributes_test.go
index e92efb76ab7194d8f4087b7cfd90cadd1be9aa4a..958da99b783d20121e89fe4b85c4d213891bf550 100644
--- a/protocols/bgp/packet/path_attributes_test.go
+++ b/protocols/bgp/packet/path_attributes_test.go
@@ -934,6 +934,51 @@ func TestDecodeMultiProtocolReachNLRI(t *testing.T) {
 				},
 			},
 		},
+		{
+			name: "MP_REACH_NLRI with invalid length",
+			input: []byte{
+				0x00, 0x02, // AFI
+			},
+			wantFail: true,
+		},
+		{
+			name: "MP_REACH_NLRI with invalid length 2",
+			input: []byte{
+				0x00, 0x02, // AFI
+				0x01,                                           // SAFI
+				0x10, 0x20, 0x01, 0x06, 0x78, 0x01, 0xe0, 0x00, // incomplete NextHop
+			},
+			wantFail: true,
+		},
+		{
+			name: "MP_REACH_NLRI without prefixes",
+			input: []byte{
+				0x00, 0x02, // AFI
+				0x01,                                                                                                 // SAFI
+				0x10, 0x20, 0x01, 0x06, 0x78, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, // NextHop
+				0x00, // RESERVED
+			},
+			expected: &PathAttribute{
+				Length: 21,
+				Value: MultiProtocolReachNLRI{
+					AFI:      IPv6AFI,
+					SAFI:     UnicastSAFI,
+					NextHop:  bnet.IPv6FromBlocks(0x2001, 0x678, 0x1e0, 0, 0, 0, 0, 0x2),
+					Prefixes: []bnet.Prefix{},
+				},
+			},
+		},
+		{
+			name: "MP_REACH_NLRI with invalid prefixes",
+			input: []byte{
+				0x00, 0x02, // AFI
+				0x01,                                                                                                 // SAFI
+				0x10, 0x20, 0x01, 0x06, 0x78, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, // NextHop
+				0x00,             // RESERVED
+				0x30, 0x26, 0x00, // Prefix
+			},
+			wantFail: true,
+		},
 	}
 
 	t.Parallel()
@@ -998,6 +1043,22 @@ func TestDecodeMultiProtocolUnreachNLRI(t *testing.T) {
 				},
 			},
 		},
+		{
+			name: "MP_UNREACH_NLRI with invalid length",
+			input: []byte{
+				0x00, 0x02, // AFI
+			},
+			wantFail: true,
+		},
+		{
+			name: "MP_UNREACH_NLRI with invalid prefixes",
+			input: []byte{
+				0x00, 0x02, // AFI
+				0x01,                   // SAFI
+				0x2c, 0x26, 0x20, 0x01, // Prefix
+			},
+			wantFail: true,
+		},
 	}
 
 	t.Parallel()