diff --git a/src/Packets/L3.hs b/src/Packets/L3.hs index 564e813..df459ec 100644 --- a/src/Packets/L3.hs +++ b/src/Packets/L3.hs @@ -75,6 +75,13 @@ instance Binary IcmpPacket where putWord16be . unIcmpSqnum $ icmpSqnum putByteString payload - put _ = undefined + put (IcmpEchoResponse icmpId icmpSqnum payload) = putByteString $ fillIcmpChecksum . B.toStrict . runPut $ do + put IcmpTypeEchoResponse + putWord8 0 -- ICMP Code + putWord16be 0 -- Fill later + putWord16be . unIcmpId $ icmpId + putWord16be . unIcmpSqnum $ icmpSqnum + putByteString payload + get = undefined diff --git a/test/Test/Packets/L3.hs b/test/Test/Packets/L3.hs index a649da7..29bc748 100644 --- a/test/Test/Packets/L3.hs +++ b/test/Test/Packets/L3.hs @@ -20,7 +20,8 @@ tests = testGroup "L3" [ unitTests] unitTests :: TestTree unitTests = testGroup "Unit tests" [ testIpChecksum - , testSerializeEchoRequest ] + , testSerializeEchoRequest + , testSerializeEchoResponse ] testIpChecksum :: TestTree testIpChecksum = testCase "ipChecksum case 1" $ do @@ -42,4 +43,15 @@ testSerializeEchoRequest = testCase "serialize IcmpEchoRequest" $ do let icmp = IcmpEchoRequest (IcmpId 40402) (IcmpSqnum 2) payload (B.toStrict . encode) icmp @=? testIcmp +testSerializeEchoResponse :: TestTree +testSerializeEchoResponse = testCase "serialize IcmpEchoResponse" $ do + let payload = B.pack [ + 0x1c, 0x25, 0x31, 0x65, 0x00, 0x00, 0x00, 0x00, + 0x72, 0x51, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37 + ] + let testIcmp = B.pack [ 0x00, 0x00, 0xe0, 0x7c, 0x9d, 0xd2, 0x00, 0x02] <> payload + let icmp = IcmpEchoResponse (IcmpId 40402) (IcmpSqnum 2) payload + (B.toStrict . encode) icmp @=? testIcmp