|
From: Peter P. <pr...@us...> - 2006-11-24 13:48:09
|
Update of /cvsroot/pyxida/Pyxida/src/edu/harvard/syrah/pyxida/ping In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19249/src/edu/harvard/syrah/pyxida/ping Modified Files: TCPSynPinger.java JpcapPinger.java Log Message: * Fixed an issue where TCPSyn would send a packet twice. * Added a random src port allocation, otherwise the kernel is confused Index: TCPSynPinger.java =================================================================== RCS file: /cvsroot/pyxida/Pyxida/src/edu/harvard/syrah/pyxida/ping/TCPSynPinger.java,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** TCPSynPinger.java 24 Nov 2006 12:06:22 -0000 1.5 --- TCPSynPinger.java 24 Nov 2006 13:48:06 -0000 1.6 *************** *** 7,10 **** --- 7,11 ---- import edu.harvard.syrah.prp.ANSI; import edu.harvard.syrah.prp.Log; + import edu.harvard.syrah.prp.PUtil; import edu.harvard.syrah.sbon.async.CBResult; import edu.harvard.syrah.sbon.async.EventLoop; *************** *** 33,42 **** case OK : { log.debug("pd.recvPacket=" + pd.recvPacket); ! pd.recvTS = parseTCP(pd.recvPacket, pd.pingAddr); assert pd.sendTS > 0; assert pd.recvTS > pd.sendTS : "send TS (" + pd.sendTS + ") > recv TS (" + pd.recvTS + ")?"; long lat = pd.recvTS - pd.sendTS; log.debug("lat=" + lat + " pd.recvTS=" + pd.recvTS); ! cbPing.call(result, lat / 1000.0); break; --- 34,44 ---- case OK : { log.debug("pd.recvPacket=" + pd.recvPacket); ! processTCP(pd); assert pd.sendTS > 0; assert pd.recvTS > pd.sendTS : "send TS (" + pd.sendTS + ") > recv TS (" + pd.recvTS + ")?"; long lat = pd.recvTS - pd.sendTS; log.debug("lat=" + lat + " pd.recvTS=" + pd.recvTS); ! ! removeRequest(); cbPing.call(result, lat / 1000.0); break; *************** *** 53,74 **** addRequest(pd); ! ! pd.sendPacket = sendTCPSyn(pd.pingAddr); ! try { ! pd.sendTS = System.nanoTime() / 1000; ! log.debug("Sending TCPSyn"); ! sender.sendPacket(pd.sendPacket); ! log.debug("Done"); ! } catch (Exception e) { ! log.warn("Failed sending packet: " + e); ! } ! log.debug("sendPacket=" + pd.sendPacket + " sendTS=" + pd.sendTS); ! assert pd.sendTS > 0; } ! private Packet sendTCPSyn(AddressIF pingAddr) { ! TCPPacket tcp = new TCPPacket(PING_SRC_PORT, PING_DST_PORT, 0, 0, false, false, false, false, true, false, true, true, 23360, 0); tcp.setIPv4Parameter(0, false, false, false, 0, false, false, false, 0, 0, 100, IPPacket.IPPROTO_TCP, ! thisIP, pingAddr.getInetAddress()); tcp.data = new byte[0]; --- 55,67 ---- addRequest(pd); ! sendTCPSyn(pd); } ! private void sendTCPSyn(JpcapPingData pd) { ! log.debug("Sending TCP syn"); ! ! TCPPacket tcp = new TCPPacket(PUtil.getRandomInt() % 65535, PING_DST_PORT, 0, 0, false, false, false, false, true, false, false, false, 23360, 0); tcp.setIPv4Parameter(0, false, false, false, 0, false, false, false, 0, 0, 100, IPPacket.IPPROTO_TCP, ! thisIP, pd.pingAddr.getInetAddress()); tcp.data = new byte[0]; *************** *** 78,91 **** ether.dst_mac = gwMAC; tcp.datalink = ether; ! sender.sendPacket(tcp); ! return tcp; } ! private Packet sendTCPRst(AddressIF pingAddr) { ! TCPPacket tcp = new TCPPacket(PING_SRC_PORT, PING_DST_PORT, 0, 0, false, false, false, true, false, false, true, true, 23360, 10); tcp.setIPv4Parameter(0, false, false, false, 0, false, false, false, 0, 0, 100, IPPacket.IPPROTO_TCP, ! thisIP, pingAddr.getInetAddress()); tcp.data = new byte[0]; --- 71,91 ---- ether.dst_mac = gwMAC; tcp.datalink = ether; + + pd.sendTS = System.nanoTime() / 1000; + sender.sendPacket(tcp); ! pd.sendPacket = tcp; ! log.debug("Done: sendPacket=" + pd.sendPacket + " sendTS=" + pd.sendTS); ! assert pd.sendTS > 0; } ! /* ! private void sendTCPRst(JpcapPingData pd) { ! assert false; ! log.debug("Sending TCP rst"); ! TCPPacket tcp = new TCPPacket(0, PING_DST_PORT, 0, 0, false, false, false, true, false, false, true, true, 23360, 10); tcp.setIPv4Parameter(0, false, false, false, 0, false, false, false, 0, 0, 100, IPPacket.IPPROTO_TCP, ! thisIP, pd.pingAddr.getInetAddress()); tcp.data = new byte[0]; *************** *** 96,122 **** tcp.datalink = ether; ! sender.sendPacket(tcp); ! ! return tcp; } ! private long parseTCP(Packet p, AddressIF pingAddr) { log.debug("p=" + p + " p.class=" + (p != null ? p.getClass() : null)); - long recvTS = Long.MIN_VALUE; TCPPacket tcp = (TCPPacket) p; long sec = p.sec; long usec = p.usec; ! recvTS = (sec * 1000 * 1000) + usec; ! log.debug("recvTS=" + recvTS); ! ! // Close the connection properly if we hit an open port ! if (tcp.ack) { ! sendTCPRst(pingAddr); ! removeRequest(); ! } ! ! return recvTS; } --- 96,118 ---- tcp.datalink = ether; ! sender.sendPacket(tcp); ! log.debug("Done."); } + */ ! private void processTCP(JpcapPingData pd) { ! Packet p = pd.recvPacket; log.debug("p=" + p + " p.class=" + (p != null ? p.getClass() : null)); TCPPacket tcp = (TCPPacket) p; long sec = p.sec; long usec = p.usec; ! pd.recvTS = (sec * 1000 * 1000) + usec; ! log.debug("recvTS=" + pd.recvTS); ! ! /* ! * We don't need to send a rst here because the kernel does it for us. ! */ } *************** *** 127,131 **** public static void main(final String[] args) { ANSI.use(true); ! //Log.setPackageRoot(TCPSynPinger.class); EventLoop.set(new EventLoop()); --- 123,127 ---- public static void main(final String[] args) { ANSI.use(true); ! Log.setPackageRoot(TCPSynPinger.class); EventLoop.set(new EventLoop()); Index: JpcapPinger.java =================================================================== RCS file: /cvsroot/pyxida/Pyxida/src/edu/harvard/syrah/pyxida/ping/JpcapPinger.java,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** JpcapPinger.java 24 Nov 2006 12:06:22 -0000 1.3 --- JpcapPinger.java 24 Nov 2006 13:48:06 -0000 1.4 *************** *** 34,38 **** protected static final long PING_TIMEOUT = 3000; ! protected static final int PING_SRC_PORT = 55000; private static JpcapCaptor captor; --- 34,38 ---- protected static final long PING_TIMEOUT = 3000; ! //protected static final int PING_SRC_PORT = 55000; private static JpcapCaptor captor; *************** *** 179,183 **** public void run() { ! captor.setFilter("dst host " + thisIP.getHostAddress() + " and dst port " + PING_SRC_PORT + " and (icmp or (tcp and tcp[tcpflags] & (tcp-rst|tcp-ack) != 0))", true); //captor.setFilter("icmp", true); --- 179,183 ---- public void run() { ! captor.setFilter("dst host " + thisIP.getHostAddress() + " and (icmp or (tcp and tcp[tcpflags] & (tcp-syn|tcp-ack) != 0))", true); //captor.setFilter("icmp", true); |