{-# LANGUAGE GeneralizedNewtypeDeriving, MultiParamTypeClasses #-}
module Data.UDP
	( UDPPort
	, UDPHeader (..)
	) where

import Data.Binary
import Data.Binary.Get
import Data.Binary.Put
import Data.CSum
import Data.Header

newtype UDPPort = UDPPort Word16 deriving (Eq, Ord, Show, Read, Num, Bounded)

instance Binary UDPPort where
	put (UDPPort p) = putWord16be p
	get = getWord16be >>= return . UDPPort

data UDPHeader =
	UDPHdr  { srcPort	:: UDPPort
		, dstPort	:: UDPPort
		, payloadLength :: Int
		, checksum	:: CSum
	} deriving (Eq, Ord, Show)

instance Binary UDPHeader where
	put (UDPHdr s d l c) = do
		put s
		put d
		putWord16be $ fromIntegral l
		put c
	get = do
		s <- get
		d <- get
		l <- getWord16be >>= return . fromIntegral
		c <- get
		return $ UDPHdr s d l c