PERFORCE change 142731 for review
Victor Hugo Bilouro
bilouro at FreeBSD.org
Mon Jun 2 05:25:11 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=142731
Change 142731 by bilouro at bilouro_tcptest on 2008/06/02 05:24:27
added copyright
this version do complete connection establishment and finalization
completelly reorganized
Especial thanks for Anre Oppermann (andre at freebsd dot org)
Affected files ...
.. //depot/projects/soc2008/bilouro_tcptest/src/scripts/tcpconnect.py#4 edit
Differences ...
==== //depot/projects/soc2008/bilouro_tcptest/src/scripts/tcpconnect.py#4 (text+ko) ====
@@ -1,3 +1,38 @@
+# Copyright (c) 2008, Victor Hugo Bilouro
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# Redistributions of source code must retain the above copyright notice,
+# this list of conditions and the following disclaimer.
+#
+# Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# Neither the name of Victor Hugo Bilouro nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# Author: Victor Hugo Bilouro
+#
+# Description: A simple test of three way handshake
+#
+
from pcs.packets import ipv4
from pcs.packets import tcp
from pcs.packets import ethernet
@@ -38,172 +73,304 @@
(options, args) = parser.parse_args()
- ##todo: create syn. test exately equals a tcp dump. DONE
- ##todo: wait with timer the answer possibilities (in this a simple ack-syn) DONE
- ##todo: send an acknoledgment establishing the connection
+ import random
+
+ ipid = random.randrange(1,(1<<16)-1)
+ tcpsport = random.randrange(50000,60000) #int(options.source_port )
+ tcpsequence = random.randrange(1,(1<<32)-1)
+ output = pcs.PcapConnector(options.interface)
+
+ replyip = None
+ replytcp = None
+ reply = None
+ packet = None
- #
- # creating a durty-code ether-ip-tcp-syn packet
- #
- import random
+ # SYN
+ what = "SYN"
- ip = ipv4.ipv4()
+ ip1 = ipv4.ipv4()
- ip.version = 4 # 0100 max 1111 15 *caution* :)
- ip.hlen = 5 # 0101 0 -> min 0101 (20 bytes)
- ip.tos = 0
- ip.id = random.randrange(1,(1<<16)-1)
- ip.flags = 0 #study on book
- ip.offset = 0
- ip.ttl = 64
- ip.protocol = pcs.IPPROTO_TCP #1 ICMP #6 TCP
- ip.src = pcs.inet_atol(options.ip_source)
- ip.dst = pcs.inet_atol(options.ip_target)
+ ip1.version = 4
+ ip1.hlen = 5
+ ip1.tos = 0
+ ip1.id = ++ipid
+ ip1.flags = 0
+ ip1.offset = 0
+ ip1.ttl = 64
+ ip1.protocol = pcs.IPPROTO_TCP
+ ip1.src = pcs.inet_atol(options.ip_source)
+ ip1.dst = pcs.inet_atol(options.ip_target)
+ tcp1 = tcp.tcp()
- tcppkt = tcp.tcp()
+ tcp1.sport = tcpsport
+ tcp1.dport = int(options.destination_port)
+ tcp1.sequence = tcpsequence
+ tcpsequence = tcpsequence + 1 # SYN consumes the sequence
+ tcp1.ack_number = 0
+ tcp1.offset = 5
+ tcp1.urgent = 0
+ tcp1.ack = 0
+ tcp1.push = 0
+ tcp1.reset = 0
+ tcp1.syn = 1
+ tcp1.fin = 0
+ tcp1.window = (1<<16)-1
+ tcp1.urg_point = 0
+ #tcp1.options
- tcppkt.sport = int(options.source_port )
- tcppkt.dport = int(options.destination_port)
- tcppkt.sequence = random.randrange(1,(1<<32)-1)
- tcppkt.ack_number = 0
- tcppkt.offset = 5 #header length
- tcppkt.urgent = 0
- tcppkt.ack = 0
- tcppkt.push = 0
- tcppkt.reset = 0
- tcppkt.syn = 1
- tcppkt.fin = 0
- tcppkt.window = (1<<16)-1
- tcppkt.urg_point = 0
- #tcppkt.options
+ tcp1.checksum = tcp_cksum(tcp1 , ip1)
- tcppkt.checksum = tcp_cksum(tcppkt , ip)
+ ip1.length = len(ip1.bytes) + len(tcp1.bytes)
- ip.length = len(ip.bytes) + len(tcppkt.bytes)
-
# important, only calcs the ip checksum after fill length field
- ip.checksum = ip_cksum(ip)
+ ip1.checksum = ip_cksum(ip1)
- ether = ethernet.ethernet()
- ether.src = ethernet.ether_atob(options.ether_source)
- ether.dst = ethernet.ether_atob(options.ether_destination)
- ether.type = 0x800
+ ether1 = ethernet.ethernet()
+ ether1.src = ethernet.ether_atob(options.ether_source)
+ ether1.dst = ethernet.ether_atob(options.ether_destination)
+ ether1.type = 0x800
- print "\n syn---------------------------------"
- print tcppkt
+ packet = pcs.Chain([ether1, ip1, tcp1])
+
+ print "\n%s---------------------------------" % what
+ print tcp1
print "---------------------------------"
- packet = pcs.Chain([ether, ip, tcppkt])
-
- output = pcs.PcapConnector(options.interface)
-
- # SYN SENT
out = output.write(packet.bytes, len(packet.bytes))
+## SYN
+ # SYN+ACK
+ what = "SYN+ACK"
+ while 1:
+ reply = output.read()
+ packet = ethernet.ethernet(reply)
+ try:
+ replyip = packet.data
+ replytcp = replyip.data
+ if (ip1.src==replyip.dst and \
+ ip1.dst==replyip.src and \
+ tcp1.sport==replytcp.dport and \
+ tcp1.dport==replytcp.sport):
+ break
+ except: #it cannot be a tcp packet (without sport:)
+ pass
+ print "\n%s---------------------------------" % what
+ print packet.data.data
+ print "---------------------------------"
+## SYN+ACK
+ # ACK 134,187
+ what = "ACK (SYN)"
- reply = output.read()
- reply = output.read()
+ ip3 = ipv4.ipv4()
+
+ ip3.version = 4
+ ip3.hlen = 5
+ ip3.tos = 0
+ ip3.id = ++ipid
+ ip3.flags = 0
+ ip3.offset = 0
+ ip3.ttl = 64
+ ip3.protocol = pcs.IPPROTO_TCP
+ ip3.src = pcs.inet_atol(options.ip_source)
+ ip3.dst = pcs.inet_atol(options.ip_target)
+
+ tcp3 = tcp.tcp()
- packet = ethernet.ethernet(reply)
- print "\n syn+ack-----------------------------"
- print packet.data.data
- print "---------------------------------"
+ tcp3.sport = tcpsport
+ tcp3.dport = int(options.destination_port)
+ tcp3.sequence = tcpsequence
+ ##tcpsequence = tcpsequence + 1 # SYN DOES NOT consumes the sequence
+ tcp3.ack_number = replytcp.sequence + 1
+ tcp3.offset = 5
+ tcp3.urgent = 0
+ tcp3.ack = 1
+ tcp3.push = 0
+ tcp3.reset = 0
+ tcp3.syn = 0
+ tcp3.fin = 0
+ tcp3.window = (1<<16)-1
+ tcp3.urg_point = 0
+ #tcp3.options
- #
- # this commented piece dont work.. don't ask me why. (now)
- #
+ tcp3.checksum = tcp_cksum(tcp3 , ip3)
- #tcpreply = packet.data.data
+ ip3.length = len(ip3.bytes) + len(tcp3.bytes)
- #import copy
- #ipack = copy.deepcopy(ip)
- #ipack.id = ip.id + 1
+ # important, only calcs the ip checksum after fill length field
+ ip3.checksum = ip_cksum(ip3)
- #tcpack = copy.deepcopy(tcppkt)
+ ether3 = ethernet.ethernet()
+ ether3.src = ethernet.ether_atob(options.ether_source)
+ ether3.dst = ethernet.ether_atob(options.ether_destination)
+ ether3.type = 0x800
- #tcpack.sequence = 0
- #tcpack.ack_number = tcpreply.sequence + 1
- #tcpack.ack = 1
- #tcpack.syn = 0
- #tcpack.checksum = tcp_cksum(tcpack , ipack)
+ packet = pcs.Chain([ether3, ip3, tcp3])
- # important, only calcs the ip checksum after fill length field
- #ipack.checksum = ip_cksum(ipack)
-
- #packetreply = pcs.Chain([ether, ipack, tcpack])
- #out = output.write(packetreply.bytes, len(packetreply.bytes))
+ print "\n%s---------------------------------" % what
+ print tcp3
+ print "---------------------------------"
- #
- # ANOTHER. this worked! (please don't pay attention in how it was wrote, it's a very durty test, ok?)
- #
+ out = output.write(packet.bytes, len(packet.bytes))
- ipack = ipv4.ipv4()
+## ACK
+ # FIN 188,241
+ what = "FIN"
- ipack.version = 4 # 0100 max 1111 15 *caution* :)
- ipack.hlen = 5 # 0101 0 -> min 0101 (20 bytes)
- ipack.tos = 0
- ipack.id = ip.id + 1
- ipack.flags = 0 #study on book
- ipack.offset = 0
- ipack.ttl = 64
- ipack.protocol = pcs.IPPROTO_TCP #1 ICMP #6 TCP
- ipack.src = pcs.inet_atol(options.ip_source)
- ipack.dst = pcs.inet_atol(options.ip_target)
+ ip4 = ipv4.ipv4()
- tcpreply = packet.data.data
- tcpack = tcp.tcp()
+ ip4.version = 4
+ ip4.hlen = 5
+ ip4.tos = 0
+ ip4.id = ++ipid
+ ip4.flags = 0
+ ip4.offset = 0
+ ip4.ttl = 64
+ ip4.protocol = pcs.IPPROTO_TCP
+ ip4.src = pcs.inet_atol(options.ip_source)
+ ip4.dst = pcs.inet_atol(options.ip_target)
+
+ tcp4 = tcp.tcp()
- tcpack.sport = int(options.source_port )
- tcpack.dport = int(options.destination_port)
- tcpack.sequence = 0
- tcpack.ack_number = tcpreply.sequence + 1
- tcpack.offset = 5 #header length
- tcpack.urgent = 0
- tcpack.ack = 1
- tcpack.push = 0
- tcpack.reset = 0
- tcpack.syn = 0
- tcpack.fin = 0
- tcpack.window = (1<<16)-1
- tcpack.urg_point = 0
- #tcpack.options
+ tcp4.sport = tcpsport
+ tcp4.dport = int(options.destination_port)
+ tcp4.sequence = tcpsequence
+ tcpsequence = tcpsequence + 1 # FIN consumes the sequence
+ tcp4.ack_number = replytcp.sequence + 1
+ tcp4.offset = 5
+ tcp4.urgent = 0
+ tcp4.ack = 1
+ tcp4.push = 0
+ tcp4.reset = 0
+ tcp4.syn = 0
+ tcp4.fin = 1
+ tcp4.window = (1<<16)-1
+ tcp4.urg_point = 0
+ #tcp4.options
- tcpack.checksum = tcp_cksum(tcpack , ipack)
+ tcp4.checksum = tcp_cksum(tcp4 , ip4)
- ipack.length = len(ipack.bytes) + len(tcpack.bytes)
+ ip4.length = len(ip4.bytes) + len(tcp4.bytes)
# important, only calcs the ip checksum after fill length field
- ipack.checksum = ip_cksum(ipack)
+ ip4.checksum = ip_cksum(ip4)
+
+ ether4 = ethernet.ethernet()
+ ether4.src = ethernet.ether_atob(options.ether_source)
+ ether4.dst = ethernet.ether_atob(options.ether_destination)
+ ether4.type = 0x800
+
+ packet = pcs.Chain([ether4, ip4, tcp4])
+
+ print "\n%s---------------------------------" % what
+ print tcp4
+ print "---------------------------------"
+
+ out = output.write(packet.bytes, len(packet.bytes))
- etherack = ethernet.ethernet()
- etherack.src = ethernet.ether_atob(options.ether_source)
- etherack.dst = ethernet.ether_atob(options.ether_destination)
- etherack.type = 0x800
+## FIN
+ # ACK (FIN)
+ what = "ACK (FIN)"
- packetack = pcs.Chain([etherack, ipack, tcpack])
- out = output.write(packetack.bytes, len(packetack.bytes))
+ while 1:
+ reply = output.read()
+ packet = ethernet.ethernet(reply)
+ try:
+ replyip = packet.data
+ replytcp = replyip.data
+ if (ip1.src==replyip.dst and \
+ ip1.dst==replyip.src and \
+ tcp1.sport==replytcp.dport and \
+ tcp1.dport==replytcp.sport):
+ break
+ except: #it cannot be a tcp packet (without sport:)
+ pass
- print "\n ack---------------------------------"
- print tcpack
+ print "\n%s---------------------------------" % what
+ print packet.data.data
print "---------------------------------"
- # /ANOTHER
+
+## ACK (FIN)
+ # FIN
+ what = "FIN"
- reply = output.read()
while 1:
- try:
- reply = output.read()
- packet = ethernet.ethernet(reply)
- if packet.data.data.sport == 22022:
- print "\n-----------------------------"
- print packet.data.data
- print "---------------------------------"
- except:
+ reply = output.read()
+ packet = ethernet.ethernet(reply)
+ try:
+ replyip = packet.data
+ replytcp = replyip.data
+ if (ip1.src==replyip.dst and \
+ ip1.dst==replyip.src and \
+ tcp1.sport==replytcp.dport and \
+ tcp1.dport==replytcp.sport):
+ break
+ except: #it cannot be a tcp packet (without sport:)
pass
+ print "\n%s---------------------------------" % what
+ print packet.data.data
+ print "---------------------------------"
+
+## FIN
+ # ACK (FIN) 288,341
+ what = "ACK (FIN)"
+
+ ip7 = ipv4.ipv4()
+
+ ip7.version = 4
+ ip7.hlen = 5
+ ip7.tos = 0
+ ip7.id = ++ipid
+ ip7.flags = 0
+ ip7.offset = 0
+ ip7.ttl = 64
+ ip7.protocol = pcs.IPPROTO_TCP
+ ip7.src = pcs.inet_atol(options.ip_source)
+ ip7.dst = pcs.inet_atol(options.ip_target)
+
+ tcp7 = tcp.tcp()
+
+ tcp7.sport = tcpsport
+ tcp7.dport = int(options.destination_port)
+ tcp7.sequence = tcpsequence
+ ##tcpsequence = tcpsequence + 1 # SYN DOES NOT consumes the sequence
+ tcp7.ack_number = replytcp.sequence + 1
+ tcp7.offset = 5
+ tcp7.urgent = 0
+ tcp7.ack = 1
+ tcp7.push = 0
+ tcp7.reset = 0
+ tcp7.syn = 0
+ tcp7.fin = 0
+ tcp7.window = (1<<16)-1
+ tcp7.urg_point = 0
+ #tcp7.options
+
+ tcp7.checksum = tcp_cksum(tcp7 , ip7)
+
+ ip7.length = len(ip7.bytes) + len(tcp7.bytes)
+
+ # important, only calcs the ip checksum after fill length field
+ ip7.checksum = ip_cksum(ip7)
+
+ ether7 = ethernet.ethernet()
+ ether7.src = ethernet.ether_atob(options.ether_source)
+ ether7.dst = ethernet.ether_atob(options.ether_destination)
+ ether7.type = 0x800
+
+ packet = pcs.Chain([ether7, ip7, tcp7])
+
+ print "\n%s---------------------------------" % what
+ print tcp7
+ print "---------------------------------"
+
+ out = output.write(packet.bytes, len(packet.bytes))
+
+## ACK (FIN)
def tcp_cksum(self, ip, data = ""): #TODO: add this method to pcs tcp.py
"""return tcpv4 checksum"""
More information about the p4-projects
mailing list