From owner-p4-projects@FreeBSD.ORG Mon Jun 8 04:22:12 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id A8C521065675; Mon, 8 Jun 2009 04:22:12 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 6855C106566C for ; Mon, 8 Jun 2009 04:22:12 +0000 (UTC) (envelope-from zjriggl@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 4ADAF8FC1A for ; Mon, 8 Jun 2009 04:22:12 +0000 (UTC) (envelope-from zjriggl@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id n584MCjf056831 for ; Mon, 8 Jun 2009 04:22:12 GMT (envelope-from zjriggl@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n584MC2D056829 for perforce@freebsd.org; Mon, 8 Jun 2009 04:22:12 GMT (envelope-from zjriggl@FreeBSD.org) Date: Mon, 8 Jun 2009 04:22:12 GMT Message-Id: <200906080422.n584MC2D056829@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to zjriggl@FreeBSD.org using -f From: Zachariah Riggle To: Perforce Change Reviews Cc: Subject: PERFORCE change 163757 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 08 Jun 2009 04:22:13 -0000 http://perforce.freebsd.org/chv.cgi?CH=163757 Change 163757 by zjriggl@zjriggl_tcpregression on 2009/06/08 04:21:32 Done for the night, committing to save changes. Affected files ... .. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/echoServer.py#3 add .. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/loggable.py#3 add .. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/logging.conf#3 add .. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcsextension/StringField.py#1 add .. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcsextension/__init__.py#3 edit .. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcsextension/backup.tar#1 add .. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcsextension/decorators.py#1 add .. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcsextension/hwAddress.py#1 add .. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcsextension/ipAddress.py#1 add .. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcsextension/networkPort.py#1 add .. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcsextension/payload.py#1 add .. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcsextension/pseudoipv4.py#1 add .. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/sniffLocalhost.py#3 add .. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/tcpConstructor.py#3 add .. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/tcpFilter.py#3 add .. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/tcpHandshake.py#3 add .. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/tcpstatemachine.py#2 edit .. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/test.html#3 add .. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/testconfig.py#3 add Differences ... ==== //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcsextension/__init__.py#3 (text+ko) ==== @@ -47,6 +47,31 @@ def inet_atol(ipString): return inet_ntol(socket.inet_aton(ipString)) -def tcpv4Checksum(t): - if not isinstance(t, tcp): - return 0+def getPcsFormattedIP(ipAddr): + if type(ipAddr) == str: + # The byte representation's length will be 4 bytes + if len(ipAddr) == 4: + return inet_ntol(ipAddr) + + # Otherwise, the length is between len("0.0.0.0") and len("255.255.255.255") (lengths are 7 and 15) + elif 7 <= len(ipAddr) and len(ipAddr) <= 15: + return inet_atol(ipAddr) + + elif type(ipAddr) == int: + return ipAddr + + logging.warn("Could not properly identify IP address type for: %s" % str(ipAddr)) + return 0 + +def getPcsFormattedPort(port): + if type(port) == str: + if port.isdigit(): + return htons(int(port)) + else: + return struct.unpack("!i",'A\x00\x00\x00')[0] + + if type(port) == int: + return port + + logging.warn("Could not properly identify port type for: %s" % str(ipAddr)) + return 0 ==== //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/tcpstatemachine.py#2 (text+ko) ==== @@ -11,11 +11,16 @@ from pcsextension.pseudoipv4 import pseudoipv4, ipv4_cksum from socket import IPPROTO_TCP from tcpstates import * +from tcpFilter import tcpFilter import binhex import pcs +from pcs.packets import tcp +from pcs.packets import ipv4 +from pcs.packets import ethernet import testconfig import binascii + # Valid state transitions, as defined by the diagram on RFC 793 pp. 23: # September 1981 # Transmission Control Protocol @@ -103,6 +108,8 @@ 3 ''' + _connector = None + def generateInitialSequence(self): return 0 @@ -215,6 +222,13 @@ 'assigned.'} def enableSequenceGeneration(self, enable=True): + validateTypes({enable:bool}) + action = "Enabled" + if enable == False: + action = "Disabled" + + self.log.validate("%s generation of TCP sequence numbers" % action) + self._sequenceGeneration = enable def isSequenceGenerationEnabled(self): @@ -385,7 +399,44 @@ # Add the packet to the outgoing queue. self.packetsToSend += [tcpLayer] self._sendPackets() - + + def sendRawTcp(self, tcpLayer): + if not validateTypes({tcpLayer:tcp.tcp}): + return + + ip = ipv4.ipv4() + ethernet = ethernet.ethernet() + ip.data = tcpLayer + ethernet.data = ip + + ethernet.src = + + ip.src = self.localIP.getNetworkInteger() + ip.dst = self.remoteIP.getNetworkInteger() + + + + + +# version = pcs.Field("version", 4, default = 4) +# hlen = pcs.Field("hlen", 4) +# tos = pcs.Field("tos", 8) +# length = pcs.Field("length", 16) +# id = pcs.Field("id", 16) +# flags = pcs.Field("flags", 3) +# offset = pcs.Field("offset", 13) +# ttl = pcs.Field("ttl", 8, default = 64) +# protocol = pcs.Field("protocol", 8) +# checksum = pcs.Field("checksum", 16) +# src = pcs.Field("src", 32) +# dst = pcs.Field("dst", 32) + + + + self._connector.write(packet, byets) + + pass + def _sendPackets(self): for tcpLayer in self.packetsToSend: send = False @@ -409,8 +460,7 @@ tcpLayer.cksum = self.generateChecksum(tcpLayer) self.sendRawTcp(tcpLayer) - - pass + def generateChecksum(self, packet): """Calculate and store the checksum for the TCP segment @@ -418,7 +468,7 @@ bytes = packet.chain().bytes pip = pseudoipv4() - pip.src = self.localIP + pip.src = (I self.localIP pip.dst = self.remoteIP pip.protocol = IPPROTO_TCP pip.length = len(bytes) @@ -519,7 +569,7 @@ self.rcv_nxt = self.irs # Expected next recv sequence # self.msl = 2 * 60 # Maximum Segment Lifetime. Arbitrarily defined in the RFC to 2 minutes - self.timeout = 2*msl # Timeout + self.timeout = 2*self.msl # Timeout # Set the initial values self.state = CLOSED @@ -532,4 +582,4 @@ self.packetsRecvdAcked = [] self.packetsToSend = [] - + self._connector = tcpFilter(testconfig.interface)