module Net.Test(module Net.Test,module Net.ClientInterface) where
import qualified Net.IPv4 as IP
import qualified Net.ICMP as ICMP
import qualified Net.ARP_Protocol as ARP
import qualified Net.EthernetClient as EC
import qualified Net.IPv4Client as IC
import Net.IPv4OverEthernet as IPv4oE
import Net.IPv4Link as IPv4Link
import qualified Net.UDP_Client as UC
import qualified Net.TCP_Client as TC
import Net.Packet(listArray)
import qualified Net.Interface as Net
import Monad.Util(loop)
import qualified Net.DHCP_Client as DHCP(init)
import Net.ClientInterface
import Net.Servers
import Net.Concurrent
initialize putStrLn config eth =
do iconfig@(myIP,routerIP,netmask) <-
case config of
DHCP -> DHCP.init putStrLn eth
Fixed me router netmask -> return (me,Just router,netmask)
EC.Clients {EC.ipv4=ipv4Eth,EC.arp=arpEth} <- EC.initialize putStrLn eth
arp <- ARP.initialize putStrLn arpEth myIP
ipv4clients <-
let ipoe = IPv4oE.initialize (ARP.lookup arp) ipv4Eth
iplink = IPv4Link.initialize (myIP,netmask) routerIP ipoe
in IC.initialize putStrLn iplink
let i = IC.icmp ipv4clients
icmpHandler putStrLn myIP i
udpclient <- UC.initialize putStrLn myIP (IC.udp ipv4clients)
tcpclient <- TC.initialize putStrLn myIP (IC.tcp ipv4clients)
let net = Net { ping = sendPing (Net.tx i) myIP,
dump = ARP.dump arp,
udp = udpclient,
tcp = tcpclient }
fork $ udpEchoServer putStrLn net
fork $ tcpEchoServer putStrLn net
return (iconfig,net)
icmpHandler putStrLn myIP iface =
fork $ loop $ icmpCallback =<< Net.rx iface
where
txIP = Net.tx iface
icmpCallback ipPack =
let icmpPack = IP.content ipPack in
case icmpPack of
ICMP.EchoRequest echoMsg ->
do putStrLn $ "Replying to ping from "++show srcIP
txIP ipRep
where
icmpRep = ICMP.EchoReply echoMsg
srcIP = IP.source ipPack
ipRep = ipPack
{ IP.source = myIP
, IP.dest = srcIP
, IP.content = icmpRep
}
_ ->
putStrLn (show (IP.source ipPack,icmpPack))
sendPing txIP myIP dstIP unique n = txIP p
where
p = IP.template IP.ICMP myIP dstIP icmpReq
icmpReq = ICMP.EchoRequest
ICMP.Echo { ICMP.ident = unique
, ICMP.seqNum = n
, ICMP.echoData = listArray (0,5) [0..5]
}