nabaztag_hack_kit 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +7 -0
- data/.travis.yml +3 -0
- data/CHANGELOG.md +11 -0
- data/Gemfile +4 -0
- data/README.md +119 -0
- data/Rakefile +21 -0
- data/bin/mtl_comp +41 -0
- data/bin/mtl_merge +22 -0
- data/bin/mtl_simu +40 -0
- data/bytecode/lib/buffer.mtl +109 -0
- data/bytecode/lib/button.mtl +27 -0
- data/bytecode/lib/data_helper.mtl +88 -0
- data/bytecode/lib/ear.mtl +90 -0
- data/bytecode/lib/led.mtl +33 -0
- data/bytecode/lib/rfid.mtl +50 -0
- data/bytecode/main.mtl +129 -0
- data/config.ru +6 -0
- data/ext/bytecode/Commands.md +172 -0
- data/ext/bytecode/Docs.md +488 -0
- data/ext/bytecode/README.md +5 -0
- data/ext/bytecode/lib/arp.mtl +159 -0
- data/ext/bytecode/lib/cfg.mtl +74 -0
- data/ext/bytecode/lib/choreos.mtl +1487 -0
- data/ext/bytecode/lib/dhcp.mtl +152 -0
- data/ext/bytecode/lib/dns.mtl +89 -0
- data/ext/bytecode/lib/http.mtl +84 -0
- data/ext/bytecode/lib/tcp.mtl +340 -0
- data/ext/bytecode/lib/udp.mtl +49 -0
- data/ext/bytecode/lib/util.mtl +74 -0
- data/ext/bytecode/lib/var.mtl +15 -0
- data/ext/bytecode/lib/wifi.mtl +243 -0
- data/ext/bytecode/nominal-ping.mtl +5828 -0
- data/ext/mtl/Makefile +42 -0
- data/ext/mtl/README.md +13 -0
- data/ext/mtl/bc.cpp +1891 -0
- data/ext/mtl/conf.bin.sans_password +0 -0
- data/ext/mtl/config.txt +5 -0
- data/ext/mtl/dumpbc.c +2566 -0
- data/ext/mtl/extconf.rb +1 -0
- data/ext/mtl/linux_simu.c +271 -0
- data/ext/mtl/linux_simuaudio.c +16 -0
- data/ext/mtl/linux_simuaudio.h +18 -0
- data/ext/mtl/linux_simunet.c +620 -0
- data/ext/mtl/linux_simunet.h +7 -0
- data/ext/mtl/log.c +297 -0
- data/ext/mtl/log.h +20 -0
- data/ext/mtl/main_compiler.cpp +104 -0
- data/ext/mtl/main_simu.cpp +221 -0
- data/ext/mtl/mp3/GTKANAL.H +97 -0
- data/ext/mtl/mp3/LAYER3.C +2090 -0
- data/ext/mtl/mp3/TABINIT.C +82 -0
- data/ext/mtl/mp3/common.c +265 -0
- data/ext/mtl/mp3/dct64_i386.c +316 -0
- data/ext/mtl/mp3/decode_i386.c +155 -0
- data/ext/mtl/mp3/huffman.h +332 -0
- data/ext/mtl/mp3/interface.c +258 -0
- data/ext/mtl/mp3/mpg123.h +182 -0
- data/ext/mtl/mp3/mpglib.h +44 -0
- data/ext/mtl/properties.c +293 -0
- data/ext/mtl/properties.h +10 -0
- data/ext/mtl/simu.c +750 -0
- data/ext/mtl/simuaudio.c +662 -0
- data/ext/mtl/simuaudio.h +74 -0
- data/ext/mtl/simunet.c +400 -0
- data/ext/mtl/simunet.h +30 -0
- data/ext/mtl/utils/correct_const.sh +34 -0
- data/ext/mtl/vaudio.c +677 -0
- data/ext/mtl/vaudio.h +46 -0
- data/ext/mtl/vbc.h +160 -0
- data/ext/mtl/vbc_str.h +166 -0
- data/ext/mtl/vcomp/Makefile +29 -0
- data/ext/mtl/vcomp/bootstrap.cpp +89 -0
- data/ext/mtl/vcomp/compiler.cpp +470 -0
- data/ext/mtl/vcomp/compiler.h +200 -0
- data/ext/mtl/vcomp/compiler_file.cpp +929 -0
- data/ext/mtl/vcomp/compiler_prog.cpp +250 -0
- data/ext/mtl/vcomp/compiler_term.cpp +1053 -0
- data/ext/mtl/vcomp/compiler_type.cpp +872 -0
- data/ext/mtl/vcomp/compiler_var.cpp +289 -0
- data/ext/mtl/vcomp/file.cpp +79 -0
- data/ext/mtl/vcomp/file.h +39 -0
- data/ext/mtl/vcomp/filesystem.h +14 -0
- data/ext/mtl/vcomp/interpreter.cpp +85 -0
- data/ext/mtl/vcomp/interpreter.h +121 -0
- data/ext/mtl/vcomp/memory.cpp +241 -0
- data/ext/mtl/vcomp/memory.h +326 -0
- data/ext/mtl/vcomp/param.h +95 -0
- data/ext/mtl/vcomp/parser.cpp +427 -0
- data/ext/mtl/vcomp/parser.h +97 -0
- data/ext/mtl/vcomp/parser_xml.cpp +124 -0
- data/ext/mtl/vcomp/prodbuffer.cpp +125 -0
- data/ext/mtl/vcomp/prodbuffer.h +42 -0
- data/ext/mtl/vcomp/resource.h +17 -0
- data/ext/mtl/vcomp/stdlib_core.cpp +122 -0
- data/ext/mtl/vcomp/terminal.cpp +73 -0
- data/ext/mtl/vcomp/terminal.h +30 -0
- data/ext/mtl/vcomp/util.cpp +48 -0
- data/ext/mtl/vcomp/util.h +31 -0
- data/ext/mtl/vinterp.c +1349 -0
- data/ext/mtl/vinterp.h +11 -0
- data/ext/mtl/vloader.c +127 -0
- data/ext/mtl/vloader.h +31 -0
- data/ext/mtl/vlog.c +589 -0
- data/ext/mtl/vlog.h +69 -0
- data/ext/mtl/vmem.c +424 -0
- data/ext/mtl/vmem.h +107 -0
- data/ext/mtl/vnet.c +255 -0
- data/ext/mtl/vnet.h +19 -0
- data/lib/nabaztag_hack_kit/message/api.rb +39 -0
- data/lib/nabaztag_hack_kit/message/helper.rb +39 -0
- data/lib/nabaztag_hack_kit/message.rb +36 -0
- data/lib/nabaztag_hack_kit/server.rb +50 -0
- data/lib/nabaztag_hack_kit/version.rb +3 -0
- data/lib/nabaztag_hack_kit.rb +4 -0
- data/nabaztag_hack_kit.gemspec +29 -0
- data/public/bytecode.bin +0 -0
- data/test/bytecode/helper.mtl +60 -0
- data/test/bytecode/native.mtl +28 -0
- data/test/bytecode/test.mtl +221 -0
- data/test/spec_helper.rb +5 -0
- data/test/unit/message_spec.rb +56 -0
- metadata +209 -0
@@ -0,0 +1,152 @@
|
|
1
|
+
// --------------- DHCP
|
2
|
+
|
3
|
+
const DHCP_DISCOVER=1;;
|
4
|
+
const DHCP_OFFER=2;;
|
5
|
+
const DHCP_REQUEST=3;;
|
6
|
+
const DHCP_DECLINE=4;;
|
7
|
+
const DHCP_ACK=5;;
|
8
|
+
|
9
|
+
fun mkdhcp op netip hostip newip =
|
10
|
+
let 236+16+14->n in
|
11
|
+
let strnew n -> b in
|
12
|
+
(
|
13
|
+
for i=0;i<n do strset b i 0;
|
14
|
+
strcpy b 0 "\1\1\6" 0 3;
|
15
|
+
strcpy b 12 netip 0 4;
|
16
|
+
strcpy b 12+16 mymac 0 6;
|
17
|
+
strcpy b 236 "\99\130\83\99\53\1" 0 6;
|
18
|
+
strset b 236+6 op;
|
19
|
+
strcpy b 236+7 "\61\7\1" 0 3;
|
20
|
+
strcpy b 236+10 mymac 0 6;
|
21
|
+
strcpy b 236+16 "\12\7Pabcdef\55\3\1\3\6" 0 14;
|
22
|
+
if op==DHCP_REQUEST then strcatlist b::"\54\4"::hostip::"\50\4"::newip::"\255"::nil
|
23
|
+
else strcat b "\255"
|
24
|
+
);;
|
25
|
+
|
26
|
+
fun mkdhcpans op tid newip dmac=
|
27
|
+
let 236+7->n in
|
28
|
+
let strnew n -> b in
|
29
|
+
(
|
30
|
+
for i=0;i<n do strset b i 0;
|
31
|
+
strcpy b 0 "\2\1\6" 0 3;
|
32
|
+
strcpy b 4 tid 0 4;
|
33
|
+
strcpy b 16 newip 0 4;
|
34
|
+
strcpy b 12+16 dmac 0 6;
|
35
|
+
strcpy b 236 "\99\130\83\99\53\1" 0 6;
|
36
|
+
strset b 236+6 op;
|
37
|
+
strcatlist b::"\54\4"::newip::"\51\4\0\1\$51\$80\1\4"::netmask::"\3\4"::netip::"\6\4"::netip::"\15\4home\255"::nil
|
38
|
+
);;
|
39
|
+
|
40
|
+
fun extractdhcp src i type lease submask dns gateway mac=
|
41
|
+
if i<strlen src then
|
42
|
+
let strget src i -> c in
|
43
|
+
if c==255 then [type lease submask dns gateway mac]
|
44
|
+
else let strget src i+1 -> len in
|
45
|
+
let i+2->i in
|
46
|
+
if c==53 then extractdhcp src i+len (strget src i) lease submask dns gateway mac
|
47
|
+
else if c==51 then extractdhcp src i+len type (strgetword src i) submask dns gateway mac
|
48
|
+
else if c==1 then extractdhcp src i+len type lease (strsub src i 4) dns gateway mac
|
49
|
+
else if c==6 then extractdhcp src i+len type lease submask (strsub src i 4) gateway mac
|
50
|
+
else if c==3 then extractdhcp src i+len type lease submask dns (strsub src i 4) mac
|
51
|
+
else if c==61 then extractdhcp src i+len type lease submask dns gateway (strsub src i+1 6)
|
52
|
+
else extractdhcp src i+len type lease submask dns gateway mac;;
|
53
|
+
|
54
|
+
fun mkdhcpip mac=
|
55
|
+
let strnew 4 -> s in
|
56
|
+
(
|
57
|
+
strcpy s 0 netip 0 4;
|
58
|
+
strset s 3 ((strget mac 5)&0x7f)+100;
|
59
|
+
s
|
60
|
+
);;
|
61
|
+
|
62
|
+
fun cbnetdhcp src macfrom hostip=
|
63
|
+
Secholn "<dhcp"; MACecho macfrom 0 1;
|
64
|
+
let strget src 0 -> x in
|
65
|
+
let MACecho (strsub src 28 6)0 1 -> mac in
|
66
|
+
if x==2 && !strcmp mac mymac then
|
67
|
+
(
|
68
|
+
let IPecho (strsub src 16 4) 0 1-> newip in
|
69
|
+
let extractdhcp src 240 0 nil nil nil nil nil->[type lease submask dns gateway _] in
|
70
|
+
if type==DHCP_OFFER then
|
71
|
+
(
|
72
|
+
Secholn ">>>>>>>>>>>>>>>OFFER";
|
73
|
+
udpsend netip 68 ipbroadcast 67 (mkdhcp DHCP_REQUEST netip hostip newip) macbroadcast;
|
74
|
+
nil
|
75
|
+
)
|
76
|
+
else if type==DHCP_ACK then
|
77
|
+
(
|
78
|
+
Secholn ">>>>>>>>>>>>>>>ACK";
|
79
|
+
Secho "server ";IPecho hostip 0 1;
|
80
|
+
Secho "ip ";IPecho set netip=newip 0 1;
|
81
|
+
Secho "type ";Iecholn type;
|
82
|
+
Secho "leasetime ";Iecholn lease;
|
83
|
+
Secho "submask ";IPecho set netmask=submask 0 1;
|
84
|
+
Secho "dns ";IPecho set netdns=dns 0 1;
|
85
|
+
Secho "gateway ";IPecho set netgateway=gateway 0 1;
|
86
|
+
nil
|
87
|
+
)
|
88
|
+
);;
|
89
|
+
|
90
|
+
fun cbnetdhcp67 src macfrom hostip=
|
91
|
+
Secholn "<dhcp"; MACecho macfrom 0 1;
|
92
|
+
let strget src 0 -> x in
|
93
|
+
let MACecho (strsub src 28 6)0 1 -> mac in
|
94
|
+
if x==1 /*&& !strcmp mac mymac*/ then
|
95
|
+
(
|
96
|
+
let extractdhcp src 240 0 nil nil nil nil nil ->[type _ _ _ _ dmac] in
|
97
|
+
let strsub src 4 4 -> tid in
|
98
|
+
let mkdhcpip macfrom -> newip in
|
99
|
+
if type==DHCP_DISCOVER then
|
100
|
+
(
|
101
|
+
Secholn ">>>>>>>>>>>>>>>DISCOVER";
|
102
|
+
// dump src;
|
103
|
+
udpsend netip 67 ipbroadcast 68 (mkdhcpans DHCP_OFFER tid newip dmac) macbroadcast;
|
104
|
+
nil
|
105
|
+
)
|
106
|
+
else if type==DHCP_REQUEST then
|
107
|
+
(
|
108
|
+
Secholn ">>>>>>>>>>>>>>>REQUEST";
|
109
|
+
// dump src;
|
110
|
+
udpsend netip 67 ipbroadcast 68 (mkdhcpans DHCP_ACK tid newip dmac) macbroadcast;
|
111
|
+
nil
|
112
|
+
)
|
113
|
+
|
114
|
+
);;
|
115
|
+
|
116
|
+
fun startdhcp=
|
117
|
+
udpsend netip 68 ipbroadcast 67 (mkdhcp DHCP_DISCOVER "\0\0\0\0" nil nil) macbroadcast;
|
118
|
+
regudp 68 #cbnetdhcp;
|
119
|
+
0;;
|
120
|
+
|
121
|
+
fun startdhcpserver=
|
122
|
+
regudp 67 #cbnetdhcp67;
|
123
|
+
0;;
|
124
|
+
|
125
|
+
// --------------- net HOOK debut
|
126
|
+
|
127
|
+
fun net src mac=
|
128
|
+
Secho "n ";//MACecho mac 0 1;
|
129
|
+
// dump src;
|
130
|
+
let strget src 7 -> p in
|
131
|
+
(
|
132
|
+
if p==6 then cbnetarp src mac // ARP
|
133
|
+
else if p==0 then
|
134
|
+
let strget src 17 -> ip in
|
135
|
+
if ip==6 then cbnettcp src mac
|
136
|
+
else if ip==17 then cbnetudp src mac;
|
137
|
+
0
|
138
|
+
);
|
139
|
+
//buttoncheckevent;
|
140
|
+
0;;
|
141
|
+
|
142
|
+
fun netstart=
|
143
|
+
netCb #net;
|
144
|
+
resetarp;
|
145
|
+
resettcp;
|
146
|
+
resetudp;
|
147
|
+
0;;
|
148
|
+
|
149
|
+
fun nettime=
|
150
|
+
arptime;
|
151
|
+
tcptime;
|
152
|
+
0;;
|
@@ -0,0 +1,89 @@
|
|
1
|
+
// --------------- DNS
|
2
|
+
fun parsequ s i= let strfind s i "\0" 0 nil -> j in j+5;;
|
3
|
+
|
4
|
+
fun parsequs s i n= if n<=0 then i else parsequs s parsequ s i n-1;;
|
5
|
+
|
6
|
+
fun skipname s i=
|
7
|
+
let strgetword s i -> x in
|
8
|
+
if (x&0xc000)==0xc000 then i+2
|
9
|
+
else (strfind s i "\0" 0 nil)+1;;
|
10
|
+
|
11
|
+
fun parseans s i n=
|
12
|
+
if n<=0 then nil
|
13
|
+
else let skipname s i -> j in
|
14
|
+
let strgetword s j -> typ in
|
15
|
+
if typ==1 then
|
16
|
+
strcatlist (itoa strget s j+10)::"."::(itoa strget s j+11)::"."::
|
17
|
+
(itoa strget s j+12)::"."::(itoa strget s j+13)::nil
|
18
|
+
else parseans s (j+10+strgetword s j+8) n-1;;
|
19
|
+
|
20
|
+
fun parsemsg s=
|
21
|
+
let strgetword s 0 -> id in
|
22
|
+
let strgetword s 2 -> code in
|
23
|
+
let strgetword s 4 -> nbqu in
|
24
|
+
let strgetword s 6 -> nbans in
|
25
|
+
if nbans==0 then nil
|
26
|
+
else let parsequs s 12 nbqu -> i in
|
27
|
+
parseans s i nbans;;
|
28
|
+
|
29
|
+
fun filterdns src=
|
30
|
+
let strfind src 0 "." 0 nil ->i in
|
31
|
+
if i!=nil then
|
32
|
+
strcat
|
33
|
+
strcat ctoa i strsub src 0 i
|
34
|
+
filterdns strsub src i+1 nil
|
35
|
+
else strcat ctoa strlen src src;;
|
36
|
+
|
37
|
+
fun question id dns=
|
38
|
+
strcatlist (itobin2 id)::"\$01\$00\$00\$01\$00\$00\$00\$00\$00\$00"::(filterdns dns)::"\$00\$00\$01\$00\$01"::nil;;
|
39
|
+
|
40
|
+
var dnsid=0;;
|
41
|
+
|
42
|
+
type Dns=[idD domainD reqD timeoutD cbD];;
|
43
|
+
var ldnsreq;;
|
44
|
+
var ldns;;
|
45
|
+
|
46
|
+
fun dnsreq domain cb=
|
47
|
+
set dnsid=if dnsid==nil then time_ms else dnsid+1;
|
48
|
+
let listswitchstr ldns domain -> ip in
|
49
|
+
if ip!=nil then call cb[ip]
|
50
|
+
else let dump question dnsid domain -> tramedns in
|
51
|
+
(
|
52
|
+
udpsend netip DNSLOCAL netdns 53 tramedns nil;
|
53
|
+
set ldnsreq=[idD:dnsid domainD:domain reqD:tramedns timeoutD:time+5 cbD:cb]::ldnsreq;
|
54
|
+
nil
|
55
|
+
);
|
56
|
+
0;;
|
57
|
+
|
58
|
+
fun selectbyid d v= d.idD==v;;
|
59
|
+
|
60
|
+
fun cbnetdns msg mac ipfrom=
|
61
|
+
let strgetword msg 0 -> id in
|
62
|
+
let parsemsg msg -> ip in
|
63
|
+
let hd select ldnsreq id #selectbyid -> x in
|
64
|
+
if x!=nil then
|
65
|
+
(
|
66
|
+
set ldnsreq=listrem ldnsreq x;
|
67
|
+
if ip!=nil then set ldns=[x.domainD ip]::ldns; // ### attention à la taille de la liste
|
68
|
+
call x.cbD [ip]
|
69
|
+
);
|
70
|
+
0;;
|
71
|
+
|
72
|
+
fun filterdnsdead l=if l!=nil then let hd l-> d in if d.timeoutD==nil then filterdnsdead tl l else (hd l)::filterdnsdead tl l;;
|
73
|
+
|
74
|
+
fun dnstime=
|
75
|
+
for l=ldnsreq;l!=nil;tl l do let hd l-> d in
|
76
|
+
if time-d.timeoutD>=0 then
|
77
|
+
(
|
78
|
+
set d.timeoutD=nil;
|
79
|
+
call d.cbD [nil]
|
80
|
+
);
|
81
|
+
set ldnsreq=filterdnsdead ldnsreq;
|
82
|
+
0;;
|
83
|
+
|
84
|
+
|
85
|
+
fun startdnsclient=
|
86
|
+
regudp DNSLOCAL #cbnetdns;
|
87
|
+
set ldnsreq=nil;
|
88
|
+
set ldns=nil;
|
89
|
+
0;;
|
@@ -0,0 +1,84 @@
|
|
1
|
+
//------------------- HTTP
|
2
|
+
|
3
|
+
//where to put this
|
4
|
+
fun isip s i=
|
5
|
+
if i>=strlen s then 1
|
6
|
+
else let strget s i -> c in
|
7
|
+
if (c<'0' || c>'9')&&c!='.' then 0
|
8
|
+
else isip s i+1;;
|
9
|
+
|
10
|
+
|
11
|
+
fun cuturl url=
|
12
|
+
if !strcmp (strsub url 0 strlen http_prefurl) http_prefurl then cuturl strsub url strlen http_prefurl strlen url
|
13
|
+
else let strstr url "/" 0 -> i in
|
14
|
+
let if i==nil then url else strsub url 0 i -> addr in
|
15
|
+
let strstr addr ":" 0 -> j in
|
16
|
+
let if j==nil then [addr 80]
|
17
|
+
else [strsub addr 0 j atoi strsub addr j+1 strlen addr] -> [host port] in
|
18
|
+
let if i==nil then "/" else strsub url i strlen url -> path in
|
19
|
+
[host port path];;
|
20
|
+
|
21
|
+
fun httpsendreq ip x=
|
22
|
+
Secho "found ip>>>>>>>>>>>>>>>>>>>>>>>>>"; Secholn ip;
|
23
|
+
let x->[port httpreq] in
|
24
|
+
if ip==nil then (call httpreq.cbH [httpreq nil]; nil)
|
25
|
+
else
|
26
|
+
(
|
27
|
+
set httpreq.cnxH=opentcp netip nil useparamip ip port fixarg4 #tcpevent httpreq;
|
28
|
+
set httpreq.stateH=HTTP_REACH;
|
29
|
+
nil
|
30
|
+
);
|
31
|
+
0;;
|
32
|
+
|
33
|
+
fun httprequest verb url postdata cb type=
|
34
|
+
let cuturl url ->[host port path] in
|
35
|
+
//let if confGetProxy then strcatlist "http://"::host::":"::(itoa port)::path::nil else path -> path in //Icy-MetaData:1\13\n
|
36
|
+
//let if confGetProxy then webip confGetProxyip else host -> host in
|
37
|
+
//let if confGetProxy then confGetProxyport else port -> port in
|
38
|
+
|
39
|
+
let strcatlist verb::" "::path::" HTTP/1.0\13\nUser-Agent: MTL\13\nPragma: no-cache\13\nIcy-MetaData:1\13\nHost: "::host::"\13\n"::
|
40
|
+
if postdata==nil then "\13\n"::nil
|
41
|
+
else "Content-length: "::(itoa strlen postdata)::"\13\n\13\n"::postdata::nil
|
42
|
+
-> request in // création de la chaîne requête
|
43
|
+
|
44
|
+
let [outputH:request indexH:0 cbH:cb typeH:type stateH:HTTP_SOLVE aliveH:time_ms] -> httpreq in // création de la structure requête
|
45
|
+
(
|
46
|
+
// Secho "HTTPREQUEST host =";Secholn host;
|
47
|
+
if isip host 0 then httpsendreq host [port httpreq]
|
48
|
+
else
|
49
|
+
(
|
50
|
+
dnsreq host fixarg2 #httpsendreq [port httpreq];
|
51
|
+
nil
|
52
|
+
);
|
53
|
+
httpreq // on retourne la structure requête pour pouvoir éventuellement l'interrompre en cours de route
|
54
|
+
);;
|
55
|
+
|
56
|
+
|
57
|
+
var http_sep="\13\n\13\n";; // séparateur entre l'en-tête et le corps de la réponse à une requête
|
58
|
+
|
59
|
+
|
60
|
+
//##> retourne le header d'une réponse à une requête
|
61
|
+
fun httpgetheader res =
|
62
|
+
let strstr res http_sep 0 -> i in
|
63
|
+
if i==nil then res
|
64
|
+
else strsub res 0 i+strlen http_sep;;
|
65
|
+
|
66
|
+
//##> retourne le contenu d'une réponse à une requête (sans header)
|
67
|
+
fun httpgetcontent res =
|
68
|
+
let strstr res http_sep 0 -> i in
|
69
|
+
if i==nil then nil
|
70
|
+
else strsub res i+strlen http_sep strlen res;;
|
71
|
+
|
72
|
+
// Cryptage des trames
|
73
|
+
fun bintoi3 s x=((strget s x)<<16)+((strget s x+1)<<8)+(strget s x+2);;
|
74
|
+
|
75
|
+
fun pingextract_ s i res=
|
76
|
+
if i<strlen s then
|
77
|
+
let (strget s i)-> code in
|
78
|
+
if code==255 then res
|
79
|
+
else if code>=0 && code<=10 then
|
80
|
+
let bintoi3 s i+1 -> len in
|
81
|
+
if len>=0 then pingextract_ s i+4+len [code strsub s i+4 len]::res;;
|
82
|
+
|
83
|
+
fun pingextract s=
|
84
|
+
if (strget s 0)==0x7f then pingextract_ s 1 nil;;
|
@@ -0,0 +1,340 @@
|
|
1
|
+
// ------------- TCP
|
2
|
+
const TFIN=0x01;;
|
3
|
+
const TSYN=0x02;;
|
4
|
+
const TRST=0x04;;
|
5
|
+
const TPUSH=0x08;;
|
6
|
+
const TACK=0x10;;
|
7
|
+
const TURGE=0x20;;
|
8
|
+
|
9
|
+
const STOFF=-1;;
|
10
|
+
const STSYN=0;;
|
11
|
+
const STEST=1;;
|
12
|
+
const STLISTEN=2;;
|
13
|
+
const STFIN=3;;
|
14
|
+
|
15
|
+
const CLIENT_SEQ_START="\0\0\1\0";;
|
16
|
+
const CLIENT_SEQ_NULL="\0\0\0\0";;
|
17
|
+
|
18
|
+
const TCPWRITE=0;;
|
19
|
+
const TCPREAD=1;;
|
20
|
+
const TCPCLOSE=-1;;
|
21
|
+
const TCPSTART=2;;
|
22
|
+
|
23
|
+
const TCPMAX=1024;;
|
24
|
+
|
25
|
+
type Tcp=[stateT locT dstT locpT dstpT seqT ackT cbT macT lastsentT retryT locksendT enableT];;
|
26
|
+
|
27
|
+
fun mktcp_ ipsrc ipdst portsrc portdst seq ack flag content=
|
28
|
+
let strcatlist
|
29
|
+
"\$aa\$aa\$03\$00\$00\$00\$08\$00\$45\$00\$00\$00\$00\$00\$00\$00\100\6\0\0"::
|
30
|
+
ipsrc::
|
31
|
+
ipdst::
|
32
|
+
"\0\0\0\0"::
|
33
|
+
seq::
|
34
|
+
ack::
|
35
|
+
"\0\0\$ff\$ff\0\0\0\0"::
|
36
|
+
if flag&TSYN then "\2\4\5\$b4"::content::nil // 5.b4 final : taille MSS
|
37
|
+
else content::nil
|
38
|
+
-> tcp in
|
39
|
+
let strlen tcp ->len in
|
40
|
+
(
|
41
|
+
strputword tcp 8+2 len-8;
|
42
|
+
strputword tcp 8+20 portsrc;
|
43
|
+
strputword tcp 8+22 portdst;
|
44
|
+
|
45
|
+
strset tcp 8+32 4*if flag&TSYN then 24 else 20;
|
46
|
+
strset tcp 8+33 flag;
|
47
|
+
|
48
|
+
strputchk tcp 8+10 netChk tcp 8 20 0;
|
49
|
+
|
50
|
+
let strnew 2 -> s in
|
51
|
+
(
|
52
|
+
strputword s 0 len-28;
|
53
|
+
strputchk tcp 8+36
|
54
|
+
netChk tcp 8+20 (len-28) netChk s 0 2 netChk "\0\6" 0 nil netChk tcp 8+12 8 0
|
55
|
+
);
|
56
|
+
tcp
|
57
|
+
);;
|
58
|
+
|
59
|
+
fun mktcp t flag content=
|
60
|
+
// Secholn "mktcp "; Secho "seq "; SEQecho t.seqT 0 1; Secho "ack "; SEQecho t.ackT 0 1;
|
61
|
+
mktcp_ t.locT t.dstT t.locpT t.dstpT t.seqT t.ackT flag content;;
|
62
|
+
|
63
|
+
fun resendtcp t=
|
64
|
+
netSend t.lastsentT 0 nil (/*MACecho*/ t.macT /*0 1*/) 0 1;
|
65
|
+
0;;
|
66
|
+
|
67
|
+
fun headerlen src=((strget src 8+32)>>4)<<2;;
|
68
|
+
|
69
|
+
fun datalength src=(strgetword src 10)-20-headerlen src;;
|
70
|
+
|
71
|
+
fun sendtcp t trame=
|
72
|
+
// Secholn "tcpSend"; dump trame;
|
73
|
+
netSend trame 0 nil (/*MACecho*/ t.macT /*0 1*/) 0 1;
|
74
|
+
let strget trame 8+33 -> flag in
|
75
|
+
set t.seqT=netSeqAdd t.seqT (datalength trame)+(if flag&(TSYN|TFIN) then 1 else 0);
|
76
|
+
0;;
|
77
|
+
|
78
|
+
fun sendtcpforretry t trame=
|
79
|
+
set t.lastsentT=trame;
|
80
|
+
set t.retryT=nil;
|
81
|
+
sendtcp t trame;;
|
82
|
+
|
83
|
+
|
84
|
+
fun tcpSend2 mac tcp trame=
|
85
|
+
set tcp.macT=mac;
|
86
|
+
sendtcpforretry/*sendtcp*/ tcp trame;;
|
87
|
+
|
88
|
+
// List of all current tcp requests
|
89
|
+
var ltcp;;
|
90
|
+
|
91
|
+
|
92
|
+
fun remtcp t=set t.stateT=STOFF; set ltcp=remfromlist ltcp t;;
|
93
|
+
|
94
|
+
var counttcp;;
|
95
|
+
|
96
|
+
fun opentcp local localp dst dstp cb=
|
97
|
+
let if localp==nil then 1024+set counttcp=((if counttcp==nil then time_ms else counttcp)+1)&16383 else localp -> localp in
|
98
|
+
let [stateT:STSYN locT:local dstT:dst locpT:localp dstpT:dstp seqT:CLIENT_SEQ_START ackT:CLIENT_SEQ_NULL cbT:cb enableT:1] -> tcp in
|
99
|
+
let mktcp tcp TSYN nil -> trame in
|
100
|
+
let dst -> ip in // ajouter le test de passerelle
|
101
|
+
(
|
102
|
+
set ltcp=tcp::ltcp;
|
103
|
+
arpreq ip fixarg2 fixarg3 #tcpSend2 trame tcp;
|
104
|
+
tcp
|
105
|
+
);;
|
106
|
+
|
107
|
+
fun listentcp localp cb=
|
108
|
+
let [stateT:STLISTEN locpT:localp cbT:cb enableT:1] -> tcp in
|
109
|
+
(
|
110
|
+
set ltcp=tcp::ltcp
|
111
|
+
);;
|
112
|
+
|
113
|
+
fun findtcp l localp dstp src=
|
114
|
+
if l!=nil then let hd l-> t in
|
115
|
+
if t.locpT==localp && t.dstpT==dstp && (!vstrcmp src 8+16 t.locT 0 4)&& (!vstrcmp src 8+12 t.dstT 0 4)
|
116
|
+
then t
|
117
|
+
else if t.stateT==STLISTEN && t.locpT==localp then t
|
118
|
+
else findtcp tl l localp dstp src;;
|
119
|
+
|
120
|
+
fun sendclose t=
|
121
|
+
Secholn "## sendclose";
|
122
|
+
sendtcp t mktcp t TFIN+TACK nil;
|
123
|
+
set t.stateT=STFIN;
|
124
|
+
0;;
|
125
|
+
|
126
|
+
fun cbnettcp src mac=
|
127
|
+
Secho "t";
|
128
|
+
let /*Iecholn*/ strgetword src 8+20+2 -> locp in
|
129
|
+
let /*Iecholn*/ strgetword src 8+20+0 -> dstp in
|
130
|
+
let findtcp ltcp locp dstp src -> t in
|
131
|
+
if t!=nil && t.enableT then let t.stateT -> st in
|
132
|
+
let /*Iecholn*/ strget src 8+33 -> flag in
|
133
|
+
let /*SEQecho*/ (strsub src 8+24 4) /*0 1*/-> rseq in
|
134
|
+
let /*SEQecho*/ (strsub src 8+28 4) /*0 1*/-> rack in
|
135
|
+
if st==STSYN then
|
136
|
+
(
|
137
|
+
Secholn "stsyn";
|
138
|
+
if (flag==TSYN+TACK) && !vstrcmp (SEQecho(t.seqT)0 1) 0 rack 0 4 then
|
139
|
+
(
|
140
|
+
set t.ackT=SEQecho (netSeqAdd rseq 1) 0 1;
|
141
|
+
sendtcp t mktcp t TACK nil;
|
142
|
+
set t.stateT=STEST;
|
143
|
+
set t.lastsentT=nil;
|
144
|
+
// Secholn "call TCPWRITE";
|
145
|
+
call t.cbT [t TCPWRITE nil]
|
146
|
+
)
|
147
|
+
else
|
148
|
+
(
|
149
|
+
// Secholn "TSRT+TACK";
|
150
|
+
sendtcp t mktcp t TRST+TACK nil;
|
151
|
+
remtcp t;
|
152
|
+
nil
|
153
|
+
)
|
154
|
+
)
|
155
|
+
else if st==STEST then
|
156
|
+
if !vstrcmp t.ackT 0 rseq 0 4 then
|
157
|
+
let strgetword src 10 -> iplen in
|
158
|
+
let ((strget src 8+32)>>4)<<2 -> tcplen in
|
159
|
+
let datalength src -> datalen in
|
160
|
+
(
|
161
|
+
if datalen then
|
162
|
+
(
|
163
|
+
// dump src;
|
164
|
+
// Iecholn iplen;
|
165
|
+
// Iecholn tcplen;
|
166
|
+
// Secho "update ackT : add ";
|
167
|
+
set t.ackT=netSeqAdd t.ackT datalen
|
168
|
+
);
|
169
|
+
if flag&TFIN then
|
170
|
+
(
|
171
|
+
set t.ackT=netSeqAdd t.ackT 1;
|
172
|
+
nil
|
173
|
+
)
|
174
|
+
else if !vstrcmp t.seqT 0 rack 0 4 then
|
175
|
+
(
|
176
|
+
// Secholn "acquittement de l'envoi";
|
177
|
+
set t.lastsentT=nil; // acquittement de l'envoi
|
178
|
+
if t.locksendT==1 then
|
179
|
+
(
|
180
|
+
set t.locksendT=0;
|
181
|
+
call t.cbT [t TCPWRITE nil]
|
182
|
+
)
|
183
|
+
else if t.locksendT==2 then
|
184
|
+
(
|
185
|
+
sendclose t;
|
186
|
+
nil
|
187
|
+
)
|
188
|
+
)
|
189
|
+
else (Secholn "##bad ack"; SEQecho t.seqT 0 1;SEQecho rack 0 1; nil);
|
190
|
+
if datalen then
|
191
|
+
let 8+20+headerlen src -> start in
|
192
|
+
let strsub src start datalen -> data in
|
193
|
+
call t.cbT [t TCPREAD data];
|
194
|
+
if datalen || flag&TFIN then sendtcp t mktcp t TACK nil;
|
195
|
+
if flag&TFIN then
|
196
|
+
(
|
197
|
+
sendtcp t mktcp t TFIN+TACK nil;
|
198
|
+
remtcp t;
|
199
|
+
call t.cbT [t TCPCLOSE nil]
|
200
|
+
)
|
201
|
+
)
|
202
|
+
else (/*SEQecho(t.ackT)0 1; SEQecho rseq 0 1;*/Secho "##bs/";sendtcp t mktcp t TACK nil; nil)
|
203
|
+
else if st==STFIN then
|
204
|
+
(
|
205
|
+
Secholn "STFIN";
|
206
|
+
set t.ackT=SEQecho (netSeqAdd rseq 1) 0 1;
|
207
|
+
sendtcp t mktcp t TACK nil;
|
208
|
+
remtcp t;
|
209
|
+
nil
|
210
|
+
)
|
211
|
+
else if st==STLISTEN then
|
212
|
+
if flag&TSYN then
|
213
|
+
(
|
214
|
+
let [stateT:STEST locT:(strsub src 8+16 4) dstT:(strsub src 8+12 4) locpT:locp dstpT:dstp
|
215
|
+
seqT:CLIENT_SEQ_START ackT:(netSeqAdd rseq 1) cbT:t.cbT macT:mac enableT:1] -> tcp in
|
216
|
+
(
|
217
|
+
set ltcp=tcp::ltcp;
|
218
|
+
sendtcpforretry tcp mktcp tcp TACK+TSYN nil;
|
219
|
+
call tcp.cbT [tcp TCPSTART nil]
|
220
|
+
)
|
221
|
+
)
|
222
|
+
;;
|
223
|
+
|
224
|
+
|
225
|
+
fun writetcp t msg i=
|
226
|
+
if t.stateT!=STEST then nil
|
227
|
+
else if t.lastsentT!=nil then
|
228
|
+
(
|
229
|
+
// Secholn "locksend";
|
230
|
+
set t.locksendT=1;
|
231
|
+
i
|
232
|
+
)
|
233
|
+
else let strsub msg i TCPMAX -> content in
|
234
|
+
let mktcp t TACK content -> trame in
|
235
|
+
(
|
236
|
+
sendtcpforretry t trame;
|
237
|
+
let i+strlen content -> ni in
|
238
|
+
(
|
239
|
+
if ni!=strlen msg then set t.locksendT=1;
|
240
|
+
ni
|
241
|
+
)
|
242
|
+
);;
|
243
|
+
|
244
|
+
|
245
|
+
fun closetcp t=
|
246
|
+
if t.stateT!=STEST then 0
|
247
|
+
else if t.lastsentT!=nil then
|
248
|
+
(
|
249
|
+
set t.locksendT=2;
|
250
|
+
0
|
251
|
+
)
|
252
|
+
else sendclose t;
|
253
|
+
0;;
|
254
|
+
|
255
|
+
fun tcpcb t cb= set t.cbT=cb;;
|
256
|
+
|
257
|
+
fun enabletcp t v= set t.enableT=v;;
|
258
|
+
fun enabledtcpP t= t.enableT;;
|
259
|
+
|
260
|
+
fun tcptime =
|
261
|
+
for l=ltcp;l!=nil;tl l do let hd l-> t in
|
262
|
+
if t.lastsentT!=nil then
|
263
|
+
(
|
264
|
+
if t.retryT!=nil then
|
265
|
+
(
|
266
|
+
set t.retryT=1+t.retryT;
|
267
|
+
if t.retryT>10 then
|
268
|
+
(
|
269
|
+
remtcp t;
|
270
|
+
call t.cbT [t TCPCLOSE nil];
|
271
|
+
nil
|
272
|
+
)
|
273
|
+
else resendtcp t
|
274
|
+
)
|
275
|
+
else set t.retryT=0
|
276
|
+
);
|
277
|
+
0;;
|
278
|
+
|
279
|
+
fun resettcp=
|
280
|
+
set ltcp=nil;
|
281
|
+
0;;
|
282
|
+
|
283
|
+
|
284
|
+
fun tcpread cnx input httpreq=
|
285
|
+
if input==nil ||0==strlen input then // erreur ou fin
|
286
|
+
( closetcp cnx; // on ferme la socket
|
287
|
+
if httpreq.typeH==HTTP_NORMAL then call httpreq.cbH [httpreq strcatlist rev httpreq.inputH nil] // on retourne ce qui a été reçu
|
288
|
+
else call httpreq.cbH [httpreq nil] // HTTP_STREAM or HTTP_DIRECT
|
289
|
+
)
|
290
|
+
else
|
291
|
+
(
|
292
|
+
// dump input;
|
293
|
+
set lasthttpevent=time;
|
294
|
+
set httpreq.aliveH=time_ms;
|
295
|
+
if httpreq.typeH==HTTP_NORMAL then set httpreq.inputH=input::httpreq.inputH // on bufferise ce qui a été reçu
|
296
|
+
else if httpreq.typeH==HTTP_DIRECT then
|
297
|
+
(
|
298
|
+
call httpreq.cbH [httpreq input];
|
299
|
+
nil
|
300
|
+
)
|
301
|
+
else let strcat hd httpreq.inputH input -> s in
|
302
|
+
let strstr s "\13\10\13\10" 0 -> i in
|
303
|
+
if i==nil then
|
304
|
+
(
|
305
|
+
set httpreq.inputH=s::nil
|
306
|
+
)
|
307
|
+
else
|
308
|
+
(
|
309
|
+
set httpreq.inputH=nil;
|
310
|
+
set httpreq.typeH=HTTP_DIRECT;
|
311
|
+
call httpreq.cbH [httpreq strsub s 0 i];
|
312
|
+
if i+4<strlen s then call httpreq.cbH [httpreq strsub s i+4 nil];
|
313
|
+
nil
|
314
|
+
);
|
315
|
+
nil
|
316
|
+
);;
|
317
|
+
|
318
|
+
|
319
|
+
fun tcpwrite cnx httpreq=
|
320
|
+
set httpreq.stateH=HTTP_CONNECTED;
|
321
|
+
set httpreq.aliveH=time_ms;
|
322
|
+
if httpreq.outputH!=nil then // s'il y a des choses à envoyer (notamment la première fois)
|
323
|
+
(
|
324
|
+
set httpreq.indexH=writetcp cnx httpreq.outputH httpreq.indexH; // envoyer ce qui peut l'être
|
325
|
+
if httpreq.indexH==nil then // si erreur lors de l'envoi
|
326
|
+
( closetcp cnx; // on ferme la socket
|
327
|
+
call httpreq.cbH [httpreq nil] ) // on retourne nil
|
328
|
+
else if httpreq.indexH>=strlen httpreq.outputH then // sinon si tout a été envoyé
|
329
|
+
( set httpreq.indexH=nil; // purger les données d'émission
|
330
|
+
set httpreq.outputH=nil;
|
331
|
+
nil
|
332
|
+
)
|
333
|
+
);;
|
334
|
+
|
335
|
+
|
336
|
+
fun tcpevent t val msg sock=
|
337
|
+
if val==TCPWRITE then tcpwrite t sock
|
338
|
+
else if val==TCPCLOSE then tcpread t nil sock
|
339
|
+
else tcpread t msg sock;
|
340
|
+
0;;
|
@@ -0,0 +1,49 @@
|
|
1
|
+
// ------------- UDP
|
2
|
+
|
3
|
+
fun mkudp ipsrc ipdst portsrc portdst content=
|
4
|
+
let strcatlist
|
5
|
+
"\$aa\$aa\$03\$00\$00\$00\$08\$00\$45\$00\$00\$00\$00\$00\$00\$00\100\17\0\0"::
|
6
|
+
ipsrc::
|
7
|
+
ipdst::
|
8
|
+
"\0\0\0\0\0\0\0\0"::
|
9
|
+
content::
|
10
|
+
nil -> udp in
|
11
|
+
(
|
12
|
+
strputword udp 8+2 28+strlen content;
|
13
|
+
strputword udp 8+20 portsrc;
|
14
|
+
strputword udp 8+22 portdst;
|
15
|
+
strputword udp 8+24 8+strlen content;
|
16
|
+
strputchk udp 8+10 netChk udp 8 20 0;
|
17
|
+
strputchk udp 8+26 netChk udp 8+20 (8+strlen content) netChk udp 8+24 2 netChk "\0\17" 0 nil netChk udp 8+12 8 0;
|
18
|
+
udp
|
19
|
+
);;
|
20
|
+
|
21
|
+
fun udpSend2 mac udp=
|
22
|
+
Secho ">u";
|
23
|
+
// dump udp;
|
24
|
+
netSend udp 0 nil (/*MACecho*/ mac /*0 1*/) 0 1;;
|
25
|
+
|
26
|
+
fun udpsend local localp dst dstp content mac=
|
27
|
+
let mkudp local dst localp dstp content -> udp in
|
28
|
+
if mac!=nil then udpSend2 mac udp
|
29
|
+
else let dst -> ip in // ajouter le test de passerelle
|
30
|
+
arpreq ip fixarg2 #udpSend2 udp;;
|
31
|
+
|
32
|
+
var ludp;;
|
33
|
+
|
34
|
+
fun remudp l port=
|
35
|
+
if l!=nil then let hd l ->[p _] in if p==port then remudp tl l port else (hd l)::remudp tl l port;;
|
36
|
+
|
37
|
+
fun regudp port cb=
|
38
|
+
set ludp=[port cb]::remudp ludp port;;
|
39
|
+
|
40
|
+
fun unregudp port=
|
41
|
+
set ludp=remudp ludp port;;
|
42
|
+
|
43
|
+
fun resetudp= set ludp=nil;;
|
44
|
+
|
45
|
+
fun cbnetudp src mac=
|
46
|
+
Secho "<u";
|
47
|
+
let Iecholn strgetword src 8+20+2 -> locp in
|
48
|
+
let listswitch ludp locp -> cb in
|
49
|
+
call cb [strsub src 8+20+8 nil mac strsub src 20 4];;
|