PERFORCE change 167121 for review
Zachariah Riggle
zjriggl at FreeBSD.org
Sun Aug 9 04:21:28 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=167121
Change 167121 by zjriggl at zjriggl_tcpregression on 2009/08/09 04:21:02
Periodic submit
Affected files ...
.. //depot/projects/soc2009/zjriggl_tcpregression/Makefile#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/loggable.py#6 edit
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/.project#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/.pydevproject#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/__init__.py#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/packets/__init__.py#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/packets/arp.py#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/packets/dhcpv4.py#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/packets/dns.py#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/packets/ethernet.py#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/packets/icmpv4.py#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/packets/icmpv6.py#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/packets/ipsec.py#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/packets/ipv4.py#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/packets/ipv6.py#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/packets/localhost.py#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/packets/nd6.py#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/packets/payload.py#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/packets/pseudoipv6.py#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/packets/tcp.orig.py#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/packets/tcp.py#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/packets/tcpv6.py#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/packets/udp.py#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/packets/udpv4.py#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/packets/udpv6.py#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap.so#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/.git/HEAD#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/.git/config#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/.git/description#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/.git/hooks/applypatch-msg.sample#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/.git/hooks/commit-msg.sample#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/.git/hooks/post-commit.sample#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/.git/hooks/post-receive.sample#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/.git/hooks/post-update.sample#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/.git/hooks/pre-applypatch.sample#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/.git/hooks/pre-commit.sample#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/.git/hooks/pre-rebase.sample#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/.git/hooks/prepare-commit-msg.sample#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/.git/hooks/update.sample#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/.git/index#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/.git/info/exclude#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/.git/logs/HEAD#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/.git/logs/refs/heads/master#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/.git/logs/refs/remotes/origin/HEAD#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/.git/objects/pack/pack-77f13729543285782c830a6a087aeb8ce3ad7c33.idx#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/.git/objects/pack/pack-77f13729543285782c830a6a087aeb8ce3ad7c33.pack#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/.git/packed-refs#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/.git/refs/heads/master#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/.git/refs/remotes/origin/HEAD#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/.project#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/.pydevproject#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/CHANGES#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/LICENSE#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/Makefile#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/README#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/config.h#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/config.pkl#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/pcap.c#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/pcap.pyx#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/pcap.so#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/pcap_ex.c#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/pcap_ex.h#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/setup.py#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/test.pcap#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/test.py#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcs/pcap/testsniff.py#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcsextension/__init__.py#9 edit
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcsextension/decorators.py#5 edit
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcsextension/field.py#3 edit
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcsextension/ipAddress.py#6 edit
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcsextension/networkPort.py#5 edit
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/sequence.py#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/tcpstatemachine.py#9 edit
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tests/segmentBufferTest.py#1 add
.. //depot/projects/soc2009/zjriggl_tcpregression/src/tests/tcpFilterTest.py#1 add
Differences ...
==== //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/loggable.py#6 (text+ko) ====
@@ -2,32 +2,65 @@
import pcsextension
import inspect
-# Configure logging
+# -------- Configure logging --------
logging.config.fileConfig( "logging.conf" )
+# -------- Set Up New Loglevel Names --------
( logging.FIELD_CHANGE,
- logging.RESPONSE_GENERATION ) = range( logging.DEBUG - 2, logging.DEBUG )
-
+ logging.RESPONSE_GENERATION ) = range( logging.DEBUG - 2, logging.DEBUG )
+
( logging.PACKET_TRANSMIT,
logging.PACKET_RECEIVED,
logging.PACKET_SENT,
logging.VALIDATE,
logging.STATE_CHANGE ) = range( logging.INFO - 5, logging.INFO )
+
+# -------- ANSI/VT100 Colors --------
+( fgBlack,
+fgRed,
+fgGreen,
+fgYellow,
+fgBlue,
+fgMagenta,
+fgCyan,
+fgWhite ) = range( 30, 38 )
+
+( bgBlack,
+bgRed,
+bgGreen,
+bgYellow,
+bgBlue,
+bgMagenta,
+bgCyan,
+bgWhite ) = range( 40, 48 )
+
+def colorText( text, fgColor = '', bgColor = '' ):
+ '''
+ Returns text colored corresponding to the the ANSI/VT100 color code
+ provided a arguments. Colors are defined as fg_____ or bg_____ with
+ the color name. Alternatively, directly use the color code, see below.
+ Foreground Background Color
+ Code Code
+ 30 40 Black
+ 31 41 Red
+ 32 42 Green
+ 33 43 Yellow
+ 34 44 Blue
+ 35 45 Magenta
+ 36 46 Cyan
+ 37 47 White
+ '''
+ return "\033[1;%s;%sm%s\033[1;m" % ( fgColor, bgColor, text )
+
+# -------- Loglevel names --------
logging.addLevelName( logging.FIELD_CHANGE, "FIELD" )
-logging.addLevelName( logging.RESPONSE_GENERATION, "\033[1;36mGENERATE\033[1;m" )
-logging.addLevelName( logging.PACKET_TRANSMIT, "XMIT" )
-logging.addLevelName( logging.PACKET_RECEIVED, "\033[1;31mRECVD\033[1;m" )
-logging.addLevelName( logging.PACKET_SENT, "\033[1;31mSENT\033[1;m" )
+logging.addLevelName( logging.RESPONSE_GENERATION, colorText( "GENERATE", fgCyan ) )
+logging.addLevelName( logging.PACKET_RECEIVED, colorText( "RECVD", fgYellow ) )
+logging.addLevelName( logging.PACKET_SENT, colorText( "SENT", fgGreen ) )
logging.addLevelName( logging.VALIDATE, "VALIDATE" )
-logging.addLevelName( logging.STATE_CHANGE, "\033[1;37;44mSTATE\033[1;m" )
-
-# 1;37;44
+logging.addLevelName( logging.STATE_CHANGE, colorText( "STATE", fgBlue ) )
-# print '\033[1;36mGENERATE\033[1;m'
-# print '\033[1;36mCyan like Caribbean\033[1;m'
-# '\033[1;31mRed like Radish\033[1;m'
-
class tcplog( object ):
'''
Provides rapid access to logging mechanisms for derived classes.
@@ -35,7 +68,7 @@
Provides all of the standard log levels:
debug
info
- warn/warning
+ warn/warnings
error
fatal/critical
As well as some custom-defined ones:
@@ -65,22 +98,22 @@
'''
def __init__( self, parent ):
- # self._log = logging.getLogger(parent.__class__.__module__ + '.' + parent.__class__.__name__)
- self._log = logging.getLogger( parent.__class__.__name__ )
+ # self.logger = logging.getLogger(parent.__class__.__module__ + '.' + parent.__class__.__name__)
+ self.logger = logging.getLogger( parent.__class__.__name__ )
def caller( self ):
return inspect.stack()[2][3]
- debug = lambda self, x: self._log.debug( "%s - %s" % ( self.caller(), x ) )
- info = lambda self, x: self._log.info( x )
- error = lambda self, x: self._log.error( x )
- critical = lambda self, x: self._log.critical( x )
- fatal = lambda self, x: self._log.fatal( x )
- warning = lambda self, x: self._log.warning( x )
- warn = lambda self, x: self._log.warn( x )
- state = lambda self, x: self._log.log( logging.STATE_CHANGE, x )
- validate = lambda self, x: self._log.log( logging.VALIDATE, x )
- pktsent = lambda self, x: self._log.log( logging.PACKET_SENT, x )
- pktrecv = lambda self, x: self._log.log( logging.PACKET_RECEIVED, x )
- generated = lambda self, x: self._log.log( logging.RESPONSE_GENERATION, x )
- field = lambda self, x: self._log.log( logging.FIELD_CHANGE, x )
+ debug = lambda self, x: self.logger.debug( "%s - %s" % ( self.caller(), x ) )
+ info = lambda self, x: self.logger.info( x )
+ error = lambda self, x: self.logger.error( x )
+ critical = lambda self, x: self.logger.critical( x )
+ fatal = lambda self, x: self.logger.fatal( x )
+ warning = lambda self, x: self.logger.warning( x )
+ warn = lambda self, x: self.logger.warn( x )
+ state = lambda self, x: self.logger.log( logging.STATE_CHANGE, x )
+ validate = lambda self, x: self.logger.log( logging.VALIDATE, x )
+ pktsent = lambda self, x: self.logger.log( logging.PACKET_SENT, x )
+ pktrecv = lambda self, x: self.logger.log( logging.PACKET_RECEIVED, x )
+ generated = lambda self, x: self.logger.log( logging.RESPONSE_GENERATION, x )
+ field = lambda self, x: self.logger.log( logging.FIELD_CHANGE, x )
==== //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcsextension/__init__.py#9 (text+ko) ====
@@ -28,27 +28,13 @@
p = p.data
return None
-
-
-def inet_lton( integer ):
- return struct.pack( ">L", integer )
-
-def inet_ltoa( integer ):
- return socket.inet_ntoa( inet_lton( integer ) )
-
-def inet_ntol( byteString ):
- return struct.unpack( ">L", byteString )[0]
-
-def inet_atol( ipString ):
- return inet_ntol( socket.inet_aton( ipString ) )
-
-def wireSharkFormatBytes(x):
+def wireSharkFormatBytes( x ):
twoBits = r"(\w\w)"
octet = "((%s ){8})" % twoBits
twoBytes = "((%s ){2})" % octet
- x = re.sub(twoBits,r"\1 ",x)
- x = re.sub(octet,r"\1 ",x)
- x = re.sub(twoBytes,r"\1\n",x)
+ x = re.sub( twoBits, r"\1 ", x )
+ x = re.sub( octet, r"\1 ", x )
+ x = re.sub( twoBytes, r"\1\n", x )
return x
==== //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcsextension/decorators.py#5 (text+ko) ====
@@ -5,48 +5,10 @@
'''
import sys
-from inspect import *
+# from inspect import *
+from inspect import stack
-"""
-One of three degrees of enforcement may be specified by passing
-the 'debug' keyword argument to the decorator:
- 0 -- NONE: No type-checking. Decorators disabled.
- 1 -- MEDIUM: Print warning message to stderr. (Default)
- 2 -- STRONG: Raise TypeError with message.
-If 'debug' is not passed to the decorator, the default level is used.
-
-Example usage:
- >>> NONE, MEDIUM, STRONG = 0, 1, 2
- >>>
- >>> @accepts(int, int, int)
- ... @returns(float)
- ... def average(x, y, z):
- ... return (x + y + z) / 2
- ...
- >>> average(5.5, 10, 15.0)
- TypeWarning: 'average' method accepts (int, int, int), but was given
- (float, int, float)
- 15.25
- >>> average(5, 10, 15)
- TypeWarning: 'average' method returns (float), but result is (int)
- 15
-
-Needed to cast params as floats in function def (or simply divide by 2.0).
-
- >>> TYPE_CHECK = STRONG
- >>> @accepts(int, debug=TYPE_CHECK)
- ... @returns(int, debug=TYPE_CHECK)
- ... def fib(n):
- ... if n in (0, 1): return n
- ... return fib(n-1) + fib(n-2)
- ...
- >>> fib(5.3)
- Traceback (most recent call last):
- ...
- TypeError: 'fib' method accepts (int), but was given (float)
-
-"""
-def accepts(*types, **kw):
+def accepts( *types, **kw ):
""" Function decorator. Checks that inputs given to decorated function
are of the expected type.
@@ -63,20 +25,20 @@
else:
debug = kw['debug']
try:
- def decorator(f):
- def newf(*args):
+ def decorator( f ):
+ def newf( *args ):
if debug == 0:
- return f(*args)
- assert len(args) == len(types)
-
- if not validateTypes(args,types):
- argtypes = tuple(map(type, args))
- msg = info(f.__name__, types, argtypes, 0)
+ return f( *args )
+ assert len( args ) == len( types )
+
+ if not validateTypes( args, types ):
+ argtypes = tuple( map( type, args ) )
+ msg = info( f.__name__, types, argtypes, 0 )
if debug == 1:
print >> sys.stderr, 'TypeWarning: ', msg
elif debug == 2:
raise TypeError, msg
- return f(*args)
+ return f( *args )
newf.__name__ = f.__name__
return newf
return decorator
@@ -84,45 +46,45 @@
raise KeyError, key + "is not a valid keyword argument"
except TypeError, msg:
raise TypeError, msg
-
-
-def validateTypes(argTypeMap):
+
+
+def validateTypes( argTypeMap ):
debug = 1
-
+
arg = 0
- for (k,v) in argTypeMap.items():
- if not isinstance(k,v):
+ for ( k, v ) in argTypeMap.items():
+ if not isinstance( k, v ):
parentFile = stack()[1][1]
parentLine = stack()[1][2]
parentName = stack()[1][3]
-
- msg = 'TypeWarning: Arg %i of %s (%s:%i) should be %s. Encountered %s. \n' % (arg, parentName, parentFile, parentLine, v, type(k))
-
- if len(stack()) > 2:
+
+ msg = 'TypeWarning: Arg %i of %s (%s:%i) should be %s. Encountered %s. \n' % ( arg, parentName, parentFile, parentLine, v, type( k ) )
+
+ if len( stack() ) > 2:
grandParentFile = stack()[2][1]
grandParentLine = stack()[2][2]
grandParentName = stack()[2][3]
-
- msg += 'Referenced from %s:%i in %s\n' % (grandParentFile, grandParentLine, grandParentName)
-
+
+ msg += 'Referenced from %s:%i in %s\n' % ( grandParentFile, grandParentLine, grandParentName )
+
if debug == 1:
- sys.stderr.write(msg)
+ sys.stderr.write( msg )
elif debug == 2:
raise TypeError, msg
return False
return True
-def info(fname, expected, actual, flag):
+def info( fname, expected, actual, flag ):
""" Convenience function returns nicely formatted error/warning msg. """
- format = lambda types: ', '.join([str(t).split("'")[1] for t in types])
- expected, actual = format(expected), format(actual)
+ format = lambda types: ', '.join( [str( t ).split( "'" )[1] for t in types] )
+ expected, actual = format( expected ), format( actual )
msg = "'%s' method " % fname \
- + ("accepts", "returns")[flag] + " (%s), but " % expected\
- + ("was given", "result is")[flag] + " (%s)" % actual
+ + ( "accepts", "returns" )[flag] + " (%s), but " % expected\
+ + ( "was given", "result is" )[flag] + " (%s)" % actual
return msg
-
-def prop(func):
+
+def prop( func ):
'''A decorator function for easy property creation.
>>> class CLS(object):
@@ -186,13 +148,13 @@
'''
ops = func() or {}
- name=ops.get('name') or ops.get('prefix','_')+func.__name__ # property name
- fget=ops.get('fget',lambda self:getattr(self, name))
- fset=ops.get('fset',lambda self,value:setattr(self,name,value))
- fdel=ops.get('fdel',lambda self:delattr(self,name))
- return property ( fget, fset, fdel, ops.get('doc',func.__doc__ or '') )
+ name = ops.get( 'name' ) or ops.get( 'prefix', '_' ) + func.__name__ # property name
+ fget = ops.get( 'fget', lambda self:getattr( self, name ) )
+ fset = ops.get( 'fset', lambda self, value:setattr( self, name, value ) )
+ fdel = ops.get( 'fdel', lambda self:delattr( self, name ) )
+ return property ( fget, fset, fdel, ops.get( 'doc', func.__doc__ or '' ) )
-def boundedInt(func):
+def boundedInt( func ):
'''
A bounded integer. See @prop for syntax.
Set the 'max' field to set a wrap-around value.
@@ -213,63 +175,42 @@
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
'''
ops = func() or {}
- upperBound = ops.get('max',1) # default to bound it to 2
+ upperBound = ops.get( 'max', 1 ) # default to bound it to 2
wrapValue = upperBound + 1
-
- name=ops.get('prefix','_')+func.__name__ # property name
- fget = lambda self: getattr(self,name) % upperBound
- fset = lambda self,value: setattr(self,name, (value % wrapValue))
- fdel = lambda self: delattr(self,value)
- return property (fget, fset, fdel, ops.get('doc','') )
+
+ name = ops.get( 'prefix', '_' ) + func.__name__ # property name
+ fget = lambda self: getattr( self, name ) % upperBound
+ fset = lambda self, value: setattr( self, name, ( value % wrapValue ) )
+ fdel = lambda self: delattr( self, name )
+ return property ( fget, fset, fdel, ops.get( 'doc', '' ) )
-def uint32(func):
- max = 2**32
+def uint32( func ):
+ max = 2 ** 32
ops = func() or {}
- name=ops.get('prefix','_')+func.__name__ # property name
- fget = lambda self: getattr(self,name)
- fset = lambda self,value: setattr(self, name, (value % max))
- fdel = lambda self: delattr(self,value)
- return property (fget, fset, fdel, func.__doc__)
+ name = ops.get( 'prefix', '_' ) + func.__name__ # property name
+ fget = lambda self: getattr( self, name )
+ fset = lambda self, value: setattr( self, name, ( value % max ) )
+ fdel = lambda self: delattr( self, name )
+ return property ( fget, fset, fdel, func.__doc__ )
-def uint16(func):
- max = 2**16
+def uint16( func ):
+ max = 2 ** 16
ops = func() or {}
- name=ops.get('prefix','_')+func.__name__ # property name
- fget = lambda self: getattr(self,name)
- fset = lambda self,value: setattr(self, name, (value % max))
- fdel = lambda self: delattr(self,value)
- return property (fget, fset, fdel, func.__doc__)
+ name = ops.get( 'prefix', '_' ) + func.__name__ # property name
+ fget = lambda self: getattr( self, name )
+ fset = lambda self, value: setattr( self, name, ( value % max ) )
+ fdel = lambda self: delattr( self, name )
+ return property ( fget, fset, fdel, func.__doc__ )
+def synchronized( lock ):
+ """ Synchronization decorator. """
-def uint(limit=2**32):
- '''
- >>> from pcsextension.decorators import *
- >>> lim = 5
- >>> class A(object):
- ... @uint(lim)
- ... def x(): pass
- ... _x = 0
- ...
- _x
- 5
- >>> a = A()
- >>> l = []
- >>> for i in range(0,lim*2):
- ... a.x = i
- ... l += [a.x]
- ...
- >>> print l
- [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]
- '''
- def unsignedInteger(func):
- ops = func() or {}
- name=ops.get('prefix','_')+func.__name__ # property name
-
- print name
- print max
-
- fget = lambda self: getattr(self,name)
- fset = lambda self,value: setattr(self, name, (value % max))
- fdel = lambda self: delattr(self, value)
- return property(fget, fset, fdel)
- return unsignedInteger+ def wrap( f ):
+ def newFunction( *args, **kw ):
+ lock.acquire()
+ try:
+ return f( *args, **kw )
+ finally:
+ lock.release()
+ return newFunction
+ return wrap
==== //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcsextension/field.py#3 (text+ko) ====
@@ -20,13 +20,13 @@
def __init__( self, default = 0, width = 8, networkByteOrder = False ):
self.width = width
self.networkByteOrder = networkByteOrder
-
+
if isinstance( default, int ):
self.setInteger( default )
if isinstance( default, str ):
self.setAscii( default )
- if isinstance( default, Field):
- self.setNetworkBytes(default.getNetworkBytes())
+ if isinstance( default, Field ):
+ self.setNetworkBytes( default.getNetworkBytes() )
def setAscii( self, x ):
'''
@@ -148,4 +148,4 @@
elif self.width == 8:
if ( self.width == 8 and len( self.getBytes() ) > self.width * 8 ) or \
( self.getInteger() > ( ( 2 ** self.width ) - 1 ) ):
- raise Exception, "Value exceeds bit-width %i" % self.width+ raise Exception, "Value exceeds bit-width %i" % self.width
==== //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcsextension/ipAddress.py#6 (text+ko) ====
@@ -4,13 +4,12 @@
@author: zach
'''
-from socket import inet_ntoa, inet_aton, htons, ntohs, htonl, ntohl, inet_pton, inet_ntop
from struct import pack, unpack
from field import Field
-from socket import IPPROTO_IP, IPPROTO_IPV6, AF_INET, AF_INET6, htonl, ntohl
+from socket import IPPROTO_IP, IPPROTO_IPV6, AF_INET, AF_INET6, inet_ntoa, inet_aton, htons, ntohs, htonl, ntohl, inet_pton, inet_ntop
class IpAddress( Field ):
- '''
+ '''
Stores an IP address, and provides helper methods to retrieve the IP address.
Unless specified, all byte orders are host-byte-order.
'''
@@ -20,11 +19,11 @@
def __init__( self, default = 0, width = None, networkByteOrder = False, version = AF_INET ):
self.version = version
Field.__init__( self, width = width, default = default, networkByteOrder = networkByteOrder )
-
+
# Override the default Field.__init__ behavior. If the string's length is 4, it is obviously
# a byte-string as opposed to an IP address.
- if type(default) == str:
- if len(default) == 4:
+ if type( default ) == str:
+ if len( default ) == 4:
self.nbo = default
def setAscii( self, x ):
@@ -52,7 +51,7 @@
return unpack( "!L", self.nbo )[0]
def setNetworkInteger( self, x ):
- self.nbo = pack( "!L", ntohl( x ) )
+ self.nbo = pack( "!L", ntohl( x ) )
def getNetworkInteger( self ):
return htonl( unpack( "!L", self.nbo )[0] )
==== //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/pcsextension/networkPort.py#5 (text+ko) ====
@@ -51,10 +51,10 @@
self.ho = ntohs( x )
def getNetworkInteger( self ):
- print "%s %s" % (type(self.ho), self.ho)
+ print "%s %s" % ( type( self.ho ), self.ho )
return htons( self.ho )
-
- def getPCS(self):
+
+ def getPCS( self ):
return self.getInteger()
def __eq__( self, x ):
==== //depot/projects/soc2009/zjriggl_tcpregression/src/tcpregression/tcpstatemachine.py#9 (text+ko) ====
@@ -8,7 +8,7 @@
from pcs.packets import tcp, payload
from pcsextension import findTcpLayer
from pcsextension.checksum import tcpChecksum
-from pcsextension.decorators import prop, validateTypes, uint16, uint32
+from pcsextension.decorators import prop, validateTypes, uint16, uint32, synchronized
from pcsextension.hwAddress import HwAddress
from pcsextension.ipAddress import IpAddress
from pcsextension.networkPort import NetworkPort
@@ -17,10 +17,11 @@
from tcpConstructor import tcpConstructor
from tcpFilter import tcpFilter
from tcprecvdaemon import TcpRecvDaemon
-from tcpsenddaemon import TcpSendDaemon
-from tcpstates import CLOSE_WAIT,CLOSED,CLOSING,ESTABLISHED,FIN_WAIT_1,FIN_WAIT_2, \
+from tcpsenddaemon import TcpSendDaemon
+from tcpstates import CLOSE_WAIT, CLOSED, CLOSING, ESTABLISHED, FIN_WAIT_1, FIN_WAIT_2, \
LAST_ACK, LISTEN, SYN_RECEIVED, SYN_SENT, TIME_WAIT, TcpState, synchronizedStates, tcpStates
from time import time
+from threading import RLock
import pcap
import pcs
import testconfig
@@ -119,22 +120,23 @@
__connector = tcpFilter( testconfig.interface )
__recvThread = None
__sendThread = None
+ lock = RLock()
# @uint32
@prop
- def snd_nxt():
+ def snd_nxt():
'''
Next sequence to be sent (SND.NXT).
This is automatically calculated based on the next-available index
in outboundSequences. However, if the value is set directly, it is overridden.
Set it to None to re-enable auto-calculation
- '''
+ '''
return {'fget': lambda self: self._snd_nxt or self.outboundSequences.nextIndex }
-
+
_snd_nxt = None # Define snd_nxt to allow it to be overridden
-
+
@prop
- def snd_una():
+ def snd_una():
'''
First (i.e. oldest) unacknowledged sequence (SND.UNA).
This is automatically calculated based on the first index in outboundSequences.
@@ -142,32 +144,32 @@
remove any information from the retransmit queue with a lower SEQ #.
'''
return {'fget': lambda self: self.outboundSequences.base,
- 'fset': lambda self, x: self.outboundSequences.setBase(x) }
+ 'fset': lambda self, x: self.outboundSequences.setBase( x ) }
# _snd_una = # Not necessary...
-
+
@uint16
def snd_wnd(): ''' Send window size (SND.WND) '''
_snd_wnd = 0
-
+
@uint16
def snd_up(): ''' Send urgent pointer '''
_snd_up = 0
-
+
@uint32
- def snd_wl1(): ''' Sequence number used for last window update. '''
+ def snd_wl1(): ''' Sequence number used for last window update. '''
_snd_wl1 = 0
-
+
@uint32
def snd_wl2(): ''' Ack number used for last window update '''
_snd_wl2 = 0
-
+
@prop
def iss():
''' Initial Send Sequence (ISS) '''
- return {'fset': lambda self, x: self.setISS(x) }
+ return {'fset': lambda self, x: self.setISS( x ) }
_iss = 0
-
- def setISS(self, iss):
+
+ def setISS( self, iss ):
'''
Sets the ISS, and also updates the outboundSequences base to reflect
the new ISS. Any information in outboundSequences is deleted.
@@ -177,31 +179,32 @@
# self.outboundSequences.base = iss
self.outboundSequences = []
self.outboundSequences.base = iss
-
+
@uint16
def rcv_wnd(): ''' Receive Window (RCV.WND) '''
- _rcv_wnd = 2**16 - 1
-
+ _rcv_wnd = 2 ** 16 - 1
+
@uint16
def rcv_up(): ''' Receive Urgent Pointer '''
_rcv_up = 0
-
+
@prop
def irs():
''' Initial Receive Sequence (IRS) '''
- return {'fset': lambda self,x: self.setIRS(x)}
+ return {'fset': lambda self, x: self.setIRS( x )}
_irs = 0
-
- def setIRS(self,irs):
+
+ def setIRS( self, irs ):
'''
@see setISS
'''
self._irs = irs
self.inboundSequences.base = irs
+ self.inboundSequences = []
del self.inboundSequences[:]
# self.inboundSequences = segmentBuffer([], irs, self.inboundSequences.limit)
# self.inboundSequences.base = irs
-
+
# @uint32
# def rcv_nxt():
@prop
@@ -219,14 +222,14 @@
msl = 2 * 60 # Maximum Segment Lifetime. Arbitrarily defined in the RFC to 2 minutes
timeout = 2 * msl # Timeout
- @prop
- def processPacketsOnArrival():
+ @prop
+ def processPacketsOnArrival():
'''
Flag used to start/stop the recv'er thread from processing additional packets.
Default is True.
'''
_processPacketsOnArrival = True
-
+
@prop
def autoResendUnackedSequences():
'''
@@ -260,26 +263,26 @@
@prop
def remotePort(): '''Remote port.'''
_remotePort = NetworkPort( default = testconfig.remotePort )
-
+
@prop
def userTimer(): ''' User timeout timer '''
_userTimer = None
-
+
@prop
def timeWaitTimer(): ''' Time-wait timer '''
_timeWaitTimer = None
-
+
# Interface is actually a shortcut to the connector's interface field,
# which is itself a property. Setting a TcpStateMachine's interface will
# effectively trigger the tcpFilter object to switch interfaces to the
# specified interface.
@prop
- def interface():
+ def interface():
'''Interface to use for sending/recving data'''
return {'fget': lambda self: self.__connector.interface,
- 'fset': lambda self,x: setattr(self.__connector,'interface',x)}
+ 'fset': lambda self, x: setattr( self.__connector, 'interface', x )}
- def getConnector(self):
+ def getConnector( self ):
'''
Retrieves the connector used to send and receive packets.
Note: The name 'connector' is simply for consistency. The object that is
@@ -292,20 +295,20 @@
Call with lb=True to omit the ethernet layer with a loopback layer in its place.
This should be done when using lo0 instead of eth0, or the source and destination
IP address are the same.
- '''
+ '''
self.__constructor.loopback = lb
# Override the interface
- if lb and (self.interface not in self.loopbackInterfaces):
+ if lb and ( self.interface not in self.loopbackInterfaces ):
self.log.warn( 'Overriding interface to be %s' % self.loopbackInterfaces[0] )
-
+
devs = [dev[0] for dev in pcap.findalldevs()]
- loInterface = (iface for iface in self.loopbackInterfaces if iface in devs)
-
- if len(loInterface) < 1:
- self.log.error('cannot set loopback, could not identify any '
+ loInterface = ( iface for iface in self.loopbackInterfaces if iface in devs )
+
+ if len( loInterface ) < 1:
+ self.log.error( 'cannot set loopback, could not identify any '
' loopback interfaces in available interfaces (%s) out '
- ' of known loopback interfaces (%s)' % (devs, self.loopbackInterfaces))
+ ' of known loopback interfaces (%s)' % ( devs, self.loopbackInterfaces ) )
else :
# Select the first interface
self.interface = loInterface[0]
@@ -319,7 +322,7 @@
def mtu(): '''Maximum Tranmission Unit'''
_mtu = testconfig.mtu
- def isSynchronized(self):
+ def isSynchronized( self ):
'''
Is the connection in a synchronized state?
Return True if yes, otherwise False.
@@ -360,12 +363,12 @@
#tcp.f_dport: True,
'transition': True }
- def generateISS(self):
+ def generateISS( self ):
'''
Generates a new Initial Sequence Number (ISS).
'''
- return seq(random.randint(0,(1 << 32)-1))
-
+ return seq( random.randint( 0, ( 1 << 32 ) - 1 ) )
+
# def _updateSegmentBuffer(self, newBuffer, oldBuffer):
# # If it's the same object, just return it.
# if newBuffer is oldBuffer:
@@ -378,7 +381,7 @@
#
# # If it is the correct type, but is just a new buffer, assign it.
# return newBuffer
-
+
@prop
def outboundSequences():
'''
@@ -395,25 +398,25 @@
Note that this implementation does not gracefully deal with wrap, i.e. when the
sequence number overflows 2**32.
'''
- return {'fset': lambda self,x: self.outboundSequences.update(x) }
+ return {'fset': lambda self, x: self.outboundSequences.update( x ) }
_outboundSequences = segmentBuffer()
-
+
@prop
def inboundSequences():
'''
List of all received sequences. This includes data recv'd from IRS onward.
@see outboundSequences for more information.
'''
- return {'fset': lambda self,x: self.inboundSequences.update(x) }
+ return { 'fset': lambda self, x: self.inboundSequences.update( x ) }
_inboundSequences = segmentBuffer()
-
+
@prop
def retransmissionQ():
'''
Sent data that has not been acknowledged.
'''
return {'fget': lambda self: self.outboundSequences[self.snd_una:]}
-
+
@prop
def recvBuffer():
'''
@@ -421,50 +424,17 @@
Note that this buffer will explicitly exclude all SYN and FIN sequences.
@see inboundSequences
'''
- return {'fget':
- lambda self:
+ return {'fget':
+ lambda self:
[octet for octet in self.inboundSequences[seq( self.recvBufferOffset + self.irs ):] \
- if type(octet) != sequenced or not (octet.syn or octet.ack) ]
+ if type( octet ) != sequenced or not ( octet.syn or octet.ack ) ]
}
-
+
@prop
def recvBufferOffset():
return {'fget': lambda self: self.inboundSequences.base,
- 'fset': lambda self, x: self.inboundSequences.setBase(x) }
-# @uint32
-# def _recvBufferOffset():
-# '''
-# Offset to the 'read' pointer in recvBuffer. This offset is relative to IRS,
-# which is the first item in inboundSequences
-# '''
-# __recvBufferOffset = 0
-
-# @prop
-# def packetsSent():
-# return {'doc': 'List of all packets the have been sent.' }
-# _packetsSent = []
-#
-# @prop
-# def packetsSentAcked():
-# return {'doc': 'List of all packets the have been sent, for which '
-# 'an ACKnowledgement message has not been received.'}
-# _packetsSentAcked = []
-#
-# @prop
-# def packetsRecvd():
-# return {'doc': 'List of all packets the have been received, but have not been ACKnowledged. '
-# 'Upon receiving, a packet will be put into this buffer. If its sequence number is rcv_nxt, '
-# 'it is moved to packetsRecvdAcked, and rcv_next is updated.'}
-# _packetsRecvd = []
-# _packetsRecvdOffset = 0
-#
-# @prop
-# def packetsRecvdAcked():
-# return {'doc': 'List of all packets the have been received, but have not '
-# 'been ACKnowledged.'}
-# _packetsRecvdAcked = []
+ 'fset': lambda self, x: self.inboundSequences.setBase( x ) }
-
@prop
def state():
return {'fset': lambda self, x: self.setState( x ),
@@ -493,14 +463,14 @@
connName = 'Connection naming not supported'
recvWindow = str( self.rcv_wnd )
sendWindow = str( self.snd_wnd )
- state = str(self.state)
- nbaAck = len(self.retransmissionQ)
+ state = str( self.state )
+ nbaAck = len( self.retransmissionQ )
# TODO TODO TODO
# This should be the number of octets that have been received, but have
# not been accounted for in an 'ACK' message to the other side.
# TODO TODO TODO
- nbpRecpt = 0
-
+ nbpRecpt = 0
+
# TODO TODO TODO
# Urgent state is not currently supported, and will be added later as
# tests call for its use.
@@ -513,8 +483,8 @@
return ( localSocket, remoteSocket, connName, recvWindow, sendWindow, state,
nbaAck, nbpRecpt, urgState, precedence, security, timeout )
- def __repr__(self):
-
+ def __repr__( self ):
+
return self.__class__.__name__ + '( (%s,%s), (%s,%s) )' % \
( self.localIP, self.localPort, self.remoteIP, self.remotePort )
@@ -555,38 +525,36 @@
# Is the state a valid state?
if state in tcpStates:
- # if ( not self.validate['transition'] ) or ( state in self.state.next ):
- # if ( not validateTransition ) or ( state in self.state.next ):
action = "Setting"
if validateTransition:
action = "Advancing"
self.log.state( "%s state from %s to %s" % ( action, self.state, state ) )
-
+
if state not in self.state.next:
self.log.state( "Performing non-valid state transition from %s to %s" %
( self._lastState, self.state ) )
-
+
self._lastState = self._state
self._state = state
-
+
# If we are transitioning OUT of closed state, start the threads.
if self._lastState == CLOSED:
self.__recvThread = TcpRecvDaemon( self )
self.__sendThread = TcpSendDaemon( self )
self.__recvThread.start()
self.__sendThread.start()
-
+
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list