Skip to content

Instantly share code, notes, and snippets.

@voidlizard
Created April 1, 2013 14:18
Show Gist options
  • Save voidlizard/5285196 to your computer and use it in GitHub Desktop.
Save voidlizard/5285196 to your computer and use it in GitHub Desktop.
{-# LANGUAGE BangPatterns #-}
module Main where
import qualified Data.ByteString as BS
import System.IO
import Control.Monad
import Data.Bits
import Data.Word
import Data.Monoid
import Data.ByteString.Lazy.Builder -- requires bytestring-0.10.x
bs = BS.replicate 64 0
builder = mconcat (replicate 1000000 (byteString bs))
buildPL = mconcat (replicate 64 (word8 0))
{-# INLINE buildPL #-}
buildMAC :: Word64 -> Builder
buildMAC i = word16BE (fromIntegral $ i `shiftR` 32) <> word32BE (fromIntegral $ i .&. 0xFFFFFFFF)
{-# INLINE buildMAC #-}
buildEth :: (Word64,Word64) -> Builder
buildEth (i,j) = mconcat [ buildMAC i, buildMAC j, word32BE 0, word16BE 0 -- Ethernet Frame header
, word32BE 0, word32BE 0, word32BE 0, word32BE 0 -- IP Header
, word32BE 0, word32BE 0, word32BE 0, word32BE 0 -- TCP Header
, byteString bs -- Payload
, word32BE 0 -- CRC32
]
{-# INLINE buildEth #-}
buildEth2 :: (Word64,Word64) -> Builder
buildEth2 (i,j) = mconcat [ buildMAC i, buildMAC j, word32BE 0, word16BE 0 -- Ethernet Frame header
, lazyByteString ipHeader -- IP Header
, lazyByteString tcpHeader -- TCP Header
, byteString bs -- Payload
, word32BE 0 -- CRC32
]
where ipHeader = toLazyByteString $ mconcat [word32BE 0, word32BE 0, word32BE 0, word32BE 0]
tcpHeader = toLazyByteString $ mconcat [word32BE 0, word32BE 0, word32BE 0, word32BE 0]
{-# INLINE buildEth2 #-}
buildAll = mconcat (map buildEth2 [(i,j)|i <- [1..1000], j <- [1..1000]])
{-# INLINE buildAll #-}
main = do
hPutBuilder stdout buildAll
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment