#!/usr/bin/python
import socket
import fcntl
import struct
import netifaces as ni
from mininet.topo import Topo
from mininet.net import Mininet
from mininet.node import Node
from mininet.log import setLogLevel, info
from mininet.cli import CLI
def ip_checksum( void* vdata, size_t length) :
char* data= ( char*) vdata
uint32_t acc= 0xffff
size_t i= 0
for i< length :
uint16_t word
memcpy( &word, data+i, 2 )
acc+= ntohs( word)
if acc> 0xffff :
acc-= 0xffff
i+= 2
if length&1 :
uint16_t word= 0
memcpy( &word, data+length-1 , 1 )
acc+= ntohs( word)
if acc> 0xffff :
acc-= 0xffff
return htons( ~ acc)
class LinuxRouter( Node ) :
"A Node with IP forwarding enabled."
def config( self , **params ) :
super ( LinuxRouter, self ) .config ( **params )
# Enable forwarding on the router
self .cmd ( 'sysctl net.ipv4.ip_forward=1' )
def terminate( self ) :
self .cmd ( 'sysctl net.ipv4.ip_forward=0' )
super ( LinuxRouter, self ) .terminate ( )
class NetworkTopo( Topo ) :
"A LinuxRouter connecting three IP subnets"
def build( self , **_opts ) :
defaultIP = '192.168.1.1/24' # IP address for r0-eth1
router = self .addNode ( 'r0' , cls= LinuxRouter, ip= defaultIP )
s1, s2, s3 = [ self .addSwitch ( s ) for s in ( 's1' , 's2' , 's3' ) ]
self .addLink ( s1, router, intfName2= 'r0-eth1' ,
params2= { 'ip' : defaultIP } ) # for clarity
self .addLink ( s2, router, intfName2= 'r0-eth2' ,
params2= { 'ip' : '172.16.0.1/12' } )
self .addLink ( s3, router, intfName2= 'r0-eth3' ,
params2= { 'ip' : '10.0.0.1/8' } )
h1x1 = self .addHost ( 'h1x1' , ip= '192.168.1.101/24' , mac= '00:00:00:00:00:11' ,
defaultRoute= 'via 192.168.1.1' )
h1x2 = self .addHost ( 'h1x2' , ip= '192.168.1.102/24' , mac= '00:00:00:00:00:12' ,
defaultRoute= 'via 192.168.1.1' )
h2x1 = self .addHost ( 'h2x1' , ip= '172.16.0.101/12' , mac= '00:00:00:00:00:21' ,
defaultRoute= 'via 172.16.0.1' )
h2x2 = self .addHost ( 'h2x2' , ip= '172.16.0.102/12' , mac= '00:00:00:00:00:22' ,
defaultRoute= 'via 172.16.0.1' )
h3x1 = self .addHost ( 'h3x1' , ip= '10.0.0.101/8' , mac= '00:00:00:00:00:31' ,
defaultRoute= 'via 10.0.0.1' )
h3x2 = self .addHost ( 'h3x2' , ip= '10.0.0.102/8' , mac= '00:00:00:00:00:32' ,
defaultRoute= 'via 10.0.0.1' )
for h, s in [ ( h1x1, s1) , ( h1x2, s1) , ( h2x1, s2) , ( h2x2, s2) , ( h3x1, s3) , ( h3x2, s3) ] :
self .addLink ( h, s )
def run( ) :
topo = NetworkTopo( )
net = Mininet( topo= topo ) # controller is used by s1-s3
net.start ( )
info( '*** Routing Table on Router:\n ' )
info( net[ 'r0' ] .cmd ( 'route' ) )
mode= raw_input ( ‘send or recv’)
interfacename= rawinput( 'input interfacename' )
intfIP= ni.ifaddresses ( interfacename) [ ni.AF_INET ] [ 0 ] [ 'addr' ]
if mode == 'send' :
destIP= rawinput( 'input destIP' )
routerIP= rawinput( 'input router' )
buf= rawinput( 'input message' )
message= ip_checksum( buf, 20 )
s= socket .socket ( socket .AF_INET , socket .SOCK_DGRAM )
s.bind ( ( intfIP, 7777 ) )
s.send ( buf)
s.close
elif mode == 'recv' :
s= socket .socket ( socket .AF_INET , socket .SOCK_DGRAM )
s.bind ( ( intfIP, 7777 ) )
data = s.recv ( 2048 )
print ( 'receive:' )
print data
s.close
else :
print ( '' Error')
exit()
if __name__ == ' __main__ ':
setLogLevel( ' info' )
run()
IyEvdXNyL2Jpbi9weXRob24KCmltcG9ydCBzb2NrZXQKaW1wb3J0IGZjbnRsCmltcG9ydCBzdHJ1Y3QKaW1wb3J0IG5ldGlmYWNlcyBhcyBuaQoKZnJvbSBtaW5pbmV0LnRvcG8gaW1wb3J0IFRvcG8KZnJvbSBtaW5pbmV0Lm5ldCBpbXBvcnQgTWluaW5ldApmcm9tIG1pbmluZXQubm9kZSBpbXBvcnQgTm9kZQpmcm9tIG1pbmluZXQubG9nIGltcG9ydCBzZXRMb2dMZXZlbCwgaW5mbwpmcm9tIG1pbmluZXQuY2xpIGltcG9ydCBDTEkKCmRlZiBpcF9jaGVja3N1bSh2b2lkKiB2ZGF0YSxzaXplX3QgbGVuZ3RoKToKICAgIGNoYXIqIGRhdGE9KGNoYXIqKXZkYXRhCiAgICB1aW50MzJfdCBhY2M9MHhmZmZmCiAgICBzaXplX3QgaT0wCiAgICBmb3IgaTxsZW5ndGggOgogICAgICB1aW50MTZfdCB3b3JkCiAgICAgIG1lbWNweSgmd29yZCxkYXRhK2ksMikKICAgICAgYWNjKz1udG9ocyh3b3JkKQogICAgICBpZiBhY2M+MHhmZmZmIDoKICAgICAgICAgIGFjYy09MHhmZmZmCiAgICAgIGkrPTIKICAgIAogICAKICAgIGlmIGxlbmd0aCYxIDoKICAgICAgdWludDE2X3Qgd29yZD0wCiAgICAgIG1lbWNweSgmd29yZCxkYXRhK2xlbmd0aC0xLDEpCiAgICAgIGFjYys9bnRvaHMod29yZCkKICAgICAgaWYgYWNjPjB4ZmZmZiA6CiAgICAgICAgIGFjYy09MHhmZmZmCiAgICAKICAgIAogICAgcmV0dXJuIGh0b25zKH5hY2MpCiAgICAKCmNsYXNzIExpbnV4Um91dGVyKCBOb2RlICk6CiAgICAiQSBOb2RlIHdpdGggSVAgZm9yd2FyZGluZyBlbmFibGVkLiIKCiAgICBkZWYgY29uZmlnKCBzZWxmLCAqKnBhcmFtcyApOgogICAgICAgIHN1cGVyKCBMaW51eFJvdXRlciwgc2VsZikuY29uZmlnKCAqKnBhcmFtcyApCiAgICAgICAgIyBFbmFibGUgZm9yd2FyZGluZyBvbiB0aGUgcm91dGVyCiAgICAgICAgc2VsZi5jbWQoICdzeXNjdGwgbmV0LmlwdjQuaXBfZm9yd2FyZD0xJyApCgogICAgZGVmIHRlcm1pbmF0ZSggc2VsZiApOgogICAgICAgIHNlbGYuY21kKCAnc3lzY3RsIG5ldC5pcHY0LmlwX2ZvcndhcmQ9MCcgKQogICAgICAgIHN1cGVyKCBMaW51eFJvdXRlciwgc2VsZiApLnRlcm1pbmF0ZSgpCgpjbGFzcyBOZXR3b3JrVG9wbyggVG9wbyApOgogICAgIkEgTGludXhSb3V0ZXIgY29ubmVjdGluZyB0aHJlZSBJUCBzdWJuZXRzIgoKICAgIGRlZiBidWlsZCggc2VsZiwgKipfb3B0cyApOgoKICAgICAgICBkZWZhdWx0SVAgPSAnMTkyLjE2OC4xLjEvMjQnICAjIElQIGFkZHJlc3MgZm9yIHIwLWV0aDEKICAgICAgICByb3V0ZXIgPSBzZWxmLmFkZE5vZGUoICdyMCcsIGNscz1MaW51eFJvdXRlciwgaXA9ZGVmYXVsdElQICkKCiAgICAgICAgczEsIHMyLCBzMyA9IFsgc2VsZi5hZGRTd2l0Y2goIHMgKSBmb3IgcyBpbiAoICdzMScsICdzMicsICdzMycgKSBdCgogICAgICAgIHNlbGYuYWRkTGluayggczEsIHJvdXRlciwgaW50Zk5hbWUyPSdyMC1ldGgxJywKICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczI9eyAnaXAnIDogZGVmYXVsdElQIH0gKSAgIyBmb3IgY2xhcml0eQogICAgICAgIHNlbGYuYWRkTGluayggczIsIHJvdXRlciwgaW50Zk5hbWUyPSdyMC1ldGgyJywKICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczI9eyAnaXAnIDogJzE3Mi4xNi4wLjEvMTInIH0gKQogICAgICAgIHNlbGYuYWRkTGluayggczMsIHJvdXRlciwgaW50Zk5hbWUyPSdyMC1ldGgzJywKICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczI9eyAnaXAnIDogJzEwLjAuMC4xLzgnIH0gKQoKICAgICAgICBoMXgxID0gc2VsZi5hZGRIb3N0KCAnaDF4MScsIGlwPScxOTIuMTY4LjEuMTAxLzI0JywgbWFjPScwMDowMDowMDowMDowMDoxMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRSb3V0ZT0ndmlhIDE5Mi4xNjguMS4xJyApCiAgICAgICAgaDF4MiA9IHNlbGYuYWRkSG9zdCggJ2gxeDInLCBpcD0nMTkyLjE2OC4xLjEwMi8yNCcsIG1hYz0nMDA6MDA6MDA6MDA6MDA6MTInLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Um91dGU9J3ZpYSAxOTIuMTY4LjEuMScgKQogICAgICAgIGgyeDEgPSBzZWxmLmFkZEhvc3QoICdoMngxJywgaXA9JzE3Mi4xNi4wLjEwMS8xMicsIG1hYz0nMDA6MDA6MDA6MDA6MDA6MjEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Um91dGU9J3ZpYSAxNzIuMTYuMC4xJyApCiAgICAgICAgaDJ4MiA9IHNlbGYuYWRkSG9zdCggJ2gyeDInLCBpcD0nMTcyLjE2LjAuMTAyLzEyJywgbWFjPScwMDowMDowMDowMDowMDoyMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRSb3V0ZT0ndmlhIDE3Mi4xNi4wLjEnICkKICAgICAgICBoM3gxID0gc2VsZi5hZGRIb3N0KCAnaDN4MScsIGlwPScxMC4wLjAuMTAxLzgnLCBtYWM9JzAwOjAwOjAwOjAwOjAwOjMxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFJvdXRlPSd2aWEgMTAuMC4wLjEnICkKICAgICAgICBoM3gyID0gc2VsZi5hZGRIb3N0KCAnaDN4MicsIGlwPScxMC4wLjAuMTAyLzgnLCBtYWM9JzAwOjAwOjAwOjAwOjAwOjMyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFJvdXRlPSd2aWEgMTAuMC4wLjEnICkKCiAgICAgICAgZm9yIGgsIHMgaW4gWyAoaDF4MSwgczEpLCAoaDF4MiwgczEpLCAoaDJ4MSwgczIpLCAoaDJ4MiwgczIpLCAoaDN4MSwgczMpLCAoaDN4MiwgczMpIF06CiAgICAgICAgICAgIHNlbGYuYWRkTGluayggaCwgcyApCgpkZWYgcnVuKCk6CgogICAgdG9wbyA9IE5ldHdvcmtUb3BvKCkKICAgIG5ldCA9IE1pbmluZXQoIHRvcG89dG9wbyApICAjIGNvbnRyb2xsZXIgaXMgdXNlZCBieSBzMS1zMwogICAgbmV0LnN0YXJ0KCkKICAgIGluZm8oICcqKiogUm91dGluZyBUYWJsZSBvbiBSb3V0ZXI6XG4nICkKICAgIGluZm8oIG5ldFsgJ3IwJyBdLmNtZCggJ3JvdXRlJyApICkKICAgIG1vZGU9cmF3X2lucHV0KOKAmHNlbmQgb3IgcmVjduKAmSkKCiAgICBpbnRlcmZhY2VuYW1lPXJhd2lucHV0KCdpbnB1dCBpbnRlcmZhY2VuYW1lJykKICAgIGludGZJUD0gbmkuaWZhZGRyZXNzZXMoaW50ZXJmYWNlbmFtZSlbbmkuQUZfSU5FVF1bMF1bJ2FkZHInXQoKICAgIGlmIG1vZGUgPT0gJ3NlbmQnOgogICAgICAgICBkZXN0SVA9cmF3aW5wdXQoJ2lucHV0IGRlc3RJUCcpCiAgICAgICAgIHJvdXRlcklQPXJhd2lucHV0KCdpbnB1dCByb3V0ZXInKQogICAgICAgICBidWY9cmF3aW5wdXQoJ2lucHV0IG1lc3NhZ2UnKQoJIG1lc3NhZ2U9aXBfY2hlY2tzdW0oYnVmLCAyMCkKCiAgICAgICAgIHM9c29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfREdSQU0pCiAJIHMuYmluZCgoaW50ZklQLCA3Nzc3KSkKICAgICAgICAgcy5zZW5kKGJ1ZikKCiAgICAgICAgIHMuY2xvc2UKCiAgICBlbGlmIG1vZGUgPT0gJ3JlY3YnOgogICAgICAgICBzPXNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX0RHUkFNKQogCSBzLmJpbmQoKGludGZJUCwgNzc3NykpCiAgICAgICAgIAoJIGRhdGEgPSBzLnJlY3YoMjA0OCkKCSBwcmludCgncmVjZWl2ZTonKQoJIHByaW50IGRhdGEKCiAgICAgICAgIHMuY2xvc2UKCiAgICBlbHNlOgogICAgICAgICBwcmludCgnJ0Vycm9yJykKICAgICAgICAgZXhpdCgpCgoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIHNldExvZ0xldmVsKCAnaW5mbycgKQogICAgcnVuKCkK
compilation info
Traceback (most recent call last):
File "/usr/lib/python3.7/py_compile.py", line 143, in compile
_optimize=optimize)
File "<frozen importlib._bootstrap_external>", line 791, in source_to_code
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "./prog.py", line 14
def ip_checksum(void* vdata,size_t length):
^
SyntaxError: invalid syntax
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/usr/lib/python3.7/py_compile.py", line 147, in compile
raise py_exc
py_compile.PyCompileError: File "./prog.py", line 14
def ip_checksum(void* vdata,size_t length):
^
SyntaxError: invalid syntax
stdout