{-# LINE 1 "Network/Pcap/Base.hsc" #-}
{-# OPTIONS_GHC -fno-warn-unused-binds #-}
module Network.Pcap.Base
(
PcapTag
, PcapDumpTag
, Pdump
, BpfProgram
, BpfProgramTag
, Callback
, Direction(..)
, Link(..)
, Interface(..)
, PcapAddr(..)
, SockAddr(..)
, Network(..)
, PktHdr(..)
, Statistics(..)
, openOffline
, openLive
, openDead
, openDump
, setFilter
, compileFilter
, lookupDev
, findAllDevs
, lookupNet
, setNonBlock
, getNonBlock
, setDirection
, datalink
, setDatalink
, listDatalinks
, dispatch
, loop
, next
, dump
, sendPacket
, toPktHdr
, statistics
, version
, isSwapped
, snapshotLen
) where
import Control.Monad (when)
import Data.Maybe (isNothing, fromJust )
import Data.ByteString ()
{-# LINE 119 "Network/Pcap/Base.hsc" #-}
import qualified Data.ByteString.Internal as B
{-# LINE 121 "Network/Pcap/Base.hsc" #-}
import Data.Word (Word8, Word32)
import Foreign.Ptr (Ptr, plusPtr, nullPtr, FunPtr, freeHaskellFunPtr)
import Foreign.C.String (CString, peekCString, withCString)
import Foreign.C.Types (CInt(..), CUInt, CChar, CUChar, CLong)
import Foreign.Concurrent (newForeignPtr)
import Foreign.ForeignPtr (ForeignPtr)
import Foreign.Marshal.Alloc (alloca, allocaBytes, free)
import Foreign.Marshal.Array (allocaArray, peekArray)
import Foreign.Marshal.Utils (fromBool, toBool)
import Foreign.Storable (Storable(..))
import Network.Socket (Family(..), unpackFamily)
newtype BpfProgramTag = BpfProgramTag ()
type BpfProgram = ForeignPtr BpfProgramTag
newtype PcapTag = PcapTag ()
newtype PcapDumpTag = PcapDumpTag ()
type Pdump = ForeignPtr PcapDumpTag
data PktHdr = PktHdr {
PktHdr -> Word32
hdrSeconds :: {-# UNPACK #-} !Word32
, PktHdr -> Word32
hdrUseconds :: {-# UNPACK #-} !Word32
, PktHdr -> Word32
hdrCaptureLength :: {-# UNPACK #-} !Word32
, PktHdr -> Word32
hdrWireLength :: {-# UNPACK #-} !Word32
} deriving (PktHdr -> PktHdr -> Bool
(PktHdr -> PktHdr -> Bool)
-> (PktHdr -> PktHdr -> Bool) -> Eq PktHdr
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: PktHdr -> PktHdr -> Bool
== :: PktHdr -> PktHdr -> Bool
$c/= :: PktHdr -> PktHdr -> Bool
/= :: PktHdr -> PktHdr -> Bool
Eq, Int -> PktHdr -> ShowS
[PktHdr] -> ShowS
PktHdr -> String
(Int -> PktHdr -> ShowS)
-> (PktHdr -> String) -> ([PktHdr] -> ShowS) -> Show PktHdr
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> PktHdr -> ShowS
showsPrec :: Int -> PktHdr -> ShowS
$cshow :: PktHdr -> String
show :: PktHdr -> String
$cshowList :: [PktHdr] -> ShowS
showList :: [PktHdr] -> ShowS
Show)
data Statistics = Statistics {
Statistics -> Word32
statReceived :: {-# UNPACK #-} !Word32
, Statistics -> Word32
statDropped :: {-# UNPACK #-} !Word32
, Statistics -> Word32
statIfaceDropped :: {-# UNPACK #-} !Word32
} deriving (Statistics -> Statistics -> Bool
(Statistics -> Statistics -> Bool)
-> (Statistics -> Statistics -> Bool) -> Eq Statistics
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Statistics -> Statistics -> Bool
== :: Statistics -> Statistics -> Bool
$c/= :: Statistics -> Statistics -> Bool
/= :: Statistics -> Statistics -> Bool
Eq, Int -> Statistics -> ShowS
[Statistics] -> ShowS
Statistics -> String
(Int -> Statistics -> ShowS)
-> (Statistics -> String)
-> ([Statistics] -> ShowS)
-> Show Statistics
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Statistics -> ShowS
showsPrec :: Int -> Statistics -> ShowS
$cshow :: Statistics -> String
show :: Statistics -> String
$cshowList :: [Statistics] -> ShowS
showList :: [Statistics] -> ShowS
Show)
type ErrBuf = Ptr CChar
data Interface = Interface {
Interface -> String
ifName :: String
, Interface -> String
ifDescription :: String
, Interface -> [PcapAddr]
ifAddresses :: [PcapAddr]
, Interface -> Word32
ifFlags :: Word32
} deriving (Interface -> Interface -> Bool
(Interface -> Interface -> Bool)
-> (Interface -> Interface -> Bool) -> Eq Interface
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Interface -> Interface -> Bool
== :: Interface -> Interface -> Bool
$c/= :: Interface -> Interface -> Bool
/= :: Interface -> Interface -> Bool
Eq, ReadPrec [Interface]
ReadPrec Interface
Int -> ReadS Interface
ReadS [Interface]
(Int -> ReadS Interface)
-> ReadS [Interface]
-> ReadPrec Interface
-> ReadPrec [Interface]
-> Read Interface
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS Interface
readsPrec :: Int -> ReadS Interface
$creadList :: ReadS [Interface]
readList :: ReadS [Interface]
$creadPrec :: ReadPrec Interface
readPrec :: ReadPrec Interface
$creadListPrec :: ReadPrec [Interface]
readListPrec :: ReadPrec [Interface]
Read, Int -> Interface -> ShowS
[Interface] -> ShowS
Interface -> String
(Int -> Interface -> ShowS)
-> (Interface -> String)
-> ([Interface] -> ShowS)
-> Show Interface
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Interface -> ShowS
showsPrec :: Int -> Interface -> ShowS
$cshow :: Interface -> String
show :: Interface -> String
$cshowList :: [Interface] -> ShowS
showList :: [Interface] -> ShowS
Show)
data PcapAddr = PcapAddr {
PcapAddr -> SockAddr
addrSA :: SockAddr
, PcapAddr -> Maybe SockAddr
addrMask :: Maybe SockAddr
, PcapAddr -> Maybe SockAddr
addrBcast :: Maybe SockAddr
, PcapAddr -> Maybe SockAddr
addrPeer :: Maybe SockAddr
} deriving (PcapAddr -> PcapAddr -> Bool
(PcapAddr -> PcapAddr -> Bool)
-> (PcapAddr -> PcapAddr -> Bool) -> Eq PcapAddr
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: PcapAddr -> PcapAddr -> Bool
== :: PcapAddr -> PcapAddr -> Bool
$c/= :: PcapAddr -> PcapAddr -> Bool
/= :: PcapAddr -> PcapAddr -> Bool
Eq, ReadPrec [PcapAddr]
ReadPrec PcapAddr
Int -> ReadS PcapAddr
ReadS [PcapAddr]
(Int -> ReadS PcapAddr)
-> ReadS [PcapAddr]
-> ReadPrec PcapAddr
-> ReadPrec [PcapAddr]
-> Read PcapAddr
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS PcapAddr
readsPrec :: Int -> ReadS PcapAddr
$creadList :: ReadS [PcapAddr]
readList :: ReadS [PcapAddr]
$creadPrec :: ReadPrec PcapAddr
readPrec :: ReadPrec PcapAddr
$creadListPrec :: ReadPrec [PcapAddr]
readListPrec :: ReadPrec [PcapAddr]
Read, Int -> PcapAddr -> ShowS
[PcapAddr] -> ShowS
PcapAddr -> String
(Int -> PcapAddr -> ShowS)
-> (PcapAddr -> String) -> ([PcapAddr] -> ShowS) -> Show PcapAddr
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> PcapAddr -> ShowS
showsPrec :: Int -> PcapAddr -> ShowS
$cshow :: PcapAddr -> String
show :: PcapAddr -> String
$cshowList :: [PcapAddr] -> ShowS
showList :: [PcapAddr] -> ShowS
Show)
data SockAddr = SockAddr {
SockAddr -> Family
saFamily :: !Family
, SockAddr -> ByteString
saAddr :: {-# UNPACK #-} !B.ByteString
} deriving (SockAddr -> SockAddr -> Bool
(SockAddr -> SockAddr -> Bool)
-> (SockAddr -> SockAddr -> Bool) -> Eq SockAddr
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: SockAddr -> SockAddr -> Bool
== :: SockAddr -> SockAddr -> Bool
$c/= :: SockAddr -> SockAddr -> Bool
/= :: SockAddr -> SockAddr -> Bool
Eq, ReadPrec [SockAddr]
ReadPrec SockAddr
Int -> ReadS SockAddr
ReadS [SockAddr]
(Int -> ReadS SockAddr)
-> ReadS [SockAddr]
-> ReadPrec SockAddr
-> ReadPrec [SockAddr]
-> Read SockAddr
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS SockAddr
readsPrec :: Int -> ReadS SockAddr
$creadList :: ReadS [SockAddr]
readList :: ReadS [SockAddr]
$creadPrec :: ReadPrec SockAddr
readPrec :: ReadPrec SockAddr
$creadListPrec :: ReadPrec [SockAddr]
readListPrec :: ReadPrec [SockAddr]
Read, Int -> SockAddr -> ShowS
[SockAddr] -> ShowS
SockAddr -> String
(Int -> SockAddr -> ShowS)
-> (SockAddr -> String) -> ([SockAddr] -> ShowS) -> Show SockAddr
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> SockAddr -> ShowS
showsPrec :: Int -> SockAddr -> ShowS
$cshow :: SockAddr -> String
show :: SockAddr -> String
$cshowList :: [SockAddr] -> ShowS
showList :: [SockAddr] -> ShowS
Show)
data Network = Network {
Network -> Word32
netAddr :: {-# UNPACK #-} !Word32
, Network -> Word32
netMask :: {-# UNPACK #-} !Word32
} deriving (Network -> Network -> Bool
(Network -> Network -> Bool)
-> (Network -> Network -> Bool) -> Eq Network
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Network -> Network -> Bool
== :: Network -> Network -> Bool
$c/= :: Network -> Network -> Bool
/= :: Network -> Network -> Bool
Eq, ReadPrec [Network]
ReadPrec Network
Int -> ReadS Network
ReadS [Network]
(Int -> ReadS Network)
-> ReadS [Network]
-> ReadPrec Network
-> ReadPrec [Network]
-> Read Network
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS Network
readsPrec :: Int -> ReadS Network
$creadList :: ReadS [Network]
readList :: ReadS [Network]
$creadPrec :: ReadPrec Network
readPrec :: ReadPrec Network
$creadListPrec :: ReadPrec [Network]
readListPrec :: ReadPrec [Network]
Read, Int -> Network -> ShowS
[Network] -> ShowS
Network -> String
(Int -> Network -> ShowS)
-> (Network -> String) -> ([Network] -> ShowS) -> Show Network
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Network -> ShowS
showsPrec :: Int -> Network -> ShowS
$cshow :: Network -> String
show :: Network -> String
$cshowList :: [Network] -> ShowS
showList :: [Network] -> ShowS
Show)
withErrBuf :: (a -> Bool) -> (ErrBuf -> IO a) -> IO a
withErrBuf :: forall a. (a -> Bool) -> (CString -> IO a) -> IO a
withErrBuf a -> Bool
isError CString -> IO a
f = Int -> (CString -> IO a) -> IO a
forall a b. Storable a => Int -> (Ptr a -> IO b) -> IO b
allocaArray (Int
256) ((CString -> IO a) -> IO a) -> (CString -> IO a) -> IO a
forall a b. (a -> b) -> a -> b
$ \CString
errPtr -> do
{-# LINE 203 "Network/Pcap/Base.hsc" #-}
ret <- f errPtr
if isError ret
then peekCString errPtr >>= ioError . userError
else return ret
withErrBuf_ :: (a -> Bool) -> (ErrBuf -> IO a) -> IO ()
withErrBuf_ :: forall a. (a -> Bool) -> (CString -> IO a) -> IO ()
withErrBuf_ a -> Bool
isError CString -> IO a
f = (a -> Bool) -> (CString -> IO a) -> IO a
forall a. (a -> Bool) -> (CString -> IO a) -> IO a
withErrBuf a -> Bool
isError CString -> IO a
f IO a -> IO () -> IO ()
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
openOffline :: FilePath
-> IO (ForeignPtr PcapTag)
openOffline :: String -> IO (ForeignPtr PcapTag)
openOffline String
name =
String
-> (CString -> IO (ForeignPtr PcapTag)) -> IO (ForeignPtr PcapTag)
forall a. String -> (CString -> IO a) -> IO a
withCString String
name ((CString -> IO (ForeignPtr PcapTag)) -> IO (ForeignPtr PcapTag))
-> (CString -> IO (ForeignPtr PcapTag)) -> IO (ForeignPtr PcapTag)
forall a b. (a -> b) -> a -> b
$ \CString
namePtr -> do
Ptr PcapTag
ptr <- (Ptr PcapTag -> Bool)
-> (CString -> IO (Ptr PcapTag)) -> IO (Ptr PcapTag)
forall a. (a -> Bool) -> (CString -> IO a) -> IO a
withErrBuf (Ptr PcapTag -> Ptr PcapTag -> Bool
forall a. Eq a => a -> a -> Bool
== Ptr PcapTag
forall a. Ptr a
nullPtr) (CString -> CString -> IO (Ptr PcapTag)
pcap_open_offline CString
namePtr)
Ptr PcapTag -> IO () -> IO (ForeignPtr PcapTag)
forall a. Ptr a -> IO () -> IO (ForeignPtr a)
newForeignPtr Ptr PcapTag
ptr (Ptr PcapTag -> IO ()
pcap_close Ptr PcapTag
ptr)
openLive :: String
-> Int
-> Bool
-> Int
-> IO (ForeignPtr PcapTag)
openLive :: String -> Int -> Bool -> Int -> IO (ForeignPtr PcapTag)
openLive String
name Int
snaplen Bool
promisc Int
timeout =
String
-> (CString -> IO (ForeignPtr PcapTag)) -> IO (ForeignPtr PcapTag)
forall a. String -> (CString -> IO a) -> IO a
withCString String
name ((CString -> IO (ForeignPtr PcapTag)) -> IO (ForeignPtr PcapTag))
-> (CString -> IO (ForeignPtr PcapTag)) -> IO (ForeignPtr PcapTag)
forall a b. (a -> b) -> a -> b
$ \CString
namePtr -> do
Ptr PcapTag
ptr <- (Ptr PcapTag -> Bool)
-> (CString -> IO (Ptr PcapTag)) -> IO (Ptr PcapTag)
forall a. (a -> Bool) -> (CString -> IO a) -> IO a
withErrBuf (Ptr PcapTag -> Ptr PcapTag -> Bool
forall a. Eq a => a -> a -> Bool
== Ptr PcapTag
forall a. Ptr a
nullPtr) ((CString -> IO (Ptr PcapTag)) -> IO (Ptr PcapTag))
-> (CString -> IO (Ptr PcapTag)) -> IO (Ptr PcapTag)
forall a b. (a -> b) -> a -> b
$ CString -> CInt -> CInt -> CInt -> CString -> IO (Ptr PcapTag)
pcap_open_live CString
namePtr
(Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
snaplen) (Bool -> CInt
forall a. Num a => Bool -> a
fromBool Bool
promisc) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
timeout)
Ptr PcapTag -> IO () -> IO (ForeignPtr PcapTag)
forall a. Ptr a -> IO () -> IO (ForeignPtr a)
newForeignPtr Ptr PcapTag
ptr (Ptr PcapTag -> IO ()
pcap_close Ptr PcapTag
ptr)
openDead :: Link
-> Int
-> IO (ForeignPtr PcapTag)
openDead :: Link -> Int -> IO (ForeignPtr PcapTag)
openDead Link
link Int
snaplen = do
Ptr PcapTag
ptr <- CInt -> CInt -> IO (Ptr PcapTag)
pcap_open_dead (Link -> CInt
packLink Link
link)
(Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
snaplen)
Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Ptr PcapTag
ptr Ptr PcapTag -> Ptr PcapTag -> Bool
forall a. Eq a => a -> a -> Bool
== Ptr PcapTag
forall a. Ptr a
nullPtr) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
IOError -> IO ()
forall a. IOError -> IO a
ioError (IOError -> IO ()) -> IOError -> IO ()
forall a b. (a -> b) -> a -> b
$ String -> IOError
userError String
"Can't open dead pcap device"
Ptr PcapTag -> IO () -> IO (ForeignPtr PcapTag)
forall a. Ptr a -> IO () -> IO (ForeignPtr a)
newForeignPtr Ptr PcapTag
ptr (Ptr PcapTag -> IO ()
pcap_close Ptr PcapTag
ptr)
foreign import ccall unsafe pcap_open_offline
:: CString -> ErrBuf -> IO (Ptr PcapTag)
foreign import ccall unsafe pcap_close
:: Ptr PcapTag -> IO ()
foreign import ccall unsafe pcap_open_live
:: CString -> CInt -> CInt -> CInt -> ErrBuf -> IO (Ptr PcapTag)
foreign import ccall unsafe pcap_open_dead
:: CInt -> CInt -> IO (Ptr PcapTag)
openDump :: Ptr PcapTag
-> FilePath
-> IO Pdump
openDump :: Ptr PcapTag -> String -> IO Pdump
openDump Ptr PcapTag
hdl String
name =
String -> (CString -> IO Pdump) -> IO Pdump
forall a. String -> (CString -> IO a) -> IO a
withCString String
name ((CString -> IO Pdump) -> IO Pdump)
-> (CString -> IO Pdump) -> IO Pdump
forall a b. (a -> b) -> a -> b
$ \CString
namePtr -> do
Ptr PcapDumpTag
ptr <- Ptr PcapTag -> CString -> IO (Ptr PcapDumpTag)
pcap_dump_open Ptr PcapTag
hdl CString
namePtr IO (Ptr PcapDumpTag)
-> (Ptr PcapDumpTag -> IO (Ptr PcapDumpTag))
-> IO (Ptr PcapDumpTag)
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Ptr PcapTag
-> (Ptr PcapDumpTag -> Bool)
-> Ptr PcapDumpTag
-> IO (Ptr PcapDumpTag)
forall a. Ptr PcapTag -> (a -> Bool) -> a -> IO a
throwPcapIf Ptr PcapTag
hdl (Ptr PcapDumpTag -> Ptr PcapDumpTag -> Bool
forall a. Eq a => a -> a -> Bool
== Ptr PcapDumpTag
forall a. Ptr a
nullPtr)
Ptr PcapDumpTag -> IO () -> IO Pdump
forall a. Ptr a -> IO () -> IO (ForeignPtr a)
newForeignPtr Ptr PcapDumpTag
ptr (Ptr PcapDumpTag -> IO ()
pcap_dump_close Ptr PcapDumpTag
ptr)
foreign import ccall unsafe pcap_dump_open
:: Ptr PcapTag -> CString -> IO (Ptr PcapDumpTag)
foreign import ccall unsafe pcap_dump_close
:: Ptr PcapDumpTag -> IO ()
setFilter :: Ptr PcapTag
-> String
-> Bool
-> Word32
-> IO ()
setFilter :: Ptr PcapTag -> String -> Bool -> Word32 -> IO ()
setFilter Ptr PcapTag
hdl String
filt Bool
opt Word32
mask =
String -> (CString -> IO ()) -> IO ()
forall a. String -> (CString -> IO a) -> IO a
withCString String
filt ((CString -> IO ()) -> IO ()) -> (CString -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \CString
filtstr -> do
Int -> (Ptr BpfProgramTag -> IO ()) -> IO ()
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes ((Int
8)) ((Ptr BpfProgramTag -> IO ()) -> IO ())
-> (Ptr BpfProgramTag -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr BpfProgramTag
bpfp -> do
{-# LINE 302 "Network/Pcap/Base.hsc" #-}
Ptr PcapTag
-> Ptr BpfProgramTag -> CString -> CInt -> CInt -> IO CInt
pcap_compile Ptr PcapTag
hdl Ptr BpfProgramTag
bpfp CString
filtstr (Bool -> CInt
forall a. Num a => Bool -> a
fromBool Bool
opt) (Word32 -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
mask) IO CInt -> (CInt -> IO ()) -> IO ()
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>=
Ptr PcapTag -> (CInt -> Bool) -> CInt -> IO ()
forall a. Ptr PcapTag -> (a -> Bool) -> a -> IO ()
throwPcapIf_ Ptr PcapTag
hdl (CInt -> CInt -> Bool
forall a. Eq a => a -> a -> Bool
== -CInt
1)
Ptr PcapTag -> Ptr BpfProgramTag -> IO CInt
pcap_setfilter Ptr PcapTag
hdl Ptr BpfProgramTag
bpfp IO CInt -> (CInt -> IO ()) -> IO ()
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Ptr PcapTag -> (CInt -> Bool) -> CInt -> IO ()
forall a. Ptr PcapTag -> (a -> Bool) -> a -> IO ()
throwPcapIf_ Ptr PcapTag
hdl (CInt -> CInt -> Bool
forall a. Eq a => a -> a -> Bool
== -CInt
1)
Ptr BpfProgramTag -> IO ()
pcap_freecode Ptr BpfProgramTag
bpfp
compileFilter :: Int
-> Link
-> String
-> Bool
-> Word32
-> IO BpfProgram
compileFilter :: Int -> Link -> String -> Bool -> Word32 -> IO BpfProgram
compileFilter Int
snaplen Link
link String
filt Bool
opt Word32
mask =
String -> (CString -> IO BpfProgram) -> IO BpfProgram
forall a. String -> (CString -> IO a) -> IO a
withCString String
filt ((CString -> IO BpfProgram) -> IO BpfProgram)
-> (CString -> IO BpfProgram) -> IO BpfProgram
forall a b. (a -> b) -> a -> b
$ \CString
filtstr ->
Int -> (Ptr BpfProgramTag -> IO BpfProgram) -> IO BpfProgram
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes ((Int
8)) ((Ptr BpfProgramTag -> IO BpfProgram) -> IO BpfProgram)
-> (Ptr BpfProgramTag -> IO BpfProgram) -> IO BpfProgram
forall a b. (a -> b) -> a -> b
$ \Ptr BpfProgramTag
bpfp -> do
{-# LINE 318 "Network/Pcap/Base.hsc" #-}
CInt
ret <- CInt
-> CInt -> Ptr BpfProgramTag -> CString -> CInt -> CInt -> IO CInt
pcap_compile_nopcap (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
snaplen)
(Link -> CInt
packLink Link
link)
Ptr BpfProgramTag
bpfp
CString
filtstr
(Bool -> CInt
forall a. Num a => Bool -> a
fromBool Bool
opt)
(Word32 -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
mask)
Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (CInt
ret CInt -> CInt -> Bool
forall a. Eq a => a -> a -> Bool
== (-CInt
1)) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
IOError -> IO ()
forall a. IOError -> IO a
ioError (IOError -> IO ()) -> IOError -> IO ()
forall a b. (a -> b) -> a -> b
$ String -> IOError
userError String
"Pcap.compileFilter error"
Ptr BpfProgramTag -> IO () -> IO BpfProgram
forall a. Ptr a -> IO () -> IO (ForeignPtr a)
newForeignPtr Ptr BpfProgramTag
bpfp (Ptr BpfProgramTag -> IO ()
pcap_freecode Ptr BpfProgramTag
bpfp)
foreign import ccall pcap_compile
:: Ptr PcapTag -> Ptr BpfProgramTag -> CString -> CInt -> CInt
-> IO CInt
foreign import ccall pcap_compile_nopcap
:: CInt -> CInt -> Ptr BpfProgramTag -> CString -> CInt -> CInt
-> IO CInt
foreign import ccall pcap_setfilter
:: Ptr PcapTag -> Ptr BpfProgramTag -> IO CInt
foreign import ccall pcap_freecode
:: Ptr BpfProgramTag -> IO ()
newtype DevBuf = DevBuf ()
newtype DevAddr = DevAddr ()
lookupDev :: IO String
lookupDev :: IO String
lookupDev = (CString -> Bool) -> (CString -> IO CString) -> IO CString
forall a. (a -> Bool) -> (CString -> IO a) -> IO a
withErrBuf (CString -> CString -> Bool
forall a. Eq a => a -> a -> Bool
== CString
forall a. Ptr a
nullPtr) CString -> IO CString
pcap_lookupdev IO CString -> (CString -> IO String) -> IO String
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= CString -> IO String
peekCString
findAllDevs :: IO [Interface]
findAllDevs :: IO [Interface]
findAllDevs =
(Ptr (Ptr DevBuf) -> IO [Interface]) -> IO [Interface]
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr (Ptr DevBuf) -> IO [Interface]) -> IO [Interface])
-> (Ptr (Ptr DevBuf) -> IO [Interface]) -> IO [Interface]
forall a b. (a -> b) -> a -> b
$ \Ptr (Ptr DevBuf)
dptr -> do
(CInt -> Bool) -> (CString -> IO CInt) -> IO ()
forall a. (a -> Bool) -> (CString -> IO a) -> IO ()
withErrBuf_ (CInt -> CInt -> Bool
forall a. Eq a => a -> a -> Bool
== -CInt
1) (Ptr (Ptr DevBuf) -> CString -> IO CInt
pcap_findalldevs Ptr (Ptr DevBuf)
dptr)
Ptr DevBuf
dbuf <- Ptr (Ptr DevBuf) -> IO (Ptr DevBuf)
forall a. Storable a => Ptr a -> IO a
peek Ptr (Ptr DevBuf)
dptr
[Interface]
dl <- Ptr DevBuf -> IO [Interface]
devs2list Ptr DevBuf
dbuf
Ptr DevBuf -> IO ()
pcap_freealldevs Ptr DevBuf
dbuf
[Interface] -> IO [Interface]
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return [Interface]
dl
devs2list :: Ptr DevBuf -> IO [Interface]
devs2list :: Ptr DevBuf -> IO [Interface]
devs2list Ptr DevBuf
dbuf
| Ptr DevBuf
dbuf Ptr DevBuf -> Ptr DevBuf -> Bool
forall a. Eq a => a -> a -> Bool
== Ptr DevBuf
forall a. Ptr a
nullPtr = [Interface] -> IO [Interface]
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return []
| Bool
otherwise = do
Ptr DevBuf
nextdev <- ((\Ptr DevBuf
hsc_ptr -> Ptr DevBuf -> Int -> IO (Ptr DevBuf)
forall b. Ptr b -> Int -> IO (Ptr DevBuf)
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr DevBuf
hsc_ptr Int
0)) Ptr DevBuf
dbuf
{-# LINE 370 "Network/Pcap/Base.hsc" #-}
[Interface]
ds <- Ptr DevBuf -> IO [Interface]
devs2list Ptr DevBuf
nextdev
Interface
d <- Ptr DevBuf -> IO Interface
oneDev Ptr DevBuf
dbuf
[Interface] -> IO [Interface]
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Interface
d Interface -> [Interface] -> [Interface]
forall a. a -> [a] -> [a]
: [Interface]
ds)
oneDev :: Ptr DevBuf -> IO Interface
oneDev :: Ptr DevBuf -> IO Interface
oneDev Ptr DevBuf
dbuf = do
CString
name <- ((\Ptr DevBuf
hsc_ptr -> Ptr DevBuf -> Int -> IO CString
forall b. Ptr b -> Int -> IO CString
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr DevBuf
hsc_ptr Int
4)) Ptr DevBuf
dbuf
{-# LINE 377 "Network/Pcap/Base.hsc" #-}
desc <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) dbuf
{-# LINE 378 "Network/Pcap/Base.hsc" #-}
addrs <- ((\hsc_ptr -> peekByteOff hsc_ptr 12)) dbuf
{-# LINE 379 "Network/Pcap/Base.hsc" #-}
flags <- ((\hsc_ptr -> peekByteOff hsc_ptr 16)) dbuf
{-# LINE 380 "Network/Pcap/Base.hsc" #-}
String
name' <- CString -> IO String
peekCString CString
name
String
desc' <- if CString
desc CString -> CString -> Bool
forall a. Eq a => a -> a -> Bool
/= CString
forall a. Ptr a
nullPtr
then CString -> IO String
peekCString CString
desc
else String -> IO String
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return String
""
[PcapAddr]
addrs' <- Ptr DevAddr -> IO [PcapAddr]
addrs2list Ptr DevAddr
addrs
Interface -> IO Interface
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Interface { ifName :: String
ifName = String
name'
, ifDescription :: String
ifDescription = String
desc'
, ifAddresses :: [PcapAddr]
ifAddresses = [PcapAddr]
addrs'
, ifFlags :: Word32
ifFlags = CUInt -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CUInt
flags :: CUInt)
}
addrs2list :: Ptr DevAddr -> IO [PcapAddr]
addrs2list :: Ptr DevAddr -> IO [PcapAddr]
addrs2list Ptr DevAddr
abuf
| Ptr DevAddr
abuf Ptr DevAddr -> Ptr DevAddr -> Bool
forall a. Eq a => a -> a -> Bool
== Ptr DevAddr
forall a. Ptr a
nullPtr = [PcapAddr] -> IO [PcapAddr]
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return []
| Bool
otherwise = do
Ptr DevAddr
nextaddr <- ((\Ptr DevAddr
hsc_ptr -> Ptr DevAddr -> Int -> IO (Ptr DevAddr)
forall b. Ptr b -> Int -> IO (Ptr DevAddr)
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr DevAddr
hsc_ptr Int
0)) Ptr DevAddr
abuf
{-# LINE 399 "Network/Pcap/Base.hsc" #-}
[PcapAddr]
as <- Ptr DevAddr -> IO [PcapAddr]
addrs2list Ptr DevAddr
nextaddr
PcapAddr
a <- Ptr DevAddr -> IO PcapAddr
oneAddr Ptr DevAddr
abuf
[PcapAddr] -> IO [PcapAddr]
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (PcapAddr
a PcapAddr -> [PcapAddr] -> [PcapAddr]
forall a. a -> [a] -> [a]
: [PcapAddr]
as)
oneAddr :: Ptr DevAddr -> IO PcapAddr
oneAddr :: Ptr DevAddr -> IO PcapAddr
oneAddr Ptr DevAddr
abuf =
let socka :: Ptr a -> IO (Maybe SockAddr)
socka :: forall a. Ptr a -> IO (Maybe SockAddr)
socka Ptr a
sa | Ptr a
sa Ptr a -> Ptr a -> Bool
forall a. Eq a => a -> a -> Bool
== Ptr a
forall a. Ptr a
nullPtr = Maybe SockAddr -> IO (Maybe SockAddr)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe SockAddr
forall a. Maybe a
Nothing
| Bool
otherwise = do
{-# LINE 411 "Network/Pcap/Base.hsc" #-}
CUChar
l <- CUChar -> IO CUChar
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ((CUChar
16)) :: IO CUChar
{-# LINE 412 "Network/Pcap/Base.hsc" #-}
{-# LINE 413 "Network/Pcap/Base.hsc" #-}
CUChar
f <- (((\Ptr a
hsc_ptr -> Ptr a -> Int -> IO CUChar
forall b. Ptr b -> Int -> IO CUChar
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr a
hsc_ptr Int
0)) Ptr a
sa) :: IO CUChar
{-# LINE 414 "Network/Pcap/Base.hsc" #-}
let off :: Int
off = ((Int
2))
{-# LINE 416 "Network/Pcap/Base.hsc" #-}
nbytes :: Int
nbytes = ((CUChar -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral CUChar
l) Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
off)
ByteString
addr <- Int -> (Ptr Word8 -> IO ()) -> IO ByteString
B.create Int
nbytes ((Ptr Word8 -> IO ()) -> IO ByteString)
-> (Ptr Word8 -> IO ()) -> IO ByteString
forall a b. (a -> b) -> a -> b
$ \Ptr Word8
p ->
Ptr Word8 -> Ptr Word8 -> Int -> IO ()
B.memcpy Ptr Word8
p (Ptr a -> Int -> Ptr Word8
forall a b. Ptr a -> Int -> Ptr b
plusPtr Ptr a
sa Int
off :: Ptr Word8)
(Int -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
nbytes)
Maybe SockAddr -> IO (Maybe SockAddr)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (SockAddr -> Maybe SockAddr
forall a. a -> Maybe a
Just (Family -> ByteString -> SockAddr
SockAddr (CInt -> Family
unpackFamily (CUChar -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral CUChar
f)) ByteString
addr))
in do
Maybe SockAddr
addr <- Ptr Any -> IO (Maybe SockAddr)
forall a. Ptr a -> IO (Maybe SockAddr)
socka (Ptr Any -> IO (Maybe SockAddr))
-> IO (Ptr Any) -> IO (Maybe SockAddr)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< ((\Ptr DevAddr
hsc_ptr -> Ptr DevAddr -> Int -> IO (Ptr Any)
forall b. Ptr b -> Int -> IO (Ptr Any)
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr DevAddr
hsc_ptr Int
4)) Ptr DevAddr
abuf
{-# LINE 424 "Network/Pcap/Base.hsc" #-}
Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Maybe SockAddr -> Bool
forall a. Maybe a -> Bool
isNothing Maybe SockAddr
addr) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
IOError -> IO ()
forall a. IOError -> IO a
ioError (IOError -> IO ()) -> IOError -> IO ()
forall a b. (a -> b) -> a -> b
$ String -> IOError
userError String
"Pcap.oneAddr: null address"
Maybe SockAddr
mask <- Ptr Any -> IO (Maybe SockAddr)
forall a. Ptr a -> IO (Maybe SockAddr)
socka (Ptr Any -> IO (Maybe SockAddr))
-> IO (Ptr Any) -> IO (Maybe SockAddr)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< ((\Ptr DevAddr
hsc_ptr -> Ptr DevAddr -> Int -> IO (Ptr Any)
forall b. Ptr b -> Int -> IO (Ptr Any)
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr DevAddr
hsc_ptr Int
8)) Ptr DevAddr
abuf
{-# LINE 429 "Network/Pcap/Base.hsc" #-}
bcast <- socka =<< ((\hsc_ptr -> peekByteOff hsc_ptr 12)) abuf
{-# LINE 430 "Network/Pcap/Base.hsc" #-}
peer <- socka =<< ((\hsc_ptr -> peekByteOff hsc_ptr 16)) abuf
{-# LINE 431 "Network/Pcap/Base.hsc" #-}
PcapAddr -> IO PcapAddr
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return PcapAddr { addrSA :: SockAddr
addrSA = Maybe SockAddr -> SockAddr
forall a. HasCallStack => Maybe a -> a
fromJust Maybe SockAddr
addr
, addrMask :: Maybe SockAddr
addrMask = Maybe SockAddr
mask
, addrBcast :: Maybe SockAddr
addrBcast = Maybe SockAddr
bcast
, addrPeer :: Maybe SockAddr
addrPeer = Maybe SockAddr
peer
}
lookupNet :: String
-> IO Network
lookupNet :: String -> IO Network
lookupNet String
dev = String -> (CString -> IO Network) -> IO Network
forall a. String -> (CString -> IO a) -> IO a
withCString String
dev ((CString -> IO Network) -> IO Network)
-> (CString -> IO Network) -> IO Network
forall a b. (a -> b) -> a -> b
$ \CString
name ->
(Ptr CUInt -> IO Network) -> IO Network
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr CUInt -> IO Network) -> IO Network)
-> (Ptr CUInt -> IO Network) -> IO Network
forall a b. (a -> b) -> a -> b
$ \Ptr CUInt
netp -> (Ptr CUInt -> IO Network) -> IO Network
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr CUInt -> IO Network) -> IO Network)
-> (Ptr CUInt -> IO Network) -> IO Network
forall a b. (a -> b) -> a -> b
$ \Ptr CUInt
maskp -> do
(CInt -> Bool) -> (CString -> IO CInt) -> IO ()
forall a. (a -> Bool) -> (CString -> IO a) -> IO ()
withErrBuf_ (CInt -> CInt -> Bool
forall a. Eq a => a -> a -> Bool
== -CInt
1) (CString -> Ptr CUInt -> Ptr CUInt -> CString -> IO CInt
pcap_lookupnet CString
name Ptr CUInt
netp Ptr CUInt
maskp)
CUInt
net <- Ptr CUInt -> IO CUInt
forall a. Storable a => Ptr a -> IO a
peek Ptr CUInt
netp
CUInt
mask <- Ptr CUInt -> IO CUInt
forall a. Storable a => Ptr a -> IO a
peek Ptr CUInt
maskp
Network -> IO Network
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Network { netAddr :: Word32
netAddr = CUInt -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral CUInt
net
, netMask :: Word32
netMask = CUInt -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral CUInt
mask
}
foreign import ccall unsafe pcap_lookupdev
:: CString -> IO CString
foreign import ccall unsafe pcap_findalldevs
:: Ptr (Ptr DevBuf) -> ErrBuf -> IO CInt
foreign import ccall unsafe pcap_freealldevs
:: Ptr DevBuf -> IO ()
foreign import ccall unsafe pcap_lookupnet
:: CString -> Ptr CUInt -> Ptr CUInt -> ErrBuf -> IO CInt
setNonBlock :: Ptr PcapTag -> Bool -> IO ()
setNonBlock :: Ptr PcapTag -> Bool -> IO ()
setNonBlock Ptr PcapTag
hdl Bool
block =
(CInt -> Bool) -> (CString -> IO CInt) -> IO ()
forall a. (a -> Bool) -> (CString -> IO a) -> IO ()
withErrBuf_ (CInt -> CInt -> Bool
forall a. Eq a => a -> a -> Bool
== -CInt
1) (Ptr PcapTag -> CInt -> CString -> IO CInt
pcap_setnonblock Ptr PcapTag
hdl (Bool -> CInt
forall a. Num a => Bool -> a
fromBool Bool
block))
getNonBlock :: Ptr PcapTag -> IO Bool
getNonBlock :: Ptr PcapTag -> IO Bool
getNonBlock Ptr PcapTag
hdl = CInt -> Bool
forall a. (Eq a, Num a) => a -> Bool
toBool (CInt -> Bool) -> IO CInt -> IO Bool
forall a b. (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` (CInt -> Bool) -> (CString -> IO CInt) -> IO CInt
forall a. (a -> Bool) -> (CString -> IO a) -> IO a
withErrBuf (CInt -> CInt -> Bool
forall a. Eq a => a -> a -> Bool
== -CInt
1) (Ptr PcapTag -> CString -> IO CInt
pcap_getnonblock Ptr PcapTag
hdl)
data Direction = InOut
| In
| Out
deriving (Direction -> Direction -> Bool
(Direction -> Direction -> Bool)
-> (Direction -> Direction -> Bool) -> Eq Direction
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Direction -> Direction -> Bool
== :: Direction -> Direction -> Bool
$c/= :: Direction -> Direction -> Bool
/= :: Direction -> Direction -> Bool
Eq, Int -> Direction -> ShowS
[Direction] -> ShowS
Direction -> String
(Int -> Direction -> ShowS)
-> (Direction -> String)
-> ([Direction] -> ShowS)
-> Show Direction
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Direction -> ShowS
showsPrec :: Int -> Direction -> ShowS
$cshow :: Direction -> String
show :: Direction -> String
$cshowList :: [Direction] -> ShowS
showList :: [Direction] -> ShowS
Show, ReadPrec [Direction]
ReadPrec Direction
Int -> ReadS Direction
ReadS [Direction]
(Int -> ReadS Direction)
-> ReadS [Direction]
-> ReadPrec Direction
-> ReadPrec [Direction]
-> Read Direction
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS Direction
readsPrec :: Int -> ReadS Direction
$creadList :: ReadS [Direction]
readList :: ReadS [Direction]
$creadPrec :: ReadPrec Direction
readPrec :: ReadPrec Direction
$creadListPrec :: ReadPrec [Direction]
readListPrec :: ReadPrec [Direction]
Read)
setDirection :: Ptr PcapTag -> Direction -> IO ()
setDirection :: Ptr PcapTag -> Direction -> IO ()
setDirection Ptr PcapTag
hdl Direction
dir =
Ptr PcapTag -> CInt -> IO CInt
pcap_setdirection Ptr PcapTag
hdl (Direction -> CInt
packDirection Direction
dir) IO CInt -> (CInt -> IO ()) -> IO ()
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Ptr PcapTag -> (CInt -> Bool) -> CInt -> IO ()
forall a. Ptr PcapTag -> (a -> Bool) -> a -> IO ()
throwPcapIf_ Ptr PcapTag
hdl (CInt -> CInt -> Bool
forall a. Eq a => a -> a -> Bool
== -CInt
1)
packDirection :: Direction -> CInt
packDirection :: Direction -> CInt
packDirection Direction
In = (CInt
1)
{-# LINE 498 "Network/Pcap/Base.hsc" #-}
packDirection Out = (2)
{-# LINE 499 "Network/Pcap/Base.hsc" #-}
packDirection InOut = (0)
{-# LINE 500 "Network/Pcap/Base.hsc" #-}
foreign import ccall unsafe pcap_setnonblock
:: Ptr PcapTag -> CInt -> ErrBuf -> IO CInt
foreign import ccall unsafe pcap_getnonblock
:: Ptr PcapTag -> ErrBuf -> IO CInt
foreign import ccall unsafe pcap_setdirection
:: Ptr PcapTag -> CInt -> IO CInt
throwPcapIf :: Ptr PcapTag -> (a -> Bool) -> a -> IO a
throwPcapIf :: forall a. Ptr PcapTag -> (a -> Bool) -> a -> IO a
throwPcapIf Ptr PcapTag
hdl a -> Bool
p a
v = if a -> Bool
p a
v
then Ptr PcapTag -> IO CString
pcap_geterr Ptr PcapTag
hdl IO CString -> (CString -> IO String) -> IO String
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= CString -> IO String
peekCString IO String -> (String -> IO a) -> IO a
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= IOError -> IO a
forall a. IOError -> IO a
ioError (IOError -> IO a) -> (String -> IOError) -> String -> IO a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> IOError
userError
else a -> IO a
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return a
v
throwPcapIf_ :: Ptr PcapTag -> (a -> Bool) -> a -> IO ()
throwPcapIf_ :: forall a. Ptr PcapTag -> (a -> Bool) -> a -> IO ()
throwPcapIf_ Ptr PcapTag
hdl a -> Bool
p a
v = Ptr PcapTag -> (a -> Bool) -> a -> IO a
forall a. Ptr PcapTag -> (a -> Bool) -> a -> IO a
throwPcapIf Ptr PcapTag
hdl a -> Bool
p a
v IO a -> IO () -> IO ()
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
foreign import ccall unsafe pcap_geterr
:: Ptr PcapTag -> IO CString
sendPacket :: Ptr PcapTag
-> Ptr Word8
-> Int
-> IO ()
sendPacket :: Ptr PcapTag -> Ptr Word8 -> Int -> IO ()
sendPacket Ptr PcapTag
hdl Ptr Word8
buf Int
size =
Ptr PcapTag -> Ptr Word8 -> CInt -> IO CInt
pcap_sendpacket Ptr PcapTag
hdl Ptr Word8
buf (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
size) IO CInt -> (CInt -> IO ()) -> IO ()
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Ptr PcapTag -> (CInt -> Bool) -> CInt -> IO ()
forall a. Ptr PcapTag -> (a -> Bool) -> a -> IO ()
throwPcapIf_ Ptr PcapTag
hdl (CInt -> CInt -> Bool
forall a. Eq a => a -> a -> Bool
== -CInt
1)
foreign import ccall unsafe pcap_sendpacket
:: Ptr PcapTag -> Ptr Word8 -> CInt -> IO CInt
type Callback = PktHdr -> Ptr Word8 -> IO ()
type CCallback = Ptr Word8 -> Ptr PktHdr -> Ptr Word8 -> IO ()
toPktHdr :: Ptr PktHdr -> IO PktHdr
toPktHdr :: Ptr PktHdr -> IO PktHdr
toPktHdr Ptr PktHdr
hdr = do
let ts :: Ptr b
ts = ((\Ptr PktHdr
hsc_ptr -> Ptr PktHdr
hsc_ptr Ptr PktHdr -> Int -> Ptr b
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0)) Ptr PktHdr
hdr
{-# LINE 541 "Network/Pcap/Base.hsc" #-}
CLong
s <- ((\Ptr Any
hsc_ptr -> Ptr Any -> Int -> IO CLong
forall b. Ptr b -> Int -> IO CLong
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr Any
hsc_ptr Int
0)) Ptr Any
forall a. Ptr a
ts
{-# LINE 543 "Network/Pcap/Base.hsc" #-}
us <- ((\hsc_ptr -> peekByteOff hsc_ptr 4)) ts
{-# LINE 544 "Network/Pcap/Base.hsc" #-}
caplen <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) hdr
{-# LINE 545 "Network/Pcap/Base.hsc" #-}
len <- ((\hsc_ptr -> peekByteOff hsc_ptr 12)) hdr
{-# LINE 546 "Network/Pcap/Base.hsc" #-}
PktHdr -> IO PktHdr
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return PktHdr { hdrSeconds :: Word32
hdrSeconds = CLong -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CLong
s :: CLong)
, hdrUseconds :: Word32
hdrUseconds = CLong -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CLong
us :: CLong)
, hdrCaptureLength :: Word32
hdrCaptureLength = CUInt -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CUInt
caplen :: CUInt)
, hdrWireLength :: Word32
hdrWireLength = CUInt -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CUInt
len :: CUInt)
}
exportCallback :: Callback -> IO (FunPtr CCallback)
exportCallback :: Callback -> IO (FunPtr CCallback)
exportCallback Callback
f = CCallback -> IO (FunPtr CCallback)
exportCCallback (CCallback -> IO (FunPtr CCallback))
-> CCallback -> IO (FunPtr CCallback)
forall a b. (a -> b) -> a -> b
$ \Ptr Word8
_user Ptr PktHdr
chdr Ptr Word8
ptr -> do
PktHdr
hdr <- Ptr PktHdr -> IO PktHdr
toPktHdr Ptr PktHdr
chdr
Callback
f PktHdr
hdr Ptr Word8
ptr
dispatch :: Ptr PcapTag
-> Int
-> Callback
-> IO Int
dispatch :: Ptr PcapTag -> Int -> Callback -> IO Int
dispatch Ptr PcapTag
hdl Int
count Callback
f = do
FunPtr CCallback
handler <- Callback -> IO (FunPtr CCallback)
exportCallback Callback
f
CInt
result <- Ptr PcapTag -> CInt -> FunPtr CCallback -> Ptr Word8 -> IO CInt
pcap_dispatch Ptr PcapTag
hdl (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
count) FunPtr CCallback
handler Ptr Word8
forall a. Ptr a
nullPtr
FunPtr CCallback -> IO ()
forall a. FunPtr a -> IO ()
freeHaskellFunPtr FunPtr CCallback
handler
CInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CInt -> Int) -> IO CInt -> IO Int
forall a b. (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` Ptr PcapTag -> (CInt -> Bool) -> CInt -> IO CInt
forall a. Ptr PcapTag -> (a -> Bool) -> a -> IO a
throwPcapIf Ptr PcapTag
hdl (CInt -> CInt -> Bool
forall a. Eq a => a -> a -> Bool
== -CInt
1) CInt
result
loop :: Ptr PcapTag
-> Int
-> Callback
-> IO Int
loop :: Ptr PcapTag -> Int -> Callback -> IO Int
loop Ptr PcapTag
hdl Int
count Callback
f = do
FunPtr CCallback
handler <- Callback -> IO (FunPtr CCallback)
exportCallback Callback
f
CInt
result <- Ptr PcapTag -> CInt -> FunPtr CCallback -> Ptr Word8 -> IO CInt
pcap_loop Ptr PcapTag
hdl (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
count) FunPtr CCallback
handler Ptr Word8
forall a. Ptr a
nullPtr
FunPtr CCallback -> IO ()
forall a. FunPtr a -> IO ()
freeHaskellFunPtr FunPtr CCallback
handler
CInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CInt -> Int) -> IO CInt -> IO Int
forall a b. (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` Ptr PcapTag -> (CInt -> Bool) -> CInt -> IO CInt
forall a. Ptr PcapTag -> (a -> Bool) -> a -> IO a
throwPcapIf Ptr PcapTag
hdl (CInt -> CInt -> Bool
forall a. Eq a => a -> a -> Bool
== -CInt
1) CInt
result
next :: Ptr PcapTag
-> IO (PktHdr, Ptr Word8)
next :: Ptr PcapTag -> IO (PktHdr, Ptr Word8)
next Ptr PcapTag
hdl =
Int
-> (Ptr PktHdr -> IO (PktHdr, Ptr Word8)) -> IO (PktHdr, Ptr Word8)
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes ((Int
16)) ((Ptr PktHdr -> IO (PktHdr, Ptr Word8)) -> IO (PktHdr, Ptr Word8))
-> (Ptr PktHdr -> IO (PktHdr, Ptr Word8)) -> IO (PktHdr, Ptr Word8)
forall a b. (a -> b) -> a -> b
$ \Ptr PktHdr
chdr -> do
{-# LINE 607 "Network/Pcap/Base.hsc" #-}
ptr <- pcap_next hdl chdr
if (ptr == nullPtr)
then return (PktHdr 0 0 0 0, ptr)
else do
hdr <- toPktHdr chdr
return (hdr, ptr)
dump :: Ptr PcapDumpTag
-> Ptr PktHdr
-> Ptr Word8
-> IO ()
dump :: Ptr PcapDumpTag -> Ptr PktHdr -> Ptr Word8 -> IO ()
dump Ptr PcapDumpTag
hdl Ptr PktHdr
hdr Ptr Word8
pkt = Ptr PcapDumpTag -> Ptr PktHdr -> Ptr Word8 -> IO ()
pcap_dump Ptr PcapDumpTag
hdl Ptr PktHdr
hdr Ptr Word8
pkt
foreign import ccall "wrapper" exportCCallback
:: CCallback -> IO (FunPtr CCallback)
foreign import ccall pcap_dispatch
:: Ptr PcapTag -> CInt -> FunPtr CCallback -> Ptr Word8 -> IO CInt
foreign import ccall pcap_loop
:: Ptr PcapTag -> CInt -> FunPtr CCallback -> Ptr Word8 -> IO CInt
foreign import ccall pcap_next
:: Ptr PcapTag -> Ptr PktHdr -> IO (Ptr Word8)
foreign import ccall pcap_dump
:: Ptr PcapDumpTag -> Ptr PktHdr -> Ptr Word8 -> IO ()
datalink :: Ptr PcapTag -> IO Link
datalink :: Ptr PcapTag -> IO Link
datalink Ptr PcapTag
hdl = CInt -> Link
unpackLink (CInt -> Link) -> IO CInt -> IO Link
forall a b. (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` Ptr PcapTag -> IO CInt
pcap_datalink Ptr PcapTag
hdl
setDatalink :: Ptr PcapTag -> Link -> IO ()
setDatalink :: Ptr PcapTag -> Link -> IO ()
setDatalink Ptr PcapTag
hdl Link
link =
Ptr PcapTag -> CInt -> IO CInt
pcap_set_datalink Ptr PcapTag
hdl (Link -> CInt
packLink Link
link) IO CInt -> (CInt -> IO ()) -> IO ()
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Ptr PcapTag -> (CInt -> Bool) -> CInt -> IO ()
forall a. Ptr PcapTag -> (a -> Bool) -> a -> IO ()
throwPcapIf_ Ptr PcapTag
hdl (CInt -> CInt -> Bool
forall a. Eq a => a -> a -> Bool
== -CInt
1)
listDatalinks :: Ptr PcapTag -> IO [Link]
listDatalinks :: Ptr PcapTag -> IO [Link]
listDatalinks Ptr PcapTag
hdl =
(Ptr (Ptr CInt) -> IO [Link]) -> IO [Link]
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr (Ptr CInt) -> IO [Link]) -> IO [Link])
-> (Ptr (Ptr CInt) -> IO [Link]) -> IO [Link]
forall a b. (a -> b) -> a -> b
$ \Ptr (Ptr CInt)
lptr -> do
CInt
ret <- Ptr PcapTag -> Ptr (Ptr CInt) -> IO CInt
pcap_list_datalinks Ptr PcapTag
hdl Ptr (Ptr CInt)
lptr IO CInt -> (CInt -> IO CInt) -> IO CInt
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Ptr PcapTag -> (CInt -> Bool) -> CInt -> IO CInt
forall a. Ptr PcapTag -> (a -> Bool) -> a -> IO a
throwPcapIf Ptr PcapTag
hdl (CInt -> CInt -> Bool
forall a. Eq a => a -> a -> Bool
== -CInt
1)
Ptr CInt
dlbuf <- Ptr (Ptr CInt) -> IO (Ptr CInt)
forall a. Storable a => Ptr a -> IO a
peek Ptr (Ptr CInt)
lptr
[CInt]
dls <- Int -> Ptr CInt -> IO [CInt]
forall a. Storable a => Int -> Ptr a -> IO [a]
peekArray (CInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CInt
ret :: CInt)) Ptr CInt
dlbuf
Ptr CInt -> IO ()
forall a. Ptr a -> IO ()
free Ptr CInt
dlbuf
[Link] -> IO [Link]
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ((CInt -> Link) -> [CInt] -> [Link]
forall a b. (a -> b) -> [a] -> [b]
map CInt -> Link
unpackLink [CInt]
dls)
foreign import ccall unsafe pcap_datalink
:: Ptr PcapTag -> IO CInt
foreign import ccall unsafe pcap_set_datalink
:: Ptr PcapTag -> CInt -> IO CInt
foreign import ccall unsafe pcap_list_datalinks
:: Ptr PcapTag -> Ptr (Ptr CInt) -> IO CInt
statistics :: Ptr PcapTag -> IO Statistics
statistics :: Ptr PcapTag -> IO Statistics
statistics Ptr PcapTag
hdl =
Int -> (Ptr Statistics -> IO Statistics) -> IO Statistics
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes ((Int
12)) ((Ptr Statistics -> IO Statistics) -> IO Statistics)
-> (Ptr Statistics -> IO Statistics) -> IO Statistics
forall a b. (a -> b) -> a -> b
$ \Ptr Statistics
stats -> do
{-# LINE 681 "Network/Pcap/Base.hsc" #-}
pcap_stats hdl stats >>= throwPcapIf_ hdl (== -1)
recv <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) stats
{-# LINE 683 "Network/Pcap/Base.hsc" #-}
pdrop <- ((\hsc_ptr -> peekByteOff hsc_ptr 4)) stats
{-# LINE 684 "Network/Pcap/Base.hsc" #-}
ifdrop <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) stats
{-# LINE 685 "Network/Pcap/Base.hsc" #-}
return Statistics { statReceived = fromIntegral (recv :: CUInt)
, statDropped = fromIntegral (pdrop :: CUInt)
, statIfaceDropped = fromIntegral (ifdrop :: CUInt)
}
foreign import ccall unsafe pcap_stats
:: Ptr PcapTag -> Ptr Statistics -> IO Int
version :: Ptr PcapTag -> IO (Int, Int)
version :: Ptr PcapTag -> IO (Int, Int)
version Ptr PcapTag
hdl = do
CInt
major <- Ptr PcapTag -> IO CInt
pcap_major_version Ptr PcapTag
hdl
CInt
minor <- Ptr PcapTag -> IO CInt
pcap_minor_version Ptr PcapTag
hdl
(Int, Int) -> IO (Int, Int)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (CInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral CInt
major, CInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral CInt
minor)
isSwapped :: Ptr PcapTag -> IO Bool
isSwapped :: Ptr PcapTag -> IO Bool
isSwapped Ptr PcapTag
hdl = CInt -> Bool
forall a. (Eq a, Num a) => a -> Bool
toBool (CInt -> Bool) -> IO CInt -> IO Bool
forall a b. (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` Ptr PcapTag -> IO CInt
pcap_is_swapped Ptr PcapTag
hdl
snapshotLen :: Ptr PcapTag -> IO Int
snapshotLen :: Ptr PcapTag -> IO Int
snapshotLen Ptr PcapTag
hdl = CInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CInt -> Int) -> IO CInt -> IO Int
forall a b. (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` Ptr PcapTag -> IO CInt
pcap_snapshot Ptr PcapTag
hdl
foreign import ccall pcap_major_version
:: Ptr PcapTag -> IO CInt
foreign import ccall pcap_minor_version
:: Ptr PcapTag -> IO CInt
foreign import ccall pcap_is_swapped
:: Ptr PcapTag -> IO CInt
foreign import ccall pcap_snapshot
:: Ptr PcapTag -> IO CInt
data Link
= DLT_NULL
| DLT_UNKNOWN Int
{-# LINE 733 "Network/Pcap/Base.hsc" #-}
| DLT_EN10MB
{-# LINE 735 "Network/Pcap/Base.hsc" #-}
{-# LINE 736 "Network/Pcap/Base.hsc" #-}
| DLT_EN3MB
{-# LINE 738 "Network/Pcap/Base.hsc" #-}
{-# LINE 739 "Network/Pcap/Base.hsc" #-}
| DLT_AX25
{-# LINE 741 "Network/Pcap/Base.hsc" #-}
{-# LINE 742 "Network/Pcap/Base.hsc" #-}
| DLT_PRONET
{-# LINE 744 "Network/Pcap/Base.hsc" #-}
{-# LINE 745 "Network/Pcap/Base.hsc" #-}
| DLT_CHAOS
{-# LINE 747 "Network/Pcap/Base.hsc" #-}
{-# LINE 748 "Network/Pcap/Base.hsc" #-}
| DLT_IEEE802
{-# LINE 750 "Network/Pcap/Base.hsc" #-}
{-# LINE 751 "Network/Pcap/Base.hsc" #-}
| DLT_ARCNET
{-# LINE 753 "Network/Pcap/Base.hsc" #-}
{-# LINE 754 "Network/Pcap/Base.hsc" #-}
| DLT_SLIP
{-# LINE 756 "Network/Pcap/Base.hsc" #-}
{-# LINE 757 "Network/Pcap/Base.hsc" #-}
| DLT_PPP
{-# LINE 759 "Network/Pcap/Base.hsc" #-}
{-# LINE 760 "Network/Pcap/Base.hsc" #-}
| DLT_FDDI
{-# LINE 762 "Network/Pcap/Base.hsc" #-}
{-# LINE 763 "Network/Pcap/Base.hsc" #-}
| DLT_ATM_RFC1483
{-# LINE 765 "Network/Pcap/Base.hsc" #-}
{-# LINE 766 "Network/Pcap/Base.hsc" #-}
| DLT_RAW
{-# LINE 768 "Network/Pcap/Base.hsc" #-}
{-# LINE 769 "Network/Pcap/Base.hsc" #-}
| DLT_SLIP_BSDOS
{-# LINE 771 "Network/Pcap/Base.hsc" #-}
{-# LINE 772 "Network/Pcap/Base.hsc" #-}
| DLT_PPP_BSDOS
{-# LINE 774 "Network/Pcap/Base.hsc" #-}
{-# LINE 775 "Network/Pcap/Base.hsc" #-}
| DLT_ATM_CLIP
{-# LINE 777 "Network/Pcap/Base.hsc" #-}
{-# LINE 778 "Network/Pcap/Base.hsc" #-}
| DLT_REDBACK_SMARTEDGE
{-# LINE 780 "Network/Pcap/Base.hsc" #-}
{-# LINE 781 "Network/Pcap/Base.hsc" #-}
| DLT_PPP_SERIAL
{-# LINE 783 "Network/Pcap/Base.hsc" #-}
{-# LINE 784 "Network/Pcap/Base.hsc" #-}
| DLT_PPP_ETHER
{-# LINE 786 "Network/Pcap/Base.hsc" #-}
{-# LINE 787 "Network/Pcap/Base.hsc" #-}
| DLT_SYMANTEC_FIREWALL
{-# LINE 789 "Network/Pcap/Base.hsc" #-}
{-# LINE 790 "Network/Pcap/Base.hsc" #-}
| DLT_C_HDLC
{-# LINE 792 "Network/Pcap/Base.hsc" #-}
{-# LINE 793 "Network/Pcap/Base.hsc" #-}
| DLT_IEEE802_11
{-# LINE 795 "Network/Pcap/Base.hsc" #-}
{-# LINE 796 "Network/Pcap/Base.hsc" #-}
| DLT_FRELAY
{-# LINE 798 "Network/Pcap/Base.hsc" #-}
{-# LINE 799 "Network/Pcap/Base.hsc" #-}
| DLT_LOOP
{-# LINE 801 "Network/Pcap/Base.hsc" #-}
{-# LINE 802 "Network/Pcap/Base.hsc" #-}
| DLT_ENC
{-# LINE 804 "Network/Pcap/Base.hsc" #-}
{-# LINE 805 "Network/Pcap/Base.hsc" #-}
| DLT_LINUX_SLL
{-# LINE 807 "Network/Pcap/Base.hsc" #-}
{-# LINE 808 "Network/Pcap/Base.hsc" #-}
| DLT_LTALK
{-# LINE 810 "Network/Pcap/Base.hsc" #-}
{-# LINE 811 "Network/Pcap/Base.hsc" #-}
| DLT_ECONET
{-# LINE 813 "Network/Pcap/Base.hsc" #-}
{-# LINE 814 "Network/Pcap/Base.hsc" #-}
| DLT_IPFILTER
{-# LINE 816 "Network/Pcap/Base.hsc" #-}
{-# LINE 817 "Network/Pcap/Base.hsc" #-}
| DLT_PFLOG
{-# LINE 819 "Network/Pcap/Base.hsc" #-}
{-# LINE 820 "Network/Pcap/Base.hsc" #-}
| DLT_CISCO_IOS
{-# LINE 822 "Network/Pcap/Base.hsc" #-}
{-# LINE 823 "Network/Pcap/Base.hsc" #-}
| DLT_PRISM_HEADER
{-# LINE 825 "Network/Pcap/Base.hsc" #-}
{-# LINE 826 "Network/Pcap/Base.hsc" #-}
| DLT_AIRONET_HEADER
{-# LINE 828 "Network/Pcap/Base.hsc" #-}
{-# LINE 829 "Network/Pcap/Base.hsc" #-}
| DLT_HHDLC
{-# LINE 831 "Network/Pcap/Base.hsc" #-}
{-# LINE 832 "Network/Pcap/Base.hsc" #-}
| DLT_IP_OVER_FC
{-# LINE 834 "Network/Pcap/Base.hsc" #-}
{-# LINE 835 "Network/Pcap/Base.hsc" #-}
| DLT_SUNATM
{-# LINE 837 "Network/Pcap/Base.hsc" #-}
{-# LINE 838 "Network/Pcap/Base.hsc" #-}
| DLT_IEEE802_11_RADIO
{-# LINE 840 "Network/Pcap/Base.hsc" #-}
{-# LINE 841 "Network/Pcap/Base.hsc" #-}
| DLT_ARCNET_LINUX
{-# LINE 843 "Network/Pcap/Base.hsc" #-}
{-# LINE 844 "Network/Pcap/Base.hsc" #-}
| DLT_APPLE_IP_OVER_IEEE1394
{-# LINE 846 "Network/Pcap/Base.hsc" #-}
{-# LINE 847 "Network/Pcap/Base.hsc" #-}
| DLT_MTP2_WITH_PHDR
{-# LINE 849 "Network/Pcap/Base.hsc" #-}
{-# LINE 850 "Network/Pcap/Base.hsc" #-}
| DLT_MTP2
{-# LINE 852 "Network/Pcap/Base.hsc" #-}
{-# LINE 853 "Network/Pcap/Base.hsc" #-}
| DLT_MTP3
{-# LINE 855 "Network/Pcap/Base.hsc" #-}
{-# LINE 856 "Network/Pcap/Base.hsc" #-}
| DLT_SCCP
{-# LINE 858 "Network/Pcap/Base.hsc" #-}
{-# LINE 859 "Network/Pcap/Base.hsc" #-}
| DLT_DOCSIS
{-# LINE 861 "Network/Pcap/Base.hsc" #-}
{-# LINE 862 "Network/Pcap/Base.hsc" #-}
| DLT_LINUX_IRDA
{-# LINE 864 "Network/Pcap/Base.hsc" #-}
{-# LINE 865 "Network/Pcap/Base.hsc" #-}
| DLT_USER0
{-# LINE 867 "Network/Pcap/Base.hsc" #-}
{-# LINE 868 "Network/Pcap/Base.hsc" #-}
| DLT_USER1
{-# LINE 870 "Network/Pcap/Base.hsc" #-}
{-# LINE 871 "Network/Pcap/Base.hsc" #-}
| DLT_USER2
{-# LINE 873 "Network/Pcap/Base.hsc" #-}
{-# LINE 874 "Network/Pcap/Base.hsc" #-}
| DLT_USER3
{-# LINE 876 "Network/Pcap/Base.hsc" #-}
{-# LINE 877 "Network/Pcap/Base.hsc" #-}
| DLT_USER4
{-# LINE 879 "Network/Pcap/Base.hsc" #-}
{-# LINE 880 "Network/Pcap/Base.hsc" #-}
| DLT_USER5
{-# LINE 882 "Network/Pcap/Base.hsc" #-}
{-# LINE 883 "Network/Pcap/Base.hsc" #-}
| DLT_USER6
{-# LINE 885 "Network/Pcap/Base.hsc" #-}
{-# LINE 886 "Network/Pcap/Base.hsc" #-}
| DLT_USER7
{-# LINE 888 "Network/Pcap/Base.hsc" #-}
{-# LINE 889 "Network/Pcap/Base.hsc" #-}
| DLT_USER8
{-# LINE 891 "Network/Pcap/Base.hsc" #-}
{-# LINE 892 "Network/Pcap/Base.hsc" #-}
| DLT_USER9
{-# LINE 894 "Network/Pcap/Base.hsc" #-}
{-# LINE 895 "Network/Pcap/Base.hsc" #-}
| DLT_USER10
{-# LINE 897 "Network/Pcap/Base.hsc" #-}
{-# LINE 898 "Network/Pcap/Base.hsc" #-}
| DLT_USER11
{-# LINE 900 "Network/Pcap/Base.hsc" #-}
{-# LINE 901 "Network/Pcap/Base.hsc" #-}
| DLT_USER12
{-# LINE 903 "Network/Pcap/Base.hsc" #-}
{-# LINE 904 "Network/Pcap/Base.hsc" #-}
| DLT_USER13
{-# LINE 906 "Network/Pcap/Base.hsc" #-}
{-# LINE 907 "Network/Pcap/Base.hsc" #-}
| DLT_USER14
{-# LINE 909 "Network/Pcap/Base.hsc" #-}
{-# LINE 910 "Network/Pcap/Base.hsc" #-}
| DLT_USER15
{-# LINE 912 "Network/Pcap/Base.hsc" #-}
{-# LINE 913 "Network/Pcap/Base.hsc" #-}
| DLT_PPP_PPPD
{-# LINE 915 "Network/Pcap/Base.hsc" #-}
{-# LINE 916 "Network/Pcap/Base.hsc" #-}
| DLT_GPRS_LLC
{-# LINE 918 "Network/Pcap/Base.hsc" #-}
{-# LINE 919 "Network/Pcap/Base.hsc" #-}
| DLT_GPF_T
{-# LINE 921 "Network/Pcap/Base.hsc" #-}
{-# LINE 922 "Network/Pcap/Base.hsc" #-}
| DLT_GPF_F
{-# LINE 924 "Network/Pcap/Base.hsc" #-}
{-# LINE 925 "Network/Pcap/Base.hsc" #-}
| DLT_LINUX_LAPD
{-# LINE 927 "Network/Pcap/Base.hsc" #-}
{-# LINE 928 "Network/Pcap/Base.hsc" #-}
| DLT_A429
{-# LINE 930 "Network/Pcap/Base.hsc" #-}
{-# LINE 931 "Network/Pcap/Base.hsc" #-}
| DLT_A653_ICM
{-# LINE 933 "Network/Pcap/Base.hsc" #-}
{-# LINE 934 "Network/Pcap/Base.hsc" #-}
| DLT_USB
{-# LINE 936 "Network/Pcap/Base.hsc" #-}
{-# LINE 937 "Network/Pcap/Base.hsc" #-}
| DLT_BLUETOOTH_HCI_H4
{-# LINE 939 "Network/Pcap/Base.hsc" #-}
{-# LINE 940 "Network/Pcap/Base.hsc" #-}
| DLT_MFR
{-# LINE 942 "Network/Pcap/Base.hsc" #-}
{-# LINE 943 "Network/Pcap/Base.hsc" #-}
| DLT_IEEE802_16_MAC_CPS
{-# LINE 945 "Network/Pcap/Base.hsc" #-}
{-# LINE 946 "Network/Pcap/Base.hsc" #-}
| DLT_USB_LINUX
{-# LINE 948 "Network/Pcap/Base.hsc" #-}
{-# LINE 949 "Network/Pcap/Base.hsc" #-}
| DLT_CAN20B
{-# LINE 951 "Network/Pcap/Base.hsc" #-}
{-# LINE 952 "Network/Pcap/Base.hsc" #-}
| DLT_IEEE802_15_4_LINUX
{-# LINE 954 "Network/Pcap/Base.hsc" #-}
{-# LINE 955 "Network/Pcap/Base.hsc" #-}
| DLT_PPI
{-# LINE 957 "Network/Pcap/Base.hsc" #-}
{-# LINE 958 "Network/Pcap/Base.hsc" #-}
| DLT_IEEE802_16_MAC_CPS_RADIO
{-# LINE 960 "Network/Pcap/Base.hsc" #-}
{-# LINE 961 "Network/Pcap/Base.hsc" #-}
| DLT_IEEE802_15_4
{-# LINE 963 "Network/Pcap/Base.hsc" #-}
{-# LINE 964 "Network/Pcap/Base.hsc" #-}
| DLT_PFSYNC
{-# LINE 966 "Network/Pcap/Base.hsc" #-}
deriving (Eq, Ord, Read, Show)
packLink :: Link -> CInt
packLink :: Link -> CInt
packLink Link
l = case Link
l of
{-# LINE 971 "Network/Pcap/Base.hsc" #-}
DLT_NULL -> 0
{-# LINE 972 "Network/Pcap/Base.hsc" #-}
{-# LINE 973 "Network/Pcap/Base.hsc" #-}
{-# LINE 974 "Network/Pcap/Base.hsc" #-}
DLT_EN10MB -> 1
{-# LINE 975 "Network/Pcap/Base.hsc" #-}
{-# LINE 976 "Network/Pcap/Base.hsc" #-}
{-# LINE 977 "Network/Pcap/Base.hsc" #-}
DLT_EN3MB -> 2
{-# LINE 978 "Network/Pcap/Base.hsc" #-}
{-# LINE 979 "Network/Pcap/Base.hsc" #-}
{-# LINE 980 "Network/Pcap/Base.hsc" #-}
DLT_AX25 -> 3
{-# LINE 981 "Network/Pcap/Base.hsc" #-}
{-# LINE 982 "Network/Pcap/Base.hsc" #-}
{-# LINE 983 "Network/Pcap/Base.hsc" #-}
DLT_PRONET -> 4
{-# LINE 984 "Network/Pcap/Base.hsc" #-}
{-# LINE 985 "Network/Pcap/Base.hsc" #-}
{-# LINE 986 "Network/Pcap/Base.hsc" #-}
DLT_CHAOS -> 5
{-# LINE 987 "Network/Pcap/Base.hsc" #-}
{-# LINE 988 "Network/Pcap/Base.hsc" #-}
{-# LINE 989 "Network/Pcap/Base.hsc" #-}
DLT_IEEE802 -> 6
{-# LINE 990 "Network/Pcap/Base.hsc" #-}
{-# LINE 991 "Network/Pcap/Base.hsc" #-}
{-# LINE 992 "Network/Pcap/Base.hsc" #-}
DLT_ARCNET -> 7
{-# LINE 993 "Network/Pcap/Base.hsc" #-}
{-# LINE 994 "Network/Pcap/Base.hsc" #-}
{-# LINE 995 "Network/Pcap/Base.hsc" #-}
DLT_SLIP -> 8
{-# LINE 996 "Network/Pcap/Base.hsc" #-}
{-# LINE 997 "Network/Pcap/Base.hsc" #-}
{-# LINE 998 "Network/Pcap/Base.hsc" #-}
DLT_PPP -> 9
{-# LINE 999 "Network/Pcap/Base.hsc" #-}
{-# LINE 1000 "Network/Pcap/Base.hsc" #-}
{-# LINE 1001 "Network/Pcap/Base.hsc" #-}
DLT_FDDI -> 10
{-# LINE 1002 "Network/Pcap/Base.hsc" #-}
{-# LINE 1003 "Network/Pcap/Base.hsc" #-}
{-# LINE 1004 "Network/Pcap/Base.hsc" #-}
DLT_ATM_RFC1483 -> 11
{-# LINE 1005 "Network/Pcap/Base.hsc" #-}
{-# LINE 1006 "Network/Pcap/Base.hsc" #-}
{-# LINE 1007 "Network/Pcap/Base.hsc" #-}
DLT_RAW -> 12
{-# LINE 1008 "Network/Pcap/Base.hsc" #-}
{-# LINE 1009 "Network/Pcap/Base.hsc" #-}
{-# LINE 1010 "Network/Pcap/Base.hsc" #-}
DLT_SLIP_BSDOS -> 15
{-# LINE 1011 "Network/Pcap/Base.hsc" #-}
{-# LINE 1012 "Network/Pcap/Base.hsc" #-}
{-# LINE 1013 "Network/Pcap/Base.hsc" #-}
DLT_PPP_BSDOS -> 16
{-# LINE 1014 "Network/Pcap/Base.hsc" #-}
{-# LINE 1015 "Network/Pcap/Base.hsc" #-}
{-# LINE 1016 "Network/Pcap/Base.hsc" #-}
DLT_ATM_CLIP -> 19
{-# LINE 1017 "Network/Pcap/Base.hsc" #-}
{-# LINE 1018 "Network/Pcap/Base.hsc" #-}
{-# LINE 1019 "Network/Pcap/Base.hsc" #-}
DLT_REDBACK_SMARTEDGE -> 32
{-# LINE 1020 "Network/Pcap/Base.hsc" #-}
{-# LINE 1021 "Network/Pcap/Base.hsc" #-}
{-# LINE 1022 "Network/Pcap/Base.hsc" #-}
DLT_PPP_SERIAL -> 50
{-# LINE 1023 "Network/Pcap/Base.hsc" #-}
{-# LINE 1024 "Network/Pcap/Base.hsc" #-}
{-# LINE 1025 "Network/Pcap/Base.hsc" #-}
DLT_PPP_ETHER -> 51
{-# LINE 1026 "Network/Pcap/Base.hsc" #-}
{-# LINE 1027 "Network/Pcap/Base.hsc" #-}
{-# LINE 1028 "Network/Pcap/Base.hsc" #-}
DLT_SYMANTEC_FIREWALL -> 99
{-# LINE 1029 "Network/Pcap/Base.hsc" #-}
{-# LINE 1030 "Network/Pcap/Base.hsc" #-}
{-# LINE 1031 "Network/Pcap/Base.hsc" #-}
DLT_C_HDLC -> 104
{-# LINE 1032 "Network/Pcap/Base.hsc" #-}
{-# LINE 1033 "Network/Pcap/Base.hsc" #-}
{-# LINE 1034 "Network/Pcap/Base.hsc" #-}
DLT_IEEE802_11 -> 105
{-# LINE 1035 "Network/Pcap/Base.hsc" #-}
{-# LINE 1036 "Network/Pcap/Base.hsc" #-}
{-# LINE 1037 "Network/Pcap/Base.hsc" #-}
DLT_FRELAY -> 107
{-# LINE 1038 "Network/Pcap/Base.hsc" #-}
{-# LINE 1039 "Network/Pcap/Base.hsc" #-}
{-# LINE 1040 "Network/Pcap/Base.hsc" #-}
DLT_LOOP -> 108
{-# LINE 1041 "Network/Pcap/Base.hsc" #-}
{-# LINE 1042 "Network/Pcap/Base.hsc" #-}
{-# LINE 1043 "Network/Pcap/Base.hsc" #-}
DLT_ENC -> 109
{-# LINE 1044 "Network/Pcap/Base.hsc" #-}
{-# LINE 1045 "Network/Pcap/Base.hsc" #-}
{-# LINE 1046 "Network/Pcap/Base.hsc" #-}
DLT_LINUX_SLL -> 113
{-# LINE 1047 "Network/Pcap/Base.hsc" #-}
{-# LINE 1048 "Network/Pcap/Base.hsc" #-}
{-# LINE 1049 "Network/Pcap/Base.hsc" #-}
DLT_LTALK -> 114
{-# LINE 1050 "Network/Pcap/Base.hsc" #-}
{-# LINE 1051 "Network/Pcap/Base.hsc" #-}
{-# LINE 1052 "Network/Pcap/Base.hsc" #-}
DLT_ECONET -> 115
{-# LINE 1053 "Network/Pcap/Base.hsc" #-}
{-# LINE 1054 "Network/Pcap/Base.hsc" #-}
{-# LINE 1055 "Network/Pcap/Base.hsc" #-}
DLT_IPFILTER -> 116
{-# LINE 1056 "Network/Pcap/Base.hsc" #-}
{-# LINE 1057 "Network/Pcap/Base.hsc" #-}
{-# LINE 1060 "Network/Pcap/Base.hsc" #-}
{-# LINE 1061 "Network/Pcap/Base.hsc" #-}
DLT_PFSYNC -> 246
{-# LINE 1062 "Network/Pcap/Base.hsc" #-}
{-# LINE 1063 "Network/Pcap/Base.hsc" #-}
{-# LINE 1064 "Network/Pcap/Base.hsc" #-}
DLT_PFLOG -> 117
{-# LINE 1065 "Network/Pcap/Base.hsc" #-}
{-# LINE 1066 "Network/Pcap/Base.hsc" #-}
{-# LINE 1067 "Network/Pcap/Base.hsc" #-}
DLT_CISCO_IOS -> 118
{-# LINE 1068 "Network/Pcap/Base.hsc" #-}
{-# LINE 1069 "Network/Pcap/Base.hsc" #-}
{-# LINE 1070 "Network/Pcap/Base.hsc" #-}
DLT_PRISM_HEADER -> 119
{-# LINE 1071 "Network/Pcap/Base.hsc" #-}
{-# LINE 1072 "Network/Pcap/Base.hsc" #-}
{-# LINE 1073 "Network/Pcap/Base.hsc" #-}
DLT_AIRONET_HEADER -> 120
{-# LINE 1074 "Network/Pcap/Base.hsc" #-}
{-# LINE 1075 "Network/Pcap/Base.hsc" #-}
{-# LINE 1076 "Network/Pcap/Base.hsc" #-}
DLT_HHDLC -> 121
{-# LINE 1077 "Network/Pcap/Base.hsc" #-}
{-# LINE 1078 "Network/Pcap/Base.hsc" #-}
{-# LINE 1079 "Network/Pcap/Base.hsc" #-}
DLT_IP_OVER_FC -> 122
{-# LINE 1080 "Network/Pcap/Base.hsc" #-}
{-# LINE 1081 "Network/Pcap/Base.hsc" #-}
{-# LINE 1082 "Network/Pcap/Base.hsc" #-}
DLT_SUNATM -> 123
{-# LINE 1083 "Network/Pcap/Base.hsc" #-}
{-# LINE 1084 "Network/Pcap/Base.hsc" #-}
{-# LINE 1085 "Network/Pcap/Base.hsc" #-}
DLT_IEEE802_11_RADIO -> 127
{-# LINE 1086 "Network/Pcap/Base.hsc" #-}
{-# LINE 1087 "Network/Pcap/Base.hsc" #-}
{-# LINE 1088 "Network/Pcap/Base.hsc" #-}
DLT_ARCNET_LINUX -> 129
{-# LINE 1089 "Network/Pcap/Base.hsc" #-}
{-# LINE 1090 "Network/Pcap/Base.hsc" #-}
{-# LINE 1091 "Network/Pcap/Base.hsc" #-}
DLT_APPLE_IP_OVER_IEEE1394 -> 138
{-# LINE 1092 "Network/Pcap/Base.hsc" #-}
{-# LINE 1093 "Network/Pcap/Base.hsc" #-}
{-# LINE 1094 "Network/Pcap/Base.hsc" #-}
DLT_MTP2_WITH_PHDR -> 139
{-# LINE 1095 "Network/Pcap/Base.hsc" #-}
{-# LINE 1096 "Network/Pcap/Base.hsc" #-}
{-# LINE 1097 "Network/Pcap/Base.hsc" #-}
DLT_MTP2 -> 140
{-# LINE 1098 "Network/Pcap/Base.hsc" #-}
{-# LINE 1099 "Network/Pcap/Base.hsc" #-}
{-# LINE 1100 "Network/Pcap/Base.hsc" #-}
DLT_MTP3 -> 141
{-# LINE 1101 "Network/Pcap/Base.hsc" #-}
{-# LINE 1102 "Network/Pcap/Base.hsc" #-}
{-# LINE 1103 "Network/Pcap/Base.hsc" #-}
DLT_SCCP -> 142
{-# LINE 1104 "Network/Pcap/Base.hsc" #-}
{-# LINE 1105 "Network/Pcap/Base.hsc" #-}
{-# LINE 1106 "Network/Pcap/Base.hsc" #-}
DLT_DOCSIS -> 143
{-# LINE 1107 "Network/Pcap/Base.hsc" #-}
{-# LINE 1108 "Network/Pcap/Base.hsc" #-}
{-# LINE 1109 "Network/Pcap/Base.hsc" #-}
DLT_LINUX_IRDA -> 144
{-# LINE 1110 "Network/Pcap/Base.hsc" #-}
{-# LINE 1111 "Network/Pcap/Base.hsc" #-}
{-# LINE 1112 "Network/Pcap/Base.hsc" #-}
DLT_USER0 -> 147
{-# LINE 1113 "Network/Pcap/Base.hsc" #-}
{-# LINE 1114 "Network/Pcap/Base.hsc" #-}
{-# LINE 1115 "Network/Pcap/Base.hsc" #-}
DLT_USER1 -> 148
{-# LINE 1116 "Network/Pcap/Base.hsc" #-}
{-# LINE 1117 "Network/Pcap/Base.hsc" #-}
{-# LINE 1118 "Network/Pcap/Base.hsc" #-}
DLT_USER2 -> 149
{-# LINE 1119 "Network/Pcap/Base.hsc" #-}
{-# LINE 1120 "Network/Pcap/Base.hsc" #-}
{-# LINE 1121 "Network/Pcap/Base.hsc" #-}
DLT_USER3 -> 150
{-# LINE 1122 "Network/Pcap/Base.hsc" #-}
{-# LINE 1123 "Network/Pcap/Base.hsc" #-}
{-# LINE 1124 "Network/Pcap/Base.hsc" #-}
DLT_USER4 -> 151
{-# LINE 1125 "Network/Pcap/Base.hsc" #-}
{-# LINE 1126 "Network/Pcap/Base.hsc" #-}
{-# LINE 1127 "Network/Pcap/Base.hsc" #-}
DLT_USER5 -> 152
{-# LINE 1128 "Network/Pcap/Base.hsc" #-}
{-# LINE 1129 "Network/Pcap/Base.hsc" #-}
{-# LINE 1130 "Network/Pcap/Base.hsc" #-}
DLT_USER6 -> 153
{-# LINE 1131 "Network/Pcap/Base.hsc" #-}
{-# LINE 1132 "Network/Pcap/Base.hsc" #-}
{-# LINE 1133 "Network/Pcap/Base.hsc" #-}
DLT_USER7 -> 154
{-# LINE 1134 "Network/Pcap/Base.hsc" #-}
{-# LINE 1135 "Network/Pcap/Base.hsc" #-}
{-# LINE 1136 "Network/Pcap/Base.hsc" #-}
DLT_USER8 -> 155
{-# LINE 1137 "Network/Pcap/Base.hsc" #-}
{-# LINE 1138 "Network/Pcap/Base.hsc" #-}
{-# LINE 1139 "Network/Pcap/Base.hsc" #-}
DLT_USER9 -> 156
{-# LINE 1140 "Network/Pcap/Base.hsc" #-}
{-# LINE 1141 "Network/Pcap/Base.hsc" #-}
{-# LINE 1142 "Network/Pcap/Base.hsc" #-}
DLT_USER10 -> 157
{-# LINE 1143 "Network/Pcap/Base.hsc" #-}
{-# LINE 1144 "Network/Pcap/Base.hsc" #-}
{-# LINE 1145 "Network/Pcap/Base.hsc" #-}
DLT_USER11 -> 158
{-# LINE 1146 "Network/Pcap/Base.hsc" #-}
{-# LINE 1147 "Network/Pcap/Base.hsc" #-}
{-# LINE 1148 "Network/Pcap/Base.hsc" #-}
DLT_USER12 -> 159
{-# LINE 1149 "Network/Pcap/Base.hsc" #-}
{-# LINE 1150 "Network/Pcap/Base.hsc" #-}
{-# LINE 1151 "Network/Pcap/Base.hsc" #-}
DLT_USER13 -> 160
{-# LINE 1152 "Network/Pcap/Base.hsc" #-}
{-# LINE 1153 "Network/Pcap/Base.hsc" #-}
{-# LINE 1154 "Network/Pcap/Base.hsc" #-}
DLT_USER14 -> 161
{-# LINE 1155 "Network/Pcap/Base.hsc" #-}
{-# LINE 1156 "Network/Pcap/Base.hsc" #-}
{-# LINE 1157 "Network/Pcap/Base.hsc" #-}
DLT_USER15 -> 162
{-# LINE 1158 "Network/Pcap/Base.hsc" #-}
{-# LINE 1159 "Network/Pcap/Base.hsc" #-}
{-# LINE 1160 "Network/Pcap/Base.hsc" #-}
DLT_PPP_PPPD -> 166
{-# LINE 1161 "Network/Pcap/Base.hsc" #-}
{-# LINE 1162 "Network/Pcap/Base.hsc" #-}
{-# LINE 1163 "Network/Pcap/Base.hsc" #-}
DLT_GPRS_LLC -> 169
{-# LINE 1164 "Network/Pcap/Base.hsc" #-}
{-# LINE 1165 "Network/Pcap/Base.hsc" #-}
{-# LINE 1166 "Network/Pcap/Base.hsc" #-}
DLT_GPF_T -> 170
{-# LINE 1167 "Network/Pcap/Base.hsc" #-}
{-# LINE 1168 "Network/Pcap/Base.hsc" #-}
{-# LINE 1169 "Network/Pcap/Base.hsc" #-}
DLT_GPF_F -> 171
{-# LINE 1170 "Network/Pcap/Base.hsc" #-}
{-# LINE 1171 "Network/Pcap/Base.hsc" #-}
{-# LINE 1172 "Network/Pcap/Base.hsc" #-}
DLT_LINUX_LAPD -> 177
{-# LINE 1173 "Network/Pcap/Base.hsc" #-}
{-# LINE 1174 "Network/Pcap/Base.hsc" #-}
{-# LINE 1175 "Network/Pcap/Base.hsc" #-}
DLT_MFR -> 182
{-# LINE 1176 "Network/Pcap/Base.hsc" #-}
{-# LINE 1177 "Network/Pcap/Base.hsc" #-}
{-# LINE 1178 "Network/Pcap/Base.hsc" #-}
DLT_A429 -> 184
{-# LINE 1179 "Network/Pcap/Base.hsc" #-}
{-# LINE 1180 "Network/Pcap/Base.hsc" #-}
{-# LINE 1181 "Network/Pcap/Base.hsc" #-}
DLT_A653_ICM -> 185
{-# LINE 1182 "Network/Pcap/Base.hsc" #-}
{-# LINE 1183 "Network/Pcap/Base.hsc" #-}
{-# LINE 1184 "Network/Pcap/Base.hsc" #-}
DLT_USB -> 186
{-# LINE 1185 "Network/Pcap/Base.hsc" #-}
{-# LINE 1186 "Network/Pcap/Base.hsc" #-}
{-# LINE 1187 "Network/Pcap/Base.hsc" #-}
DLT_BLUETOOTH_HCI_H4 -> 187
{-# LINE 1188 "Network/Pcap/Base.hsc" #-}
{-# LINE 1189 "Network/Pcap/Base.hsc" #-}
{-# LINE 1190 "Network/Pcap/Base.hsc" #-}
DLT_IEEE802_16_MAC_CPS -> 188
{-# LINE 1191 "Network/Pcap/Base.hsc" #-}
{-# LINE 1192 "Network/Pcap/Base.hsc" #-}
{-# LINE 1193 "Network/Pcap/Base.hsc" #-}
DLT_USB_LINUX -> 189
{-# LINE 1194 "Network/Pcap/Base.hsc" #-}
{-# LINE 1195 "Network/Pcap/Base.hsc" #-}
{-# LINE 1196 "Network/Pcap/Base.hsc" #-}
DLT_CAN20B -> 190
{-# LINE 1197 "Network/Pcap/Base.hsc" #-}
{-# LINE 1198 "Network/Pcap/Base.hsc" #-}
{-# LINE 1199 "Network/Pcap/Base.hsc" #-}
DLT_IEEE802_15_4_LINUX -> 191
{-# LINE 1200 "Network/Pcap/Base.hsc" #-}
{-# LINE 1201 "Network/Pcap/Base.hsc" #-}
{-# LINE 1202 "Network/Pcap/Base.hsc" #-}
DLT_PPI -> 192
{-# LINE 1203 "Network/Pcap/Base.hsc" #-}
{-# LINE 1204 "Network/Pcap/Base.hsc" #-}
{-# LINE 1205 "Network/Pcap/Base.hsc" #-}
DLT_IEEE802_16_MAC_CPS_RADIO -> 193
{-# LINE 1206 "Network/Pcap/Base.hsc" #-}
{-# LINE 1207 "Network/Pcap/Base.hsc" #-}
{-# LINE 1208 "Network/Pcap/Base.hsc" #-}
DLT_IEEE802_15_4 -> 195
{-# LINE 1209 "Network/Pcap/Base.hsc" #-}
{-# LINE 1210 "Network/Pcap/Base.hsc" #-}
{-# LINE 1211 "Network/Pcap/Base.hsc" #-}
DLT_UNKNOWN _ -> error "cannot pack unknown link type"
{-# LINE 1213 "Network/Pcap/Base.hsc" #-}
unpackLink :: CInt -> Link
unpackLink :: CInt -> Link
unpackLink CInt
l = case CInt
l of
{-# LINE 1217 "Network/Pcap/Base.hsc" #-}
(0) -> DLT_NULL
{-# LINE 1218 "Network/Pcap/Base.hsc" #-}
{-# LINE 1219 "Network/Pcap/Base.hsc" #-}
{-# LINE 1220 "Network/Pcap/Base.hsc" #-}
(1) -> DLT_EN10MB
{-# LINE 1221 "Network/Pcap/Base.hsc" #-}
{-# LINE 1222 "Network/Pcap/Base.hsc" #-}
{-# LINE 1223 "Network/Pcap/Base.hsc" #-}
(2) -> DLT_EN3MB
{-# LINE 1224 "Network/Pcap/Base.hsc" #-}
{-# LINE 1225 "Network/Pcap/Base.hsc" #-}
{-# LINE 1226 "Network/Pcap/Base.hsc" #-}
(3) -> DLT_AX25
{-# LINE 1227 "Network/Pcap/Base.hsc" #-}
{-# LINE 1228 "Network/Pcap/Base.hsc" #-}
{-# LINE 1229 "Network/Pcap/Base.hsc" #-}
(4) -> DLT_PRONET
{-# LINE 1230 "Network/Pcap/Base.hsc" #-}
{-# LINE 1231 "Network/Pcap/Base.hsc" #-}
{-# LINE 1232 "Network/Pcap/Base.hsc" #-}
(5) -> DLT_CHAOS
{-# LINE 1233 "Network/Pcap/Base.hsc" #-}
{-# LINE 1234 "Network/Pcap/Base.hsc" #-}
{-# LINE 1235 "Network/Pcap/Base.hsc" #-}
(6) -> DLT_IEEE802
{-# LINE 1236 "Network/Pcap/Base.hsc" #-}
{-# LINE 1237 "Network/Pcap/Base.hsc" #-}
{-# LINE 1238 "Network/Pcap/Base.hsc" #-}
(7) -> DLT_ARCNET
{-# LINE 1239 "Network/Pcap/Base.hsc" #-}
{-# LINE 1240 "Network/Pcap/Base.hsc" #-}
{-# LINE 1241 "Network/Pcap/Base.hsc" #-}
(8) -> DLT_SLIP
{-# LINE 1242 "Network/Pcap/Base.hsc" #-}
{-# LINE 1243 "Network/Pcap/Base.hsc" #-}
{-# LINE 1244 "Network/Pcap/Base.hsc" #-}
(9) -> DLT_PPP
{-# LINE 1245 "Network/Pcap/Base.hsc" #-}
{-# LINE 1246 "Network/Pcap/Base.hsc" #-}
{-# LINE 1247 "Network/Pcap/Base.hsc" #-}
(10) -> DLT_FDDI
{-# LINE 1248 "Network/Pcap/Base.hsc" #-}
{-# LINE 1249 "Network/Pcap/Base.hsc" #-}
{-# LINE 1250 "Network/Pcap/Base.hsc" #-}
(11) -> DLT_ATM_RFC1483
{-# LINE 1251 "Network/Pcap/Base.hsc" #-}
{-# LINE 1252 "Network/Pcap/Base.hsc" #-}
{-# LINE 1253 "Network/Pcap/Base.hsc" #-}
(12) -> DLT_RAW
{-# LINE 1254 "Network/Pcap/Base.hsc" #-}
{-# LINE 1255 "Network/Pcap/Base.hsc" #-}
{-# LINE 1256 "Network/Pcap/Base.hsc" #-}
(15) -> DLT_SLIP_BSDOS
{-# LINE 1257 "Network/Pcap/Base.hsc" #-}
{-# LINE 1258 "Network/Pcap/Base.hsc" #-}
{-# LINE 1259 "Network/Pcap/Base.hsc" #-}
(16) -> DLT_PPP_BSDOS
{-# LINE 1260 "Network/Pcap/Base.hsc" #-}
{-# LINE 1261 "Network/Pcap/Base.hsc" #-}
{-# LINE 1262 "Network/Pcap/Base.hsc" #-}
(19) -> DLT_ATM_CLIP
{-# LINE 1263 "Network/Pcap/Base.hsc" #-}
{-# LINE 1264 "Network/Pcap/Base.hsc" #-}
{-# LINE 1265 "Network/Pcap/Base.hsc" #-}
(32) -> DLT_REDBACK_SMARTEDGE
{-# LINE 1266 "Network/Pcap/Base.hsc" #-}
{-# LINE 1267 "Network/Pcap/Base.hsc" #-}
{-# LINE 1268 "Network/Pcap/Base.hsc" #-}
(50) -> DLT_PPP_SERIAL
{-# LINE 1269 "Network/Pcap/Base.hsc" #-}
{-# LINE 1270 "Network/Pcap/Base.hsc" #-}
{-# LINE 1271 "Network/Pcap/Base.hsc" #-}
(51) -> DLT_PPP_ETHER
{-# LINE 1272 "Network/Pcap/Base.hsc" #-}
{-# LINE 1273 "Network/Pcap/Base.hsc" #-}
{-# LINE 1274 "Network/Pcap/Base.hsc" #-}
(99) -> DLT_SYMANTEC_FIREWALL
{-# LINE 1275 "Network/Pcap/Base.hsc" #-}
{-# LINE 1276 "Network/Pcap/Base.hsc" #-}
{-# LINE 1277 "Network/Pcap/Base.hsc" #-}
(104) -> DLT_C_HDLC
{-# LINE 1278 "Network/Pcap/Base.hsc" #-}
{-# LINE 1279 "Network/Pcap/Base.hsc" #-}
{-# LINE 1280 "Network/Pcap/Base.hsc" #-}
(105) -> DLT_IEEE802_11
{-# LINE 1281 "Network/Pcap/Base.hsc" #-}
{-# LINE 1282 "Network/Pcap/Base.hsc" #-}
{-# LINE 1283 "Network/Pcap/Base.hsc" #-}
(107) -> DLT_FRELAY
{-# LINE 1284 "Network/Pcap/Base.hsc" #-}
{-# LINE 1285 "Network/Pcap/Base.hsc" #-}
{-# LINE 1286 "Network/Pcap/Base.hsc" #-}
(108) -> DLT_LOOP
{-# LINE 1287 "Network/Pcap/Base.hsc" #-}
{-# LINE 1288 "Network/Pcap/Base.hsc" #-}
{-# LINE 1289 "Network/Pcap/Base.hsc" #-}
(109) -> DLT_ENC
{-# LINE 1290 "Network/Pcap/Base.hsc" #-}
{-# LINE 1291 "Network/Pcap/Base.hsc" #-}
{-# LINE 1292 "Network/Pcap/Base.hsc" #-}
(113) -> DLT_LINUX_SLL
{-# LINE 1293 "Network/Pcap/Base.hsc" #-}
{-# LINE 1294 "Network/Pcap/Base.hsc" #-}
{-# LINE 1295 "Network/Pcap/Base.hsc" #-}
(114) -> DLT_LTALK
{-# LINE 1296 "Network/Pcap/Base.hsc" #-}
{-# LINE 1297 "Network/Pcap/Base.hsc" #-}
{-# LINE 1298 "Network/Pcap/Base.hsc" #-}
(115) -> DLT_ECONET
{-# LINE 1299 "Network/Pcap/Base.hsc" #-}
{-# LINE 1300 "Network/Pcap/Base.hsc" #-}
{-# LINE 1301 "Network/Pcap/Base.hsc" #-}
(116) -> DLT_IPFILTER
{-# LINE 1302 "Network/Pcap/Base.hsc" #-}
{-# LINE 1303 "Network/Pcap/Base.hsc" #-}
{-# LINE 1306 "Network/Pcap/Base.hsc" #-}
{-# LINE 1307 "Network/Pcap/Base.hsc" #-}
(246) -> DLT_PFSYNC
{-# LINE 1308 "Network/Pcap/Base.hsc" #-}
{-# LINE 1309 "Network/Pcap/Base.hsc" #-}
{-# LINE 1310 "Network/Pcap/Base.hsc" #-}
(117) -> DLT_PFLOG
{-# LINE 1311 "Network/Pcap/Base.hsc" #-}
{-# LINE 1312 "Network/Pcap/Base.hsc" #-}
{-# LINE 1313 "Network/Pcap/Base.hsc" #-}
(118) -> DLT_CISCO_IOS
{-# LINE 1314 "Network/Pcap/Base.hsc" #-}
{-# LINE 1315 "Network/Pcap/Base.hsc" #-}
{-# LINE 1316 "Network/Pcap/Base.hsc" #-}
(119) -> DLT_PRISM_HEADER
{-# LINE 1317 "Network/Pcap/Base.hsc" #-}
{-# LINE 1318 "Network/Pcap/Base.hsc" #-}
{-# LINE 1319 "Network/Pcap/Base.hsc" #-}
(120) -> DLT_AIRONET_HEADER
{-# LINE 1320 "Network/Pcap/Base.hsc" #-}
{-# LINE 1321 "Network/Pcap/Base.hsc" #-}
{-# LINE 1322 "Network/Pcap/Base.hsc" #-}
(121) -> DLT_HHDLC
{-# LINE 1323 "Network/Pcap/Base.hsc" #-}
{-# LINE 1324 "Network/Pcap/Base.hsc" #-}
{-# LINE 1325 "Network/Pcap/Base.hsc" #-}
(122) -> DLT_IP_OVER_FC
{-# LINE 1326 "Network/Pcap/Base.hsc" #-}
{-# LINE 1327 "Network/Pcap/Base.hsc" #-}
{-# LINE 1328 "Network/Pcap/Base.hsc" #-}
(123) -> DLT_SUNATM
{-# LINE 1329 "Network/Pcap/Base.hsc" #-}
{-# LINE 1330 "Network/Pcap/Base.hsc" #-}
{-# LINE 1331 "Network/Pcap/Base.hsc" #-}
(127) -> DLT_IEEE802_11_RADIO
{-# LINE 1332 "Network/Pcap/Base.hsc" #-}
{-# LINE 1333 "Network/Pcap/Base.hsc" #-}
{-# LINE 1334 "Network/Pcap/Base.hsc" #-}
(129) -> DLT_ARCNET_LINUX
{-# LINE 1335 "Network/Pcap/Base.hsc" #-}
{-# LINE 1336 "Network/Pcap/Base.hsc" #-}
{-# LINE 1337 "Network/Pcap/Base.hsc" #-}
(138) -> DLT_APPLE_IP_OVER_IEEE1394
{-# LINE 1338 "Network/Pcap/Base.hsc" #-}
{-# LINE 1339 "Network/Pcap/Base.hsc" #-}
{-# LINE 1340 "Network/Pcap/Base.hsc" #-}
(139) -> DLT_MTP2_WITH_PHDR
{-# LINE 1341 "Network/Pcap/Base.hsc" #-}
{-# LINE 1342 "Network/Pcap/Base.hsc" #-}
{-# LINE 1343 "Network/Pcap/Base.hsc" #-}
(140) -> DLT_MTP2
{-# LINE 1344 "Network/Pcap/Base.hsc" #-}
{-# LINE 1345 "Network/Pcap/Base.hsc" #-}
{-# LINE 1346 "Network/Pcap/Base.hsc" #-}
(141) -> DLT_MTP3
{-# LINE 1347 "Network/Pcap/Base.hsc" #-}
{-# LINE 1348 "Network/Pcap/Base.hsc" #-}
{-# LINE 1349 "Network/Pcap/Base.hsc" #-}
(142) -> DLT_SCCP
{-# LINE 1350 "Network/Pcap/Base.hsc" #-}
{-# LINE 1351 "Network/Pcap/Base.hsc" #-}
{-# LINE 1352 "Network/Pcap/Base.hsc" #-}
(143) -> DLT_DOCSIS
{-# LINE 1353 "Network/Pcap/Base.hsc" #-}
{-# LINE 1354 "Network/Pcap/Base.hsc" #-}
{-# LINE 1355 "Network/Pcap/Base.hsc" #-}
(144) -> DLT_LINUX_IRDA
{-# LINE 1356 "Network/Pcap/Base.hsc" #-}
{-# LINE 1357 "Network/Pcap/Base.hsc" #-}
{-# LINE 1358 "Network/Pcap/Base.hsc" #-}
(147) -> DLT_USER0
{-# LINE 1359 "Network/Pcap/Base.hsc" #-}
{-# LINE 1360 "Network/Pcap/Base.hsc" #-}
{-# LINE 1361 "Network/Pcap/Base.hsc" #-}
(148) -> DLT_USER1
{-# LINE 1362 "Network/Pcap/Base.hsc" #-}
{-# LINE 1363 "Network/Pcap/Base.hsc" #-}
{-# LINE 1364 "Network/Pcap/Base.hsc" #-}
(149) -> DLT_USER2
{-# LINE 1365 "Network/Pcap/Base.hsc" #-}
{-# LINE 1366 "Network/Pcap/Base.hsc" #-}
{-# LINE 1367 "Network/Pcap/Base.hsc" #-}
(150) -> DLT_USER3
{-# LINE 1368 "Network/Pcap/Base.hsc" #-}
{-# LINE 1369 "Network/Pcap/Base.hsc" #-}
{-# LINE 1370 "Network/Pcap/Base.hsc" #-}
(151) -> DLT_USER4
{-# LINE 1371 "Network/Pcap/Base.hsc" #-}
{-# LINE 1372 "Network/Pcap/Base.hsc" #-}
{-# LINE 1373 "Network/Pcap/Base.hsc" #-}
(152) -> DLT_USER5
{-# LINE 1374 "Network/Pcap/Base.hsc" #-}
{-# LINE 1375 "Network/Pcap/Base.hsc" #-}
{-# LINE 1376 "Network/Pcap/Base.hsc" #-}
(153) -> DLT_USER6
{-# LINE 1377 "Network/Pcap/Base.hsc" #-}
{-# LINE 1378 "Network/Pcap/Base.hsc" #-}
{-# LINE 1379 "Network/Pcap/Base.hsc" #-}
(154) -> DLT_USER7
{-# LINE 1380 "Network/Pcap/Base.hsc" #-}
{-# LINE 1381 "Network/Pcap/Base.hsc" #-}
{-# LINE 1382 "Network/Pcap/Base.hsc" #-}
(155) -> DLT_USER8
{-# LINE 1383 "Network/Pcap/Base.hsc" #-}
{-# LINE 1384 "Network/Pcap/Base.hsc" #-}
{-# LINE 1385 "Network/Pcap/Base.hsc" #-}
(156) -> DLT_USER9
{-# LINE 1386 "Network/Pcap/Base.hsc" #-}
{-# LINE 1387 "Network/Pcap/Base.hsc" #-}
{-# LINE 1388 "Network/Pcap/Base.hsc" #-}
(157) -> DLT_USER10
{-# LINE 1389 "Network/Pcap/Base.hsc" #-}
{-# LINE 1390 "Network/Pcap/Base.hsc" #-}
{-# LINE 1391 "Network/Pcap/Base.hsc" #-}
(158) -> DLT_USER11
{-# LINE 1392 "Network/Pcap/Base.hsc" #-}
{-# LINE 1393 "Network/Pcap/Base.hsc" #-}
{-# LINE 1394 "Network/Pcap/Base.hsc" #-}
(159) -> DLT_USER12
{-# LINE 1395 "Network/Pcap/Base.hsc" #-}
{-# LINE 1396 "Network/Pcap/Base.hsc" #-}
{-# LINE 1397 "Network/Pcap/Base.hsc" #-}
(160) -> DLT_USER13
{-# LINE 1398 "Network/Pcap/Base.hsc" #-}
{-# LINE 1399 "Network/Pcap/Base.hsc" #-}
{-# LINE 1400 "Network/Pcap/Base.hsc" #-}
(161) -> DLT_USER14
{-# LINE 1401 "Network/Pcap/Base.hsc" #-}
{-# LINE 1402 "Network/Pcap/Base.hsc" #-}
{-# LINE 1403 "Network/Pcap/Base.hsc" #-}
(162) -> DLT_USER15
{-# LINE 1404 "Network/Pcap/Base.hsc" #-}
{-# LINE 1405 "Network/Pcap/Base.hsc" #-}
{-# LINE 1406 "Network/Pcap/Base.hsc" #-}
(166) -> DLT_PPP_PPPD
{-# LINE 1407 "Network/Pcap/Base.hsc" #-}
{-# LINE 1408 "Network/Pcap/Base.hsc" #-}
{-# LINE 1409 "Network/Pcap/Base.hsc" #-}
(169) -> DLT_GPRS_LLC
{-# LINE 1410 "Network/Pcap/Base.hsc" #-}
{-# LINE 1411 "Network/Pcap/Base.hsc" #-}
{-# LINE 1412 "Network/Pcap/Base.hsc" #-}
(170) -> DLT_GPF_T
{-# LINE 1413 "Network/Pcap/Base.hsc" #-}
{-# LINE 1414 "Network/Pcap/Base.hsc" #-}
{-# LINE 1415 "Network/Pcap/Base.hsc" #-}
(171) -> DLT_GPF_F
{-# LINE 1416 "Network/Pcap/Base.hsc" #-}
{-# LINE 1417 "Network/Pcap/Base.hsc" #-}
{-# LINE 1418 "Network/Pcap/Base.hsc" #-}
(177) -> DLT_LINUX_LAPD
{-# LINE 1419 "Network/Pcap/Base.hsc" #-}
{-# LINE 1420 "Network/Pcap/Base.hsc" #-}
{-# LINE 1421 "Network/Pcap/Base.hsc" #-}
(182) -> DLT_MFR
{-# LINE 1422 "Network/Pcap/Base.hsc" #-}
{-# LINE 1423 "Network/Pcap/Base.hsc" #-}
{-# LINE 1424 "Network/Pcap/Base.hsc" #-}
(184) -> DLT_A429
{-# LINE 1425 "Network/Pcap/Base.hsc" #-}
{-# LINE 1426 "Network/Pcap/Base.hsc" #-}
{-# LINE 1427 "Network/Pcap/Base.hsc" #-}
(185) -> DLT_A653_ICM
{-# LINE 1428 "Network/Pcap/Base.hsc" #-}
{-# LINE 1429 "Network/Pcap/Base.hsc" #-}
{-# LINE 1430 "Network/Pcap/Base.hsc" #-}
(186) -> DLT_USB
{-# LINE 1431 "Network/Pcap/Base.hsc" #-}
{-# LINE 1432 "Network/Pcap/Base.hsc" #-}
{-# LINE 1433 "Network/Pcap/Base.hsc" #-}
(187) -> DLT_BLUETOOTH_HCI_H4
{-# LINE 1434 "Network/Pcap/Base.hsc" #-}
{-# LINE 1435 "Network/Pcap/Base.hsc" #-}
{-# LINE 1436 "Network/Pcap/Base.hsc" #-}
(188) -> DLT_IEEE802_16_MAC_CPS
{-# LINE 1437 "Network/Pcap/Base.hsc" #-}
{-# LINE 1438 "Network/Pcap/Base.hsc" #-}
{-# LINE 1439 "Network/Pcap/Base.hsc" #-}
(189) -> DLT_USB_LINUX
{-# LINE 1440 "Network/Pcap/Base.hsc" #-}
{-# LINE 1441 "Network/Pcap/Base.hsc" #-}
{-# LINE 1442 "Network/Pcap/Base.hsc" #-}
(190) -> DLT_CAN20B
{-# LINE 1443 "Network/Pcap/Base.hsc" #-}
{-# LINE 1444 "Network/Pcap/Base.hsc" #-}
{-# LINE 1445 "Network/Pcap/Base.hsc" #-}
(191) -> DLT_IEEE802_15_4_LINUX
{-# LINE 1446 "Network/Pcap/Base.hsc" #-}
{-# LINE 1447 "Network/Pcap/Base.hsc" #-}
{-# LINE 1448 "Network/Pcap/Base.hsc" #-}
(192) -> DLT_PPI
{-# LINE 1449 "Network/Pcap/Base.hsc" #-}
{-# LINE 1450 "Network/Pcap/Base.hsc" #-}
{-# LINE 1451 "Network/Pcap/Base.hsc" #-}
(193) -> DLT_IEEE802_16_MAC_CPS_RADIO
{-# LINE 1452 "Network/Pcap/Base.hsc" #-}
{-# LINE 1453 "Network/Pcap/Base.hsc" #-}
{-# LINE 1454 "Network/Pcap/Base.hsc" #-}
(195) -> DLT_IEEE802_15_4
{-# LINE 1455 "Network/Pcap/Base.hsc" #-}
{-# LINE 1456 "Network/Pcap/Base.hsc" #-}
{-# LINE 1457 "Network/Pcap/Base.hsc" #-}
unk -> DLT_UNKNOWN (fromIntegral unk)
{-# LINE 1459 "Network/Pcap/Base.hsc" #-}