mirror of
https://github.com/lwip-tcpip/lwip.git
synced 2025-11-16 12:34:34 +00:00
Compare commits
1273 Commits
PRE_leon-d
...
STABLE-1_3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bcb4afa886 | ||
|
|
7774b57a1c | ||
|
|
90cb4b4e09 | ||
|
|
7fa9010f35 | ||
|
|
03f888c968 | ||
|
|
e07d71f5e8 | ||
|
|
afcf49ad3a | ||
|
|
a2f1892480 | ||
|
|
552106e2a4 | ||
|
|
a48370d5e9 | ||
|
|
f067d34392 | ||
|
|
30d4c243ec | ||
|
|
2637f2ad3a | ||
|
|
9b92f4c882 | ||
|
|
42344ce20c | ||
|
|
faca23b984 | ||
|
|
0cbd7501a1 | ||
|
|
03aa8270a6 | ||
|
|
ef70313e05 | ||
|
|
2ec3c46838 | ||
|
|
52e8ec03ba | ||
|
|
c54777d957 | ||
|
|
7b11fb75d9 | ||
|
|
e937521014 | ||
|
|
f02c39a402 | ||
|
|
c580c2be75 | ||
|
|
8d0f689cb5 | ||
|
|
bfd96264e6 | ||
|
|
baab7c04f7 | ||
|
|
3572ec784d | ||
|
|
6f00cbb6ef | ||
|
|
7518acf634 | ||
|
|
52e6922e5a | ||
|
|
82ddf82866 | ||
|
|
55bcc20deb | ||
|
|
9906e4c984 | ||
|
|
886cfbe12d | ||
|
|
4e40fee1db | ||
|
|
bceff76c70 | ||
|
|
b333b7c9dc | ||
|
|
de4b9b584c | ||
|
|
bf924118de | ||
|
|
a41f113b8f | ||
|
|
5941b3c86e | ||
|
|
caa1834b70 | ||
|
|
c61262d839 | ||
|
|
9c4daa312d | ||
|
|
32005617b9 | ||
|
|
1dfa246674 | ||
|
|
7e616ea71c | ||
|
|
99afb15ced | ||
|
|
22e2540eb6 | ||
|
|
8d39b1a152 | ||
|
|
1ed34774c8 | ||
|
|
48e62e25e9 | ||
|
|
1cb470662b | ||
|
|
add4874801 | ||
|
|
8cc32bc29c | ||
|
|
fc2d28b851 | ||
|
|
a3ef33c56f | ||
|
|
ba4254231e | ||
|
|
2b54da5070 | ||
|
|
d2fa5c91a7 | ||
|
|
4653974c2a | ||
|
|
de11e7fd75 | ||
|
|
1dd1064051 | ||
|
|
ac10470643 | ||
|
|
8d3d08e814 | ||
|
|
3f96a15fd4 | ||
|
|
22f51f953b | ||
|
|
f3f7bd00e5 | ||
|
|
a72e4a406f | ||
|
|
2fe1254aae | ||
|
|
e4590b26fb | ||
|
|
325d6e7cfa | ||
|
|
6bce832060 | ||
|
|
37a5a87057 | ||
|
|
865f6eb5f3 | ||
|
|
dde6ddfd7c | ||
|
|
47d8d69b81 | ||
|
|
df1b7ea311 | ||
|
|
113a52d091 | ||
|
|
081e4d9209 | ||
|
|
e5a98b6a5b | ||
|
|
2942157ca4 | ||
|
|
6746beb2a3 | ||
|
|
92aa004b75 | ||
|
|
b28cd02149 | ||
|
|
cedd5c21e6 | ||
|
|
b714cd5f4b | ||
|
|
788892ee7c | ||
|
|
1b07fecbf3 | ||
|
|
4a01122fb7 | ||
|
|
4211da00b3 | ||
|
|
7f3cff6e09 | ||
|
|
6e612e5def | ||
|
|
a7718b2ef3 | ||
|
|
472407c719 | ||
|
|
f07c1cf874 | ||
|
|
ce7c311ecf | ||
|
|
499c63bd0a | ||
|
|
03777ccb21 | ||
|
|
b4741332e0 | ||
|
|
3874f5f5e8 | ||
|
|
8c19f9a57e | ||
|
|
f57c2424cf | ||
|
|
181b68b01e | ||
|
|
93d5bed697 | ||
|
|
5743b11925 | ||
|
|
4dcfdac2f5 | ||
|
|
9343b767f8 | ||
|
|
77d9233427 | ||
|
|
f63a3c1f62 | ||
|
|
511cdfb951 | ||
|
|
e1f49d990b | ||
|
|
1b208d0954 | ||
|
|
4ac4d56b53 | ||
|
|
c7a0f32c98 | ||
|
|
be0686d905 | ||
|
|
9940b049ec | ||
|
|
3d9c76a69c | ||
|
|
7797ada1f5 | ||
|
|
3fc883e8fb | ||
|
|
8cfd923aaa | ||
|
|
c86b446d4c | ||
|
|
32a09370e1 | ||
|
|
32c6893081 | ||
|
|
95425552d7 | ||
|
|
dc515c7ad3 | ||
|
|
c31b405af6 | ||
|
|
e7483f2e64 | ||
|
|
9a524dac86 | ||
|
|
b3c52f574a | ||
|
|
f58515b51e | ||
|
|
da4df1f414 | ||
|
|
7f0640b040 | ||
|
|
8c0e6de00a | ||
|
|
8ff1194b6a | ||
|
|
9dd4ad6c1f | ||
|
|
4e398e2aa9 | ||
|
|
92401faa72 | ||
|
|
edc46281a4 | ||
|
|
6c8b3e3b58 | ||
|
|
1faf0ab9e3 | ||
|
|
e6ec23d7cc | ||
|
|
e2cd201f6a | ||
|
|
7e447c83fb | ||
|
|
0c0e8d6544 | ||
|
|
a4d14722f3 | ||
|
|
8020ba2dc5 | ||
|
|
21bbc9a81a | ||
|
|
bfe24b138d | ||
|
|
f3dbd986cb | ||
|
|
ecce865cfe | ||
|
|
4a6f60937a | ||
|
|
cbe9b050a9 | ||
|
|
2d5908f4de | ||
|
|
298d5cf042 | ||
|
|
853765954e | ||
|
|
7a99d73092 | ||
|
|
7077d51f1f | ||
|
|
270c7c1110 | ||
|
|
2d3a64815f | ||
|
|
86dc53b72a | ||
|
|
649d43c2c5 | ||
|
|
6d9b44e243 | ||
|
|
e864ba6c91 | ||
|
|
0686380302 | ||
|
|
282e9ead17 | ||
|
|
1f08a5e5f5 | ||
|
|
c41508cc8d | ||
|
|
187df4464e | ||
|
|
c94d640e2a | ||
|
|
cf998b7bf8 | ||
|
|
1a104762ea | ||
|
|
2a5209bb5a | ||
|
|
ebd167b658 | ||
|
|
c13ec867c9 | ||
|
|
199648ff37 | ||
|
|
536f2e42d2 | ||
|
|
0f9799d7e0 | ||
|
|
b1a4b00091 | ||
|
|
c1c9983cfe | ||
|
|
8980c3f74e | ||
|
|
418f57dd6a | ||
|
|
9ef005454a | ||
|
|
afad35a8ac | ||
|
|
2ca113a218 | ||
|
|
911ee4d9f9 | ||
|
|
9804b25acc | ||
|
|
87e16a8f47 | ||
|
|
e561c7b49d | ||
|
|
8cd65eaf46 | ||
|
|
b7ef6077df | ||
|
|
cb71d6d393 | ||
|
|
79c00be516 | ||
|
|
949efb414a | ||
|
|
5dd1256769 | ||
|
|
c52ef1d2b3 | ||
|
|
c7e91d3302 | ||
|
|
c1bbcf5ed3 | ||
|
|
87c5a61d07 | ||
|
|
0aa3d89134 | ||
|
|
4ffafdeb86 | ||
|
|
0bf32b957d | ||
|
|
2bdd916b06 | ||
|
|
93c487fb75 | ||
|
|
036d1aae50 | ||
|
|
f600a868f5 | ||
|
|
95f2d48ac4 | ||
|
|
8c847a85ae | ||
|
|
c265fa3331 | ||
|
|
6aab0332e8 | ||
|
|
47ae677652 | ||
|
|
54e1b79ac5 | ||
|
|
6afe1f3597 | ||
|
|
4466260480 | ||
|
|
1c6e31173d | ||
|
|
939180c1a1 | ||
|
|
8205737fdb | ||
|
|
75d4c9b446 | ||
|
|
e3cd1ac1f9 | ||
|
|
027a70a415 | ||
|
|
3dfe5f993b | ||
|
|
f5991dd9b6 | ||
|
|
58c5d008d5 | ||
|
|
ac1149156d | ||
|
|
ca866c0d7d | ||
|
|
90a3f88c08 | ||
|
|
c1f89c5640 | ||
|
|
5865a78c1e | ||
|
|
d4616a7fc6 | ||
|
|
d794357504 | ||
|
|
79b0484e20 | ||
|
|
62b4741b19 | ||
|
|
327f06bbaf | ||
|
|
d7cd90b5b8 | ||
|
|
85fef90c94 | ||
|
|
fca25479ad | ||
|
|
231d965bcb | ||
|
|
6c10282f9a | ||
|
|
cb399272fd | ||
|
|
245bce04d1 | ||
|
|
3101bdf127 | ||
|
|
384ae9c407 | ||
|
|
c671f8e7ef | ||
|
|
f39b9c85fe | ||
|
|
ab36270885 | ||
|
|
bd65dd8098 | ||
|
|
36b6f308e6 | ||
|
|
cd208314e0 | ||
|
|
da7b5135de | ||
|
|
cb3d2b327a | ||
|
|
48db3a3e92 | ||
|
|
7182fb8fb0 | ||
|
|
d7da390ae9 | ||
|
|
54c1025ec0 | ||
|
|
5e7b7cba31 | ||
|
|
5a6b1cbf66 | ||
|
|
180e6d2c75 | ||
|
|
acbf25f2eb | ||
|
|
7c90cc6aac | ||
|
|
261af8dc07 | ||
|
|
2f344268ff | ||
|
|
42f3c24fc4 | ||
|
|
c4b97a1710 | ||
|
|
4f76bc42d7 | ||
|
|
fbd5600563 | ||
|
|
3259e2eac9 | ||
|
|
baca292f47 | ||
|
|
8babf0ec73 | ||
|
|
c07d124d4b | ||
|
|
a0db1eaa32 | ||
|
|
dbd61d129d | ||
|
|
21b5fb5ddb | ||
|
|
f55fafbc66 | ||
|
|
768843f1f0 | ||
|
|
cc7d1226ee | ||
|
|
8abafc54a6 | ||
|
|
885695fa67 | ||
|
|
e0bf309bb5 | ||
|
|
d907bcd57a | ||
|
|
0167bbb89a | ||
|
|
0471aaec52 | ||
|
|
18636a4df5 | ||
|
|
2be122875a | ||
|
|
c517f6daf9 | ||
|
|
07223bf5ef | ||
|
|
7862ba583e | ||
|
|
8c10d91135 | ||
|
|
c81d0f3393 | ||
|
|
0b8b9e8033 | ||
|
|
b73198d5ef | ||
|
|
4236699052 | ||
|
|
75935ad251 | ||
|
|
a3c3f47e17 | ||
|
|
17f07a36ef | ||
|
|
557a0c7ae3 | ||
|
|
1b98df4a0d | ||
|
|
58bfb0458e | ||
|
|
95cbf95c50 | ||
|
|
0b4402ebc8 | ||
|
|
d64b3f21e6 | ||
|
|
931fcfd0f5 | ||
|
|
a6ca9aa306 | ||
|
|
40ef282982 | ||
|
|
9152d6671c | ||
|
|
d057e95ce3 | ||
|
|
ac2932bac3 | ||
|
|
118331207b | ||
|
|
7c104c8fbb | ||
|
|
11c94b6566 | ||
|
|
c555b532a2 | ||
|
|
fdc4c25e67 | ||
|
|
083134bc12 | ||
|
|
f1c4a9ebfa | ||
|
|
1edd2ed3db | ||
|
|
b8b04271b5 | ||
|
|
f0b33f5ced | ||
|
|
42eead8f41 | ||
|
|
33054a18db | ||
|
|
f4036e8352 | ||
|
|
f9c30017b0 | ||
|
|
8be76ed450 | ||
|
|
328b25d561 | ||
|
|
9eff9676e9 | ||
|
|
a1d8335a8c | ||
|
|
d5a174364a | ||
|
|
62c3de30b9 | ||
|
|
ebcb46cd48 | ||
|
|
1689361ff2 | ||
|
|
05e177e2c8 | ||
|
|
eb998bda62 | ||
|
|
116bcb9dfb | ||
|
|
6a452951f5 | ||
|
|
a891854ef5 | ||
|
|
a2dffd430b | ||
|
|
4ac0580aa0 | ||
|
|
5d872b26a1 | ||
|
|
8d2c8065eb | ||
|
|
bf176ed712 | ||
|
|
eb875de67e | ||
|
|
2a77b9fcc7 | ||
|
|
9a4a5b1816 | ||
|
|
3a0ab861c2 | ||
|
|
fdc0d30337 | ||
|
|
96e4ec4a15 | ||
|
|
fa4b711495 | ||
|
|
0113b735ad | ||
|
|
d228ff0f43 | ||
|
|
9abbb581c5 | ||
|
|
d7c50f56d7 | ||
|
|
b6750de9e8 | ||
|
|
c91caa06d3 | ||
|
|
6c3c184bc7 | ||
|
|
af71292aba | ||
|
|
24e29cecae | ||
|
|
ab4c3a326f | ||
|
|
d73ca29a07 | ||
|
|
d6fbe45296 | ||
|
|
dd1cd5e491 | ||
|
|
2b02db2675 | ||
|
|
6f93a8f091 | ||
|
|
47074c897e | ||
|
|
2270f0d172 | ||
|
|
1b5d3466ba | ||
|
|
dcc2247a90 | ||
|
|
00b7aeb49b | ||
|
|
4f5b781b88 | ||
|
|
b51d1b79a3 | ||
|
|
4848de3a8e | ||
|
|
88b1cebe1d | ||
|
|
bb9e9e5480 | ||
|
|
786a7fbaf4 | ||
|
|
0ce27296aa | ||
|
|
a1d176b643 | ||
|
|
0c18e653e8 | ||
|
|
065b8c945b | ||
|
|
f49fc35f55 | ||
|
|
67795ad26e | ||
|
|
2aef8bad55 | ||
|
|
9f05cabf87 | ||
|
|
4c07b1606c | ||
|
|
d3f0a3211d | ||
|
|
ec7333d406 | ||
|
|
6a40426421 | ||
|
|
c9ebb895a1 | ||
|
|
f66bbda8b1 | ||
|
|
da2d9f3733 | ||
|
|
9e0252b209 | ||
|
|
531ea17088 | ||
|
|
e89f5983be | ||
|
|
6784fd64f3 | ||
|
|
ced2543be0 | ||
|
|
261e92c57b | ||
|
|
55bd48dc10 | ||
|
|
96dc30dea2 | ||
|
|
ea7b0052f3 | ||
|
|
1db9013bc4 | ||
|
|
060cbe15d6 | ||
|
|
8532d0d152 | ||
|
|
173e63f01b | ||
|
|
066daf21ef | ||
|
|
10f4604939 | ||
|
|
08ab2d89f4 | ||
|
|
775deefeaa | ||
|
|
cbf281589b | ||
|
|
f1d95379bc | ||
|
|
7c4377af0e | ||
|
|
f93b8fe377 | ||
|
|
978c68dcf8 | ||
|
|
c0925d2d04 | ||
|
|
15e8208457 | ||
|
|
d8fe18c28e | ||
|
|
9ee85fb1b6 | ||
|
|
bdbc96f453 | ||
|
|
5f7831b3c8 | ||
|
|
6336279ce0 | ||
|
|
ab4b59afb9 | ||
|
|
046a270156 | ||
|
|
2f293d53ba | ||
|
|
1d7caed340 | ||
|
|
5993c816d8 | ||
|
|
15ccac78d9 | ||
|
|
d81841f54e | ||
|
|
95f4c02381 | ||
|
|
df0e4492a7 | ||
|
|
e01f342048 | ||
|
|
792f5b3f22 | ||
|
|
a42baedc28 | ||
|
|
6607cab902 | ||
|
|
3a09de82e3 | ||
|
|
c028619cdd | ||
|
|
6b1dc21383 | ||
|
|
613acd93c0 | ||
|
|
837cb42679 | ||
|
|
0e9cb48ea1 | ||
|
|
090aaefb39 | ||
|
|
0b9c9f9ede | ||
|
|
8e65fb920f | ||
|
|
945460c67e | ||
|
|
b7e4d2a8ff | ||
|
|
9768657fc7 | ||
|
|
a185e19bc1 | ||
|
|
b7603f8600 | ||
|
|
d8d281281c | ||
|
|
5ee9c95ebd | ||
|
|
fb5a1a2c0f | ||
|
|
4a5a7ee922 | ||
|
|
d258bc263a | ||
|
|
8a30754e9c | ||
|
|
a14bc9ed44 | ||
|
|
75adf4bac6 | ||
|
|
8d6013454c | ||
|
|
1a25062af0 | ||
|
|
8aedcadd3e | ||
|
|
027d59fd46 | ||
|
|
273e70e403 | ||
|
|
aee6c1f72f | ||
|
|
9ee40d9f88 | ||
|
|
754fe60979 | ||
|
|
3a429eabcd | ||
|
|
9209a2ee33 | ||
|
|
3a607a197e | ||
|
|
3639daa329 | ||
|
|
8fd6a61df6 | ||
|
|
a6b0d40f9d | ||
|
|
974cf08e5d | ||
|
|
75fd6fc4a4 | ||
|
|
4f7dc3c76c | ||
|
|
7abfe74fa4 | ||
|
|
d5a159d7af | ||
|
|
add68e0da1 | ||
|
|
a85f9db5b1 | ||
|
|
c43ab76bbe | ||
|
|
98df3c6e0a | ||
|
|
0a4130a4ff | ||
|
|
93828fde80 | ||
|
|
a3fdc33f88 | ||
|
|
a330917ee8 | ||
|
|
0fe5dd8d43 | ||
|
|
953d783a3e | ||
|
|
d1ef610822 | ||
|
|
2ff620e1b5 | ||
|
|
0aaf69769f | ||
|
|
b5ab0c5285 | ||
|
|
2442b985bf | ||
|
|
78201c0146 | ||
|
|
499f4689be | ||
|
|
2106f491d0 | ||
|
|
81ac03a28b | ||
|
|
980af63b8d | ||
|
|
613644bfc6 | ||
|
|
7f5d6bc964 | ||
|
|
d5e37309e5 | ||
|
|
6bfa99a774 | ||
|
|
c899097802 | ||
|
|
70187bd47e | ||
|
|
018efc9631 | ||
|
|
a4f4e6e71d | ||
|
|
cde11f9d9c | ||
|
|
8fa3b6802e | ||
|
|
4192df97ec | ||
|
|
9085abd838 | ||
|
|
874415a193 | ||
|
|
5e9d80fbdb | ||
|
|
75f7f21eb0 | ||
|
|
c01e265e07 | ||
|
|
5c89228878 | ||
|
|
2740a81103 | ||
|
|
a27dc1e908 | ||
|
|
e9abfa6602 | ||
|
|
0f8a2d6418 | ||
|
|
2e479b88a8 | ||
|
|
fd982597fe | ||
|
|
887077b5a4 | ||
|
|
4e71ec4480 | ||
|
|
8ef712787a | ||
|
|
6c39b8a10c | ||
|
|
3c32c993f5 | ||
|
|
62d705903e | ||
|
|
a5e2e9ea03 | ||
|
|
055e3d52b6 | ||
|
|
efd3104fd0 | ||
|
|
bd570561e8 | ||
|
|
19d49db305 | ||
|
|
ab4993fda2 | ||
|
|
6f4056cf99 | ||
|
|
9cf1390dc6 | ||
|
|
6a2e323792 | ||
|
|
d4834803ae | ||
|
|
84fc489e0c | ||
|
|
255d5a748f | ||
|
|
b41520f9e2 | ||
|
|
0e881170c2 | ||
|
|
1571881f7a | ||
|
|
4dbf1dcad4 | ||
|
|
824ef1ff2c | ||
|
|
79d9b36ece | ||
|
|
be316e81a7 | ||
|
|
615e52d396 | ||
|
|
7f232b43ff | ||
|
|
5a12aeb4a1 | ||
|
|
05ea5f05ae | ||
|
|
e895aa71a4 | ||
|
|
eb28133b1f | ||
|
|
c66932ab25 | ||
|
|
36e8213e42 | ||
|
|
cde6d0deed | ||
|
|
b462cb4575 | ||
|
|
dd4ccfc672 | ||
|
|
6006e2f917 | ||
|
|
4bedb07aa0 | ||
|
|
02e194b15f | ||
|
|
82e579a29d | ||
|
|
eacac8ee1d | ||
|
|
cd19d81411 | ||
|
|
748ba22a19 | ||
|
|
79be888b6f | ||
|
|
58b3b0603d | ||
|
|
9d43d74ee3 | ||
|
|
9bc49b3268 | ||
|
|
d92e0dec22 | ||
|
|
7932bf483b | ||
|
|
e54f3fdaac | ||
|
|
e8b055b8d3 | ||
|
|
0c94f22ded | ||
|
|
05909d6fa7 | ||
|
|
712a22e18c | ||
|
|
35893e36dd | ||
|
|
787eecbf43 | ||
|
|
5f1aac1450 | ||
|
|
7fdd312cca | ||
|
|
f16911f7dd | ||
|
|
f6bdd2cae4 | ||
|
|
f8aa14d402 | ||
|
|
11a4f5538b | ||
|
|
26e88dc2c1 | ||
|
|
34fcccc50b | ||
|
|
2f53df93e8 | ||
|
|
996d5fda69 | ||
|
|
f75be85eea | ||
|
|
f1412f5e5a | ||
|
|
4208bcd8d1 | ||
|
|
5368a760cf | ||
|
|
9ec08fa76a | ||
|
|
913a99dd35 | ||
|
|
d956a39fec | ||
|
|
01d9bd573e | ||
|
|
d301b69dae | ||
|
|
c1fe7517ec | ||
|
|
cd1c96db56 | ||
|
|
4aee4c1ac7 | ||
|
|
bef0503545 | ||
|
|
7aea2cd6f1 | ||
|
|
028d707077 | ||
|
|
c9df03d1a9 | ||
|
|
19338d2774 | ||
|
|
005e5f2f72 | ||
|
|
e54cd23ecb | ||
|
|
544e469eeb | ||
|
|
db739d16ce | ||
|
|
5fff6e7ff8 | ||
|
|
776c01e60b | ||
|
|
3eb38d7611 | ||
|
|
766159e27e | ||
|
|
bb34d8cfd1 | ||
|
|
a880469d7d | ||
|
|
e5147d5562 | ||
|
|
d7ff85850c | ||
|
|
7294cb080b | ||
|
|
b422864d5d | ||
|
|
eab3667b61 | ||
|
|
713e89cdb2 | ||
|
|
b290f0442d | ||
|
|
b035a6196a | ||
|
|
e4cd00b5ea | ||
|
|
3bb13829fe | ||
|
|
1af676385c | ||
|
|
a24a170b84 | ||
|
|
bc4b3764fc | ||
|
|
9b143dd5dc | ||
|
|
5c65d4733b | ||
|
|
41a84ef1d3 | ||
|
|
86cecd6700 | ||
|
|
fdcb87db19 | ||
|
|
a868832776 | ||
|
|
5eabd4591a | ||
|
|
91afefa61a | ||
|
|
ea7bdb8e9e | ||
|
|
7cda728469 | ||
|
|
7fd37d4e87 | ||
|
|
874bfe19d2 | ||
|
|
ed07d481d6 | ||
|
|
7115975212 | ||
|
|
ddf0982d0f | ||
|
|
7b54ddd828 | ||
|
|
1ffd049833 | ||
|
|
12e0a2ef7d | ||
|
|
9da7afb345 | ||
|
|
1f544e087b | ||
|
|
e1b6a4cb21 | ||
|
|
bb8522b737 | ||
|
|
e075581d76 | ||
|
|
527d18a526 | ||
|
|
5ace5976a1 | ||
|
|
c52ac01fbc | ||
|
|
f4f2bfe379 | ||
|
|
75beb3bd35 | ||
|
|
1d22294974 | ||
|
|
de665f7cf9 | ||
|
|
205520c620 | ||
|
|
3551b2a2a1 | ||
|
|
11f2e8d1a6 | ||
|
|
a91374a916 | ||
|
|
36e6c26545 | ||
|
|
9a68f74857 | ||
|
|
b96c15890c | ||
|
|
5a6b26d69e | ||
|
|
a3d912a801 | ||
|
|
b4f1deaa46 | ||
|
|
976bce4c7f | ||
|
|
77e0f77850 | ||
|
|
a885cbf8ed | ||
|
|
b6af5d9bda | ||
|
|
b72677c3ce | ||
|
|
5e44122552 | ||
|
|
d4b6471d39 | ||
|
|
fe1bea9538 | ||
|
|
2f41e2b0ec | ||
|
|
bd86f95512 | ||
|
|
5fcf6418cf | ||
|
|
4e583dab2e | ||
|
|
bc182cab7c | ||
|
|
f6f6f11838 | ||
|
|
b5f4672155 | ||
|
|
729da3c873 | ||
|
|
8a31c6f807 | ||
|
|
2539b5cf61 | ||
|
|
f7881e58bb | ||
|
|
25ed4e9d16 | ||
|
|
7eddf93b36 | ||
|
|
cfb082a20b | ||
|
|
e440590c37 | ||
|
|
c851a19ab2 | ||
|
|
c2f9d7dee0 | ||
|
|
473e567047 | ||
|
|
64dab92c6b | ||
|
|
f576755b13 | ||
|
|
d0f279ece4 | ||
|
|
a5532ffd4d | ||
|
|
cb412134dd | ||
|
|
d079aae0e0 | ||
|
|
eabfb233b8 | ||
|
|
960e724ad3 | ||
|
|
82c46f957a | ||
|
|
320ea29861 | ||
|
|
c5e99ada63 | ||
|
|
c5bd3f5e3b | ||
|
|
a88d054d05 | ||
|
|
6576802287 | ||
|
|
693316c83f | ||
|
|
41ff80e5d3 | ||
|
|
56c5fdbeaf | ||
|
|
130d39cc03 | ||
|
|
1485edf8e1 | ||
|
|
514ee867a6 | ||
|
|
3cc7a406f4 | ||
|
|
c3f82acf7a | ||
|
|
cdb7557d88 | ||
|
|
2dcbd016e6 | ||
|
|
7d1728f05a | ||
|
|
4b5c14470a | ||
|
|
f198b11f27 | ||
|
|
7d16087789 | ||
|
|
d734cd986c | ||
|
|
8559f3e583 | ||
|
|
d0b81d3b20 | ||
|
|
43bf9a8e46 | ||
|
|
19f57bf810 | ||
|
|
469012b544 | ||
|
|
9b11c4670d | ||
|
|
7eeaf8eaa5 | ||
|
|
a82e02ef15 | ||
|
|
d8922d0410 | ||
|
|
5c628d2a61 | ||
|
|
54bb20b486 | ||
|
|
57a6eaae7b | ||
|
|
7a5cb21056 | ||
|
|
333c3f18c0 | ||
|
|
6b2979027e | ||
|
|
12f9adbdd3 | ||
|
|
a5cab96ff3 | ||
|
|
dd060ceed3 | ||
|
|
c89b085e5b | ||
|
|
63140ca7f8 | ||
|
|
cbe83f32b6 | ||
|
|
3bffb0a181 | ||
|
|
09dc9c89a8 | ||
|
|
09707a3e81 | ||
|
|
d821277430 | ||
|
|
1f01634029 | ||
|
|
dd314e1bdf | ||
|
|
1dae102359 | ||
|
|
b306594cad | ||
|
|
b60b7cf8fe | ||
|
|
0148128881 | ||
|
|
076a884651 | ||
|
|
7026bbcdd4 | ||
|
|
6158aa684b | ||
|
|
047e3455f7 | ||
|
|
9ca9649c1b | ||
|
|
9a23e9839b | ||
|
|
7fc966dced | ||
|
|
680afa4229 | ||
|
|
313743c833 | ||
|
|
6cb19d7e34 | ||
|
|
ef0575a26d | ||
|
|
c9db715bae | ||
|
|
ed1e3899af | ||
|
|
7446e31fce | ||
|
|
94abf9d935 | ||
|
|
d9b4ab1658 | ||
|
|
39f8538776 | ||
|
|
fef5c4c9a0 | ||
|
|
61dc2e7dd5 | ||
|
|
11a820458f | ||
|
|
9e7418090d | ||
|
|
0b3b713123 | ||
|
|
00f8cf57cd | ||
|
|
c55c375b0a | ||
|
|
db76ca248b | ||
|
|
182e1909b2 | ||
|
|
3aea7bc053 | ||
|
|
39c35732de | ||
|
|
6c8850698d | ||
|
|
818a726679 | ||
|
|
f8663a7129 | ||
|
|
7571fe5d13 | ||
|
|
60dc1c22f7 | ||
|
|
02b575e9e4 | ||
|
|
6facaf8f05 | ||
|
|
319a972e75 | ||
|
|
61cdbb30a6 | ||
|
|
5088a38b9f | ||
|
|
f5c6a6d075 | ||
|
|
b5340dd739 | ||
|
|
e1dcfcbb76 | ||
|
|
43d448e73f | ||
|
|
33fbb06604 | ||
|
|
e1b215aa73 | ||
|
|
6a17ef925d | ||
|
|
7599985a0a | ||
|
|
07c0bc288a | ||
|
|
f05d392920 | ||
|
|
e11d57c883 | ||
|
|
baf377679a | ||
|
|
f9355136d8 | ||
|
|
bb76e69567 | ||
|
|
533fc217d4 | ||
|
|
ac5c6695c1 | ||
|
|
3160488352 | ||
|
|
8579e4144f | ||
|
|
6880fa62f8 | ||
|
|
2cf4287197 | ||
|
|
86c774443c | ||
|
|
3b715f4602 | ||
|
|
ec0c2bea6e | ||
|
|
1b3682cfa9 | ||
|
|
2a9ee35411 | ||
|
|
0e0a7d82de | ||
|
|
dfa96852f0 | ||
|
|
a549ec0382 | ||
|
|
c61f01b206 | ||
|
|
15257f4524 | ||
|
|
089378ef87 | ||
|
|
805f495d84 | ||
|
|
928dd94ba6 | ||
|
|
b429918b32 | ||
|
|
62a37a4876 | ||
|
|
0e96ece6c6 | ||
|
|
f1eca32536 | ||
|
|
ed59dc1ada | ||
|
|
a5cd3fcafd | ||
|
|
f3def542ee | ||
|
|
aa249922df | ||
|
|
37a0c57bed | ||
|
|
90b7e68b4e | ||
|
|
1a0c497007 | ||
|
|
fd49ee3c8d | ||
|
|
3488a5c3c4 | ||
|
|
ae4955f59e | ||
|
|
fab107a9df | ||
|
|
bb87d19e84 | ||
|
|
4e309b7992 | ||
|
|
64aa4c716d | ||
|
|
6b0852a21f | ||
|
|
8afd3e882e | ||
|
|
791fa28817 | ||
|
|
3fab752640 | ||
|
|
67dd939d83 | ||
|
|
ec9b447be1 | ||
|
|
99e3fe9ae1 | ||
|
|
eb99d21022 | ||
|
|
793cbcdff8 | ||
|
|
751557bcbf | ||
|
|
252dcd8626 | ||
|
|
0ad7ea16d2 | ||
|
|
79842d4fdd | ||
|
|
1e1f5d5462 | ||
|
|
19d8ffe177 | ||
|
|
4cb8192c1d | ||
|
|
2ed5bc5195 | ||
|
|
fae1397468 | ||
|
|
e871548772 | ||
|
|
a3d27e30e0 | ||
|
|
89abd1f58e | ||
|
|
fae709d9ea | ||
|
|
36df79b207 | ||
|
|
b9ebcd7738 | ||
|
|
515fb5a3fd | ||
|
|
785f90d9fa | ||
|
|
22ac311496 | ||
|
|
0e31ca73c0 | ||
|
|
98ba558fa5 | ||
|
|
c4ef1e5c19 | ||
|
|
1fa0d66f15 | ||
|
|
4680307a34 | ||
|
|
42a6fa972d | ||
|
|
1da6c35a6d | ||
|
|
7c427a4dce | ||
|
|
c2abae538b | ||
|
|
eb69032773 | ||
|
|
fb5452910f | ||
|
|
a6d37fcb25 | ||
|
|
fb18e1f036 | ||
|
|
786cbee510 | ||
|
|
a4f5673ff3 | ||
|
|
1121f2b7f7 | ||
|
|
4d30218eb2 | ||
|
|
d7699ca81d | ||
|
|
afc3bc6b65 | ||
|
|
6f066fca82 | ||
|
|
5e24ae49a6 | ||
|
|
bf74ffe974 | ||
|
|
2074861b57 | ||
|
|
58b64d42f1 | ||
|
|
a6ab0405ea | ||
|
|
8273b54108 | ||
|
|
c356f560e8 | ||
|
|
8d052ecf24 | ||
|
|
45e36d9f56 | ||
|
|
c222d8b672 | ||
|
|
efed3f1f0d | ||
|
|
7524893802 | ||
|
|
25a0273b05 | ||
|
|
ce0410b205 | ||
|
|
efe5ce5c78 | ||
|
|
07f52b4b96 | ||
|
|
0be3598990 | ||
|
|
c3284c30cd | ||
|
|
2d94bf4998 | ||
|
|
31c1e72b8c | ||
|
|
d11fcafad8 | ||
|
|
27c6d299cf | ||
|
|
450dd65165 | ||
|
|
26819e6c39 | ||
|
|
6587efb3e8 | ||
|
|
8d2200f29b | ||
|
|
e4295396ac | ||
|
|
5c7a70df28 | ||
|
|
16a7a8258f | ||
|
|
fb1f61b212 | ||
|
|
c3137df39c | ||
|
|
2df9cd7262 | ||
|
|
a23f6afbee | ||
|
|
e37f7fafc1 | ||
|
|
7b803465ad | ||
|
|
273612b251 | ||
|
|
e2bc8e86e2 | ||
|
|
79110ba469 | ||
|
|
9dd10e46ab | ||
|
|
29df95c514 | ||
|
|
015cb1a35d | ||
|
|
b217b020a5 | ||
|
|
0c960a82ce | ||
|
|
e84cc8c0ad | ||
|
|
c69b93b246 | ||
|
|
5e13b9528d | ||
|
|
8bb3cab9d2 | ||
|
|
ed201c35d2 | ||
|
|
4eadc22a36 | ||
|
|
4e2260c74c | ||
|
|
a5148c14a1 | ||
|
|
955d6206ee | ||
|
|
5df22b3468 | ||
|
|
aef86ec5ef | ||
|
|
94d3b04d68 | ||
|
|
d31830225c | ||
|
|
8f309a3fec | ||
|
|
1fe4edbe1c | ||
|
|
fe1696cef7 | ||
|
|
de2e311e6e | ||
|
|
384fb3c353 | ||
|
|
8603e19516 | ||
|
|
7a2751043a | ||
|
|
e2b0c6c702 | ||
|
|
5b12c61a81 | ||
|
|
b8ee8808b4 | ||
|
|
2db9551750 | ||
|
|
7dc51270ee | ||
|
|
237b5a2467 | ||
|
|
110e5af36c | ||
|
|
7d4aef9576 | ||
|
|
811b360df7 | ||
|
|
d91b54882a | ||
|
|
9106a1f2d5 | ||
|
|
2e2dada561 | ||
|
|
6d704c728e | ||
|
|
6c6f32f17f | ||
|
|
0e4ce326c2 | ||
|
|
d27448da8a | ||
|
|
d36b723056 | ||
|
|
2c8aa6f6f4 | ||
|
|
6f7c8fb355 | ||
|
|
82f852abf3 | ||
|
|
239c6fe070 | ||
|
|
579d2ad811 | ||
|
|
0cb355cd7c | ||
|
|
86135d12b9 | ||
|
|
10d42c6fa3 | ||
|
|
6434f7efad | ||
|
|
bfdf19f56c | ||
|
|
79c7a7a43d | ||
|
|
175053085a | ||
|
|
3d90c062fd | ||
|
|
fda71b1230 | ||
|
|
a916de3b66 | ||
|
|
30e5dfddb9 | ||
|
|
f9dea9d35b | ||
|
|
4ea55b1bbc | ||
|
|
caf3c16826 | ||
|
|
a6f1111469 | ||
|
|
33d0096b81 | ||
|
|
ed4c5d88a3 | ||
|
|
e85a892111 | ||
|
|
70cd10beae | ||
|
|
3a784509df | ||
|
|
5c7189124c | ||
|
|
f81c2744cc | ||
|
|
4bf3359574 | ||
|
|
47984b0496 | ||
|
|
3c339323ed | ||
|
|
7399722a88 | ||
|
|
7bfea6edb7 | ||
|
|
f75da2c393 | ||
|
|
475576ec20 | ||
|
|
f6a8e1df03 | ||
|
|
e1c4bfad05 | ||
|
|
1ed40e7983 | ||
|
|
035fcce9de | ||
|
|
19eed5ff8a | ||
|
|
7129d4797c | ||
|
|
707d31a083 | ||
|
|
79e66ac841 | ||
|
|
1b96391cdf | ||
|
|
eed8ea5bc1 | ||
|
|
a646b5374f | ||
|
|
fa9b1ba947 | ||
|
|
7d58c0c2be | ||
|
|
3c71c378bc | ||
|
|
e4a6d199fe | ||
|
|
bdfdc2bb83 | ||
|
|
351e590e01 | ||
|
|
45756246b9 | ||
|
|
611fb3a1f9 | ||
|
|
ec1c2a714e | ||
|
|
55f64f13c7 | ||
|
|
bbc33080e7 | ||
|
|
506a57392c | ||
|
|
f0e0e72e4d | ||
|
|
7108c57876 | ||
|
|
49873ee687 | ||
|
|
cea2c0bbc4 | ||
|
|
93dfcdce93 | ||
|
|
ba786dc49b | ||
|
|
af384440f8 | ||
|
|
8014551908 | ||
|
|
c699921ff0 | ||
|
|
df99ce9d98 | ||
|
|
829744dfe6 | ||
|
|
734400cafa | ||
|
|
b306cab8be | ||
|
|
031a4cbdd8 | ||
|
|
0fc282e182 | ||
|
|
1eaf425627 | ||
|
|
326b8ff728 | ||
|
|
9ed2b7e03c | ||
|
|
08703f46f8 | ||
|
|
ea08652416 | ||
|
|
26d9b28f77 | ||
|
|
2bfd55fd69 | ||
|
|
39a6db4097 | ||
|
|
ff63557d39 | ||
|
|
4c7290fed0 | ||
|
|
31776e23fe | ||
|
|
6719f10034 | ||
|
|
b0273c9209 | ||
|
|
4ae13c6c26 | ||
|
|
cf7054dff2 | ||
|
|
b8eeee5528 | ||
|
|
30d5b11628 | ||
|
|
cd65d36822 | ||
|
|
cda867d52b | ||
|
|
24a9063721 | ||
|
|
840953c0e3 | ||
|
|
398bf575d9 | ||
|
|
8bfe344923 | ||
|
|
c3fa5819fd | ||
|
|
7e73e4728d | ||
|
|
03bc7c868b | ||
|
|
4c3f44b0d2 | ||
|
|
b031be753a | ||
|
|
6e9c995fc8 | ||
|
|
6ee1644db7 | ||
|
|
7cb64f2a43 | ||
|
|
6c907ce8d1 | ||
|
|
a0eb47d561 | ||
|
|
084c45d3db | ||
|
|
0ef3b9b3c5 | ||
|
|
ea5cd98e83 | ||
|
|
12bb78a425 | ||
|
|
042b2a39d9 | ||
|
|
1204e461c8 | ||
|
|
9bc16878ea | ||
|
|
7662015de6 | ||
|
|
e4775d4162 | ||
|
|
e147801ed8 | ||
|
|
ed14a32224 | ||
|
|
4ecb01f4fd | ||
|
|
a1efd95d0f | ||
|
|
ac2b4c2174 | ||
|
|
9ef5a61b1e | ||
|
|
b68c91c973 | ||
|
|
710ac00024 | ||
|
|
a96a12ed1f | ||
|
|
a8976fd367 | ||
|
|
11e0cf6f40 | ||
|
|
dc1ac6107f | ||
|
|
f9538c9395 | ||
|
|
445a64d933 | ||
|
|
d1940302bb | ||
|
|
3defc437c6 | ||
|
|
40f10b69f7 | ||
|
|
4c5117101d | ||
|
|
4bcfd81923 | ||
|
|
f6a8994521 | ||
|
|
0eb3d92782 | ||
|
|
50f47f18c1 | ||
|
|
18a215e6a8 | ||
|
|
0bce6f8974 | ||
|
|
be7275c238 | ||
|
|
1254b42e66 | ||
|
|
a389b630ac | ||
|
|
a4a7a7a47e | ||
|
|
a3087737bd | ||
|
|
12fc0239c2 | ||
|
|
0418edb7b6 | ||
|
|
2e233cb35b | ||
|
|
e36394e6cc | ||
|
|
6d3149714f | ||
|
|
f651747a89 | ||
|
|
9ea10ce05d | ||
|
|
dbad0d5723 | ||
|
|
21d17e41fd | ||
|
|
af8f280811 | ||
|
|
7abb278b60 | ||
|
|
7842a0190a | ||
|
|
a22e66f5ee | ||
|
|
1a72feb128 | ||
|
|
132b09ce09 | ||
|
|
a28af1be11 | ||
|
|
b04ac8f3be | ||
|
|
5f35f4bb3b | ||
|
|
4c3512c0a2 | ||
|
|
09ca7a181b | ||
|
|
82a32be1d6 | ||
|
|
9f3511231a | ||
|
|
6da25968e0 | ||
|
|
a70f478ef1 | ||
|
|
6c147709b6 | ||
|
|
8636ac26cf | ||
|
|
01a53d955e | ||
|
|
a5be8fe82c | ||
|
|
e6cc785fff | ||
|
|
00809b49f1 | ||
|
|
917f8ec799 | ||
|
|
37ff512516 | ||
|
|
c50f80da92 | ||
|
|
2bd3d51fcf | ||
|
|
2e0829fb5a | ||
|
|
c4ff244c4e | ||
|
|
002998cf49 | ||
|
|
7dea6dc834 | ||
|
|
fd0d94af44 | ||
|
|
ab630b2875 | ||
|
|
09aff62b11 | ||
|
|
f4f717b20a | ||
|
|
cf188ba15c | ||
|
|
fa34d51b7e | ||
|
|
6621f8b88a | ||
|
|
f9e4f4d813 | ||
|
|
80b961df60 | ||
|
|
cea002a088 | ||
|
|
e062b70da8 | ||
|
|
ce4dbcec6a | ||
|
|
07058652c1 | ||
|
|
7a92011933 | ||
|
|
c60d0de919 | ||
|
|
6457b93a1f | ||
|
|
20667e5163 | ||
|
|
74f2b5e5f7 | ||
|
|
96f2e162ef | ||
|
|
859f06a91e | ||
|
|
9cafc7a764 | ||
|
|
32d9f25a6f | ||
|
|
2f7e4bd587 | ||
|
|
84697ce713 | ||
|
|
0846206bc0 | ||
|
|
441e9b8431 | ||
|
|
f9f21934ab | ||
|
|
2673568cfd | ||
|
|
45c13ad08f | ||
|
|
76d395c8de | ||
|
|
090b4087fc | ||
|
|
7ece19c474 | ||
|
|
dbdd0f520f | ||
|
|
d47ef79c04 | ||
|
|
400ff200ee | ||
|
|
daeb21b3b9 | ||
|
|
7e36c58529 | ||
|
|
aa84869fdb | ||
|
|
bd6b1a0237 | ||
|
|
adf088e575 | ||
|
|
8613f2a48e | ||
|
|
12228ea34d | ||
|
|
f308f7cc80 | ||
|
|
eb1a41f3c9 | ||
|
|
ee2c049518 | ||
|
|
0ba9a45d32 | ||
|
|
bcfc7173f3 | ||
|
|
d390ca7056 | ||
|
|
18df3961e9 | ||
|
|
d372121d6e | ||
|
|
8e9aa84070 | ||
|
|
6319ffbcb8 | ||
|
|
d1c03cbd69 | ||
|
|
37629fc1b6 | ||
|
|
cc31bb9358 | ||
|
|
35ef1e1b86 | ||
|
|
d8d787545e | ||
|
|
0a51d72098 | ||
|
|
e13c78820f | ||
|
|
7f1becc682 | ||
|
|
1660e800e0 | ||
|
|
da40fbd054 | ||
|
|
90bc698a40 | ||
|
|
cb6cec0404 | ||
|
|
de29a0818e | ||
|
|
4fc309b1dd | ||
|
|
353478180d | ||
|
|
ea66eb6c23 | ||
|
|
7b3e158c92 | ||
|
|
848dea2058 | ||
|
|
f2d35751ca | ||
|
|
16833de1cf | ||
|
|
0cb0cd6611 | ||
|
|
dc49999124 | ||
|
|
daebdd1d77 | ||
|
|
c68ee2b2ed | ||
|
|
32fbec2e48 | ||
|
|
c13e08a7f5 | ||
|
|
451926e5c3 | ||
|
|
1868b2d244 | ||
|
|
dd2fa15e8a | ||
|
|
d2e008d4b4 | ||
|
|
98fbb855fb | ||
|
|
987e9df948 | ||
|
|
70d54479a1 | ||
|
|
c91b024153 | ||
|
|
f5f31f5eaa | ||
|
|
442f46a1ce | ||
|
|
ea6432702f | ||
|
|
faa9191191 | ||
|
|
8560f6ef2b | ||
|
|
b0c1e37364 | ||
|
|
bb0194cc0c | ||
|
|
304dc9fd07 | ||
|
|
bcfdf4c1cf | ||
|
|
663b79ca72 | ||
|
|
4a720425b7 | ||
|
|
0e4d59541a | ||
|
|
ba666295eb | ||
|
|
d34851db91 | ||
|
|
7dfd162a34 | ||
|
|
6d0a8a85c7 | ||
|
|
721d237120 | ||
|
|
46c575c038 | ||
|
|
16434f0d01 | ||
|
|
39edc69514 | ||
|
|
2154ac3ecb | ||
|
|
42309b5d6f | ||
|
|
07af438a38 | ||
|
|
fa8f6cb204 | ||
|
|
049853362a | ||
|
|
3e6202f614 | ||
|
|
a993e962f5 | ||
|
|
1ad5537c9b | ||
|
|
ea0dc429a7 | ||
|
|
8d7f09fa92 | ||
|
|
02a6a8a809 | ||
|
|
2bba9bcd9f | ||
|
|
4eebbdea0d | ||
|
|
4a2d03a517 | ||
|
|
5212afdd8f | ||
|
|
e196108931 | ||
|
|
a5e9b73703 | ||
|
|
5e13d495f0 | ||
|
|
a528a2323e | ||
|
|
c786f238ef | ||
|
|
d04f7aa4bc | ||
|
|
ced453a72b | ||
|
|
0f3e8c19e8 |
7
FILES
7
FILES
@@ -1,7 +1,4 @@
|
|||||||
src/ - The source code for the lwIP TCP/IP stack.
|
src/ - The source code for the lwIP TCP/IP stack.
|
||||||
|
doc/ - The documentation for lwIP.
|
||||||
|
|
||||||
proj/ - Makefiles and code for compiling lwIP.
|
See also the FILES file in each subdirectory.
|
||||||
|
|
||||||
doc/ - Documentation on the lwIP APIs.
|
|
||||||
|
|
||||||
See also the FILES file in each subdirectory.
|
|
||||||
|
|||||||
86
README
86
README
@@ -1,3 +1,5 @@
|
|||||||
|
INTRODUCTION
|
||||||
|
|
||||||
lwIP is a small independent implementation of the TCP/IP protocol
|
lwIP is a small independent implementation of the TCP/IP protocol
|
||||||
suite that has been developed by Adam Dunkels at the Computer and
|
suite that has been developed by Adam Dunkels at the Computer and
|
||||||
Networks Architectures (CNA) lab at the Swedish Institute of Computer
|
Networks Architectures (CNA) lab at the Swedish Institute of Computer
|
||||||
@@ -5,55 +7,83 @@ Science (SICS).
|
|||||||
|
|
||||||
The focus of the lwIP TCP/IP implementation is to reduce the RAM usage
|
The focus of the lwIP TCP/IP implementation is to reduce the RAM usage
|
||||||
while still having a full scale TCP. This making lwIP suitable for use
|
while still having a full scale TCP. This making lwIP suitable for use
|
||||||
in embedded systems with tenths of kilobytes of free RAM and room for
|
in embedded systems with tens of kilobytes of free RAM and room for
|
||||||
around 40 kilobytes of code ROM.
|
around 40 kilobytes of code ROM.
|
||||||
|
|
||||||
lwIP features:
|
FEATURES
|
||||||
* IP (Internet Protocol) including packet forwarding over multiple
|
|
||||||
network interfaces
|
* IP (Internet Protocol) including packet forwarding over multiple network
|
||||||
* ICMP (Internet Control Message Protocol) for network maintenance
|
interfaces
|
||||||
and debugging
|
* ICMP (Internet Control Message Protocol) for network maintenance and debugging
|
||||||
* UDP (User Datagram Protocol) including experimental UDP-lite
|
* IGMP (Internet Group Management Protocol) for multicast traffic management
|
||||||
extensions
|
* UDP (User Datagram Protocol) including experimental UDP-lite extensions
|
||||||
* TCP (Transmission Control Protocol) with congestion control, RTT
|
* TCP (Transmission Control Protocol) with congestion control, RTT estimation
|
||||||
estimation and fast recovery/fast retransmit
|
and fast recovery/fast retransmit
|
||||||
* Specialized API for enhanced performance
|
* Specialized raw/native API for enhanced performance
|
||||||
* Optional Berkeley socket API
|
* Optional Berkeley-like socket API
|
||||||
|
* DNS (Domain names resolver)
|
||||||
|
* SNMP (Simple Network Management Protocol)
|
||||||
|
* DHCP (Dynamic Host Configuration Protocol)
|
||||||
|
* AUTOIP (for IPv4, conform with RFC 3927)
|
||||||
|
* PPP (Point-to-Point Protocol)
|
||||||
|
* ARP (Address Resolution Protocol) for Ethernet
|
||||||
|
|
||||||
|
LICENSE
|
||||||
|
|
||||||
lwIP is freely available under a BSD license.
|
lwIP is freely available under a BSD license.
|
||||||
|
|
||||||
|
DEVELOPMENT
|
||||||
|
|
||||||
lwIP has grown into an excellent TCP/IP stack for embedded devices,
|
lwIP has grown into an excellent TCP/IP stack for embedded devices,
|
||||||
and developers using the stack often submit bug fixes, improvements,
|
and developers using the stack often submit bug fixes, improvements,
|
||||||
and additions to the stack to further increase its usefulness.
|
and additions to the stack to further increase its usefulness.
|
||||||
|
|
||||||
Development of lwIP is hosted on Savannah, a central point for
|
Development of lwIP is hosted on Savannah, a central point for
|
||||||
software development, maintenance and distribution. A core team
|
software development, maintenance and distribution. Everyone can
|
||||||
will improve lwIP by the use of Savannah's interface and CVS.
|
help improve lwIP by use of Savannah's interface, CVS and the
|
||||||
|
mailing list. A core team of developers will commit changes to the
|
||||||
|
CVS source tree.
|
||||||
|
|
||||||
The current lwIP CVS tree can be checked out by doing:
|
The lwIP TCP/IP stack is maintained in the 'lwip' CVS module and
|
||||||
cvs -d:pserver:anoncvs@subversions.gnu.org:/cvsroot/lwip login
|
contributions (such as platform ports) are in the 'contrib' module.
|
||||||
cvs -z3 -d:pserver:anoncvs@subversions.gnu.org:/cvsroot/lwip co lwip
|
|
||||||
|
See doc/savannah.txt for details on CVS server access for users and
|
||||||
|
developers.
|
||||||
|
|
||||||
Last night's CVS tar ball can be downloaded from:
|
Last night's CVS tar ball can be downloaded from:
|
||||||
http://savannah.gnu.org/cvs.backups/lwip.tar.gz
|
http://savannah.gnu.org/cvs.backups/lwip.tar.gz [CHANGED - NEEDS FIXING]
|
||||||
|
|
||||||
The current CVS tree is web-browsable:
|
The current CVS trees are web-browsable:
|
||||||
http://savannah.nongnu.org/cgi-bin/viewcvs/lwip/lwip/
|
http://savannah.nongnu.org/cgi-bin/viewcvs/lwip/lwip/
|
||||||
|
http://savannah.nongnu.org/cgi-bin/viewcvs/lwip/contrib/
|
||||||
|
|
||||||
Submit patches and bugs via the lwIP project page:
|
Submit patches and bugs via the lwIP project page:
|
||||||
http://savannah.nongnu.org/projects/lwip/
|
http://savannah.nongnu.org/projects/lwip/
|
||||||
|
|
||||||
Stable releases have not been released yet. For development we
|
|
||||||
suggest downloading the latest CVS and keeping track of the
|
|
||||||
lwIP mailing list.
|
|
||||||
|
|
||||||
The mailing list (with searchable archives), as well as Adam
|
DOCUMENTATION
|
||||||
Dunkels' papers on lwIP are at the official lwIP home page:
|
|
||||||
|
The original out-dated homepage of lwIP and Adam Dunkels' papers on
|
||||||
|
lwIP are at the official lwIP home page:
|
||||||
http://www.sics.se/~adam/lwip/
|
http://www.sics.se/~adam/lwip/
|
||||||
|
|
||||||
Reading Adam's papers and browsing the mailing list archives
|
Self documentation of the source code is regularly extracted from the
|
||||||
is a good way to become familiar with the design of lwIP.
|
current CVS sources and is available from this web page:
|
||||||
|
http://www.nongnu.org/lwip/
|
||||||
|
|
||||||
|
There is now a constantly growin wiki about lwIP at
|
||||||
|
http://lwip.scribblewiki.com/
|
||||||
|
|
||||||
|
Also, there are mailing lists you can subscribe at
|
||||||
|
http://savannah.nongnu.org/mail/?group=lwip
|
||||||
|
plus searchable archives:
|
||||||
|
http://lists.nongnu.org/archive/html/lwip-users/
|
||||||
|
http://lists.nongnu.org/archive/html/lwip-devel/
|
||||||
|
|
||||||
|
Reading Adam's papers, the files in docs/, browsing the source code
|
||||||
|
documentation and browsing the mailing list archives is a good way to
|
||||||
|
become familiar with the design of lwIP.
|
||||||
|
|
||||||
Adam Dunkels <adam@sics.se>
|
Adam Dunkels <adam@sics.se>
|
||||||
Leon Woestenberg <leon.woestenberg@gmx.net>
|
Leon Woestenberg <leon.woestenberg@gmx.net>
|
||||||
|
|
||||||
|
|||||||
5
doc/FILES
Normal file
5
doc/FILES
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
savannah.txt - How to obtain the current development source code.
|
||||||
|
contrib.txt - How to contribute to lwIP as a developer.
|
||||||
|
rawapi.txt - The documentation for the core API of lwIP.
|
||||||
|
snmp_agent.txt - The documentation for the lwIP SNMP agent.
|
||||||
|
sys_arch.txt - The documentation for a system abstraction layer of lwIP.
|
||||||
63
doc/contrib.txt
Normal file
63
doc/contrib.txt
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
1 Introduction
|
||||||
|
|
||||||
|
This document describes some guidelines for people participating
|
||||||
|
in lwIP development.
|
||||||
|
|
||||||
|
2 How to contribute to lwIP
|
||||||
|
|
||||||
|
Here is a short list of suggestions to anybody working with lwIP and
|
||||||
|
trying to contribute bug reports, fixes, enhancements, platform ports etc.
|
||||||
|
First of all as you may already know lwIP is a volunteer project so feedback
|
||||||
|
to fixes or questions might often come late. Hopefully the bug and patch tracking
|
||||||
|
features of Savannah help us not lose users' input.
|
||||||
|
|
||||||
|
2.1 Source code style:
|
||||||
|
|
||||||
|
1. do not use tabs.
|
||||||
|
2. indentation is two spaces per level (i.e. per tab).
|
||||||
|
3. end debug messages with a trailing newline (\n).
|
||||||
|
4. one space between keyword and opening bracket.
|
||||||
|
5. no space between function and opening bracket.
|
||||||
|
6. one space and no newline before opening curly braces of a block.
|
||||||
|
7. closing curly brace on a single line.
|
||||||
|
8. spaces surrounding assignment and comparisons.
|
||||||
|
9. don't initialize static and/or global variables to zero, the compiler takes care of that.
|
||||||
|
10. use current source code style as further reference.
|
||||||
|
|
||||||
|
2.2 Source code documentation style:
|
||||||
|
|
||||||
|
1. JavaDoc compliant and Doxygen compatible.
|
||||||
|
2. Function documentation above functions in .c files, not .h files.
|
||||||
|
(This forces you to synchronize documentation and implementation.)
|
||||||
|
3. Use current documentation style as further reference.
|
||||||
|
|
||||||
|
2.3 Bug reports and patches:
|
||||||
|
|
||||||
|
1. Make sure you are reporting bugs or send patches against the latest
|
||||||
|
sources. (From the latest release and/or the current CVS sources.)
|
||||||
|
2. If you think you found a bug make sure it's not already filed in the
|
||||||
|
bugtracker at Savannah.
|
||||||
|
3. If you have a fix put the patch on Savannah. If it is a patch that affects
|
||||||
|
both core and arch specific stuff please separate them so that the core can
|
||||||
|
be applied separately while leaving the other patch 'open'. The prefered way
|
||||||
|
is to NOT touch archs you can't test and let maintainers take care of them.
|
||||||
|
This is a good way to see if they are used at all - the same goes for unix
|
||||||
|
netifs except tapif.
|
||||||
|
4. Do not file a bug and post a fix to it to the patch area. Either a bug report
|
||||||
|
or a patch will be enough.
|
||||||
|
If you correct an existing bug then attach the patch to the bug rather than creating a new entry in the patch area.
|
||||||
|
5. Trivial patches (compiler warning, indentation and spelling fixes or anything obvious which takes a line or two)
|
||||||
|
can go to the lwip-users list. This is still the fastest way of interaction and the list is not so crowded
|
||||||
|
as to allow for loss of fixes. Putting bugs on Savannah and subsequently closing them is too much an overhead
|
||||||
|
for reporting a compiler warning fix.
|
||||||
|
6. Patches should be specific to a single change or to related changes.Do not mix bugfixes with spelling and other
|
||||||
|
trivial fixes unless the bugfix is trivial too.Do not reorganize code and rename identifiers in the same patch you
|
||||||
|
change behaviour if not necessary.A patch is easier to read and understand if it's to the point and short than
|
||||||
|
if it's not to the point and long :) so the chances for it to be applied are greater.
|
||||||
|
|
||||||
|
2.4 Platform porters:
|
||||||
|
|
||||||
|
1. If you have ported lwIP to a platform (an OS, a uC/processor or a combination of these) and
|
||||||
|
you think it could benefit others[1] you might want discuss this on the mailing list. You
|
||||||
|
can also ask for CVS access to submit and maintain your port in the contrib CVS module.
|
||||||
|
|
||||||
174
doc/rawapi.txt
174
doc/rawapi.txt
@@ -1,20 +1,21 @@
|
|||||||
Raw TCP/IP interface for lwIP 0.5
|
Raw TCP/IP interface for lwIP
|
||||||
|
|
||||||
Author: Adam Dunkels
|
Authors: Adam Dunkels, Leon Woestenberg, Christiaan Simons
|
||||||
|
|
||||||
lwIP provides two Application Program's Interfaces (APIs) for programs
|
lwIP provides two Application Program's Interfaces (APIs) for programs
|
||||||
to use for communication with the TCP/IP code: the sequential API
|
to use for communication with the TCP/IP code:
|
||||||
(often just called "the API") and the raw TCP/IP interface. This
|
* low-level "core" / "callback" or "raw" API.
|
||||||
document is intended as a description of the latter. For lwIP versions
|
* higher-level "sequential" API.
|
||||||
lower than 0.5, this API was not documented.
|
|
||||||
|
|
||||||
The sequential API provides a way for ordinary, sequential, programs
|
The sequential API provides a way for ordinary, sequential, programs
|
||||||
to use the lwIP stack. It is quite similar to the BSD socket API. The
|
to use the lwIP stack. It is quite similar to the BSD socket API. The
|
||||||
model of execution is based on the open-read-write-close
|
model of execution is based on the blocking open-read-write-close
|
||||||
paradigm. Since the TCP/IP stack is event based by nature, the TCP/IP
|
paradigm. Since the TCP/IP stack is event based by nature, the TCP/IP
|
||||||
code and the application program must reside in different execution
|
code and the application program must reside in different execution
|
||||||
contexts (threads).
|
contexts (threads).
|
||||||
|
|
||||||
|
** The remainder of this document discusses the "raw" API. **
|
||||||
|
|
||||||
The raw TCP/IP interface allows the application program to integrate
|
The raw TCP/IP interface allows the application program to integrate
|
||||||
better with the TCP/IP code. Program execution is event based by
|
better with the TCP/IP code. Program execution is event based by
|
||||||
having callback functions being called from within the TCP/IP
|
having callback functions being called from within the TCP/IP
|
||||||
@@ -34,7 +35,6 @@ Both APIs can be used simultaneously by different application
|
|||||||
programs. In fact, the sequential API is implemented as an application
|
programs. In fact, the sequential API is implemented as an application
|
||||||
program using the raw TCP/IP interface.
|
program using the raw TCP/IP interface.
|
||||||
|
|
||||||
|
|
||||||
--- Callbacks
|
--- Callbacks
|
||||||
|
|
||||||
Program execution is driven by callbacks. Each callback is an ordinary
|
Program execution is driven by callbacks. Each callback is an ordinary
|
||||||
@@ -95,6 +95,19 @@ incoming connections or be explicitly connected to another host.
|
|||||||
listening connection. If so, the memory associated with the pcb
|
listening connection. If so, the memory associated with the pcb
|
||||||
passed as an argument to tcp_listen() will not be deallocated.
|
passed as an argument to tcp_listen() will not be deallocated.
|
||||||
|
|
||||||
|
- struct tcp_pcb *tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog)
|
||||||
|
|
||||||
|
Same as tcp_listen, but limits the number of outstanding connections
|
||||||
|
in the listen queue to the value specified by the backlog argument.
|
||||||
|
To use it, your need to set TCP_LISTEN_BACKLOG=1 in your lwipopts.h.
|
||||||
|
|
||||||
|
- void tcp_accepted(struct tcp_pcb *pcb)
|
||||||
|
|
||||||
|
Inform lwIP that an incoming connection has been accepted. This would
|
||||||
|
usually be called from the accept callback. This allows lwIP to perform
|
||||||
|
housekeeping tasks, such as allowing further incoming connections to be
|
||||||
|
queued in the listen backlog.
|
||||||
|
|
||||||
- void tcp_accept(struct tcp_pcb *pcb,
|
- void tcp_accept(struct tcp_pcb *pcb,
|
||||||
err_t (* accept)(void *arg, struct tcp_pcb *newpcb,
|
err_t (* accept)(void *arg, struct tcp_pcb *newpcb,
|
||||||
err_t err))
|
err_t err))
|
||||||
@@ -153,7 +166,7 @@ callback function.
|
|||||||
|
|
||||||
- void tcp_sent(struct tcp_pcb *pcb,
|
- void tcp_sent(struct tcp_pcb *pcb,
|
||||||
err_t (* sent)(void *arg, struct tcp_pcb *tpcb,
|
err_t (* sent)(void *arg, struct tcp_pcb *tpcb,
|
||||||
u16_t len))
|
u16_t len))
|
||||||
|
|
||||||
Specifies the callback function that should be called when data has
|
Specifies the callback function that should be called when data has
|
||||||
successfully been received (i.e., acknowledged) by the remote
|
successfully been received (i.e., acknowledged) by the remote
|
||||||
@@ -175,7 +188,10 @@ window.
|
|||||||
|
|
||||||
Sets the callback function that will be called when new data
|
Sets the callback function that will be called when new data
|
||||||
arrives. The callback function will be passed a NULL pbuf to
|
arrives. The callback function will be passed a NULL pbuf to
|
||||||
indicate that the remote host has closed the connection.
|
indicate that the remote host has closed the connection. If
|
||||||
|
there are no errors and the callback function is to return
|
||||||
|
ERR_OK, then it must free the pbuf. Otherwise, it must not
|
||||||
|
free the pbuf so that lwIP core code can store it.
|
||||||
|
|
||||||
- void tcp_recved(struct tcp_pcb *pcb, u16_t len)
|
- void tcp_recved(struct tcp_pcb *pcb, u16_t len)
|
||||||
|
|
||||||
@@ -227,7 +243,7 @@ connection are when there is a shortage of memory. The callback
|
|||||||
function to be called is set using the tcp_err() function.
|
function to be called is set using the tcp_err() function.
|
||||||
|
|
||||||
- void tcp_err(struct tcp_pcb *pcb, void (* err)(void *arg,
|
- void tcp_err(struct tcp_pcb *pcb, void (* err)(void *arg,
|
||||||
err_t err))
|
err_t err))
|
||||||
|
|
||||||
The error callback function does not get the pcb passed to it as a
|
The error callback function does not get the pcb passed to it as a
|
||||||
parameter since the pcb may already have been deallocated.
|
parameter since the pcb may already have been deallocated.
|
||||||
@@ -272,6 +288,11 @@ level of complexity of UDP, the interface is significantly simpler.
|
|||||||
Sets the remote end of the pcb. This function does not generate any
|
Sets the remote end of the pcb. This function does not generate any
|
||||||
network traffic, but only set the remote address of the pcb.
|
network traffic, but only set the remote address of the pcb.
|
||||||
|
|
||||||
|
- err_t udp_disconnect(struct udp_pcb *pcb)
|
||||||
|
|
||||||
|
Remove the remote end of the pcb. This function does not generate
|
||||||
|
any network traffic, but only removes the remote address of the pcb.
|
||||||
|
|
||||||
- err_t udp_send(struct udp_pcb *pcb, struct pbuf *p)
|
- err_t udp_send(struct udp_pcb *pcb, struct pbuf *p)
|
||||||
|
|
||||||
Sends the pbuf p. The pbuf is not deallocated.
|
Sends the pbuf p. The pbuf is not deallocated.
|
||||||
@@ -284,4 +305,133 @@ level of complexity of UDP, the interface is significantly simpler.
|
|||||||
void *recv_arg)
|
void *recv_arg)
|
||||||
|
|
||||||
Specifies a callback function that should be called when a UDP
|
Specifies a callback function that should be called when a UDP
|
||||||
datagram is received.
|
datagram is received.
|
||||||
|
|
||||||
|
|
||||||
|
--- System initalization
|
||||||
|
|
||||||
|
A truly complete and generic sequence for initializing the lwip stack
|
||||||
|
cannot be given because it depends on the build configuration (lwipopts.h)
|
||||||
|
and additional initializations for your runtime environment (e.g. timers).
|
||||||
|
|
||||||
|
We can give you some idea on how to proceed when using the raw API.
|
||||||
|
We assume a configuration using a single Ethernet netif and the
|
||||||
|
UDP and TCP transport layers, IPv4 and the DHCP client.
|
||||||
|
|
||||||
|
Call these functions in the order of appearance:
|
||||||
|
|
||||||
|
- stats_init()
|
||||||
|
|
||||||
|
Clears the structure where runtime statistics are gathered.
|
||||||
|
|
||||||
|
- sys_init()
|
||||||
|
|
||||||
|
Not of much use since we set the NO_SYS 1 option in lwipopts.h,
|
||||||
|
to be called for easy configuration changes.
|
||||||
|
|
||||||
|
- mem_init()
|
||||||
|
|
||||||
|
Initializes the dynamic memory heap defined by MEM_SIZE.
|
||||||
|
|
||||||
|
- memp_init()
|
||||||
|
|
||||||
|
Initializes the memory pools defined by MEMP_NUM_x.
|
||||||
|
|
||||||
|
- pbuf_init()
|
||||||
|
|
||||||
|
Initializes the pbuf memory pool defined by PBUF_POOL_SIZE.
|
||||||
|
|
||||||
|
- etharp_init()
|
||||||
|
|
||||||
|
Initializes the ARP table and queue.
|
||||||
|
Note: you must call etharp_tmr at a ARP_TMR_INTERVAL (5 seconds) regular interval
|
||||||
|
after this initialization.
|
||||||
|
|
||||||
|
- ip_init()
|
||||||
|
|
||||||
|
Doesn't do much, it should be called to handle future changes.
|
||||||
|
|
||||||
|
- udp_init()
|
||||||
|
|
||||||
|
Clears the UDP PCB list.
|
||||||
|
|
||||||
|
- tcp_init()
|
||||||
|
|
||||||
|
Clears the TCP PCB list and clears some internal TCP timers.
|
||||||
|
Note: you must call tcp_fasttmr() and tcp_slowtmr() at the
|
||||||
|
predefined regular intervals after this initialization.
|
||||||
|
|
||||||
|
- netif_add(struct netif *netif, struct ip_addr *ipaddr,
|
||||||
|
struct ip_addr *netmask, struct ip_addr *gw,
|
||||||
|
void *state, err_t (* init)(struct netif *netif),
|
||||||
|
err_t (* input)(struct pbuf *p, struct netif *netif))
|
||||||
|
|
||||||
|
Adds your network interface to the netif_list. Allocate a struct
|
||||||
|
netif and pass a pointer to this structure as the first argument.
|
||||||
|
Give pointers to cleared ip_addr structures when using DHCP,
|
||||||
|
or fill them with sane numbers otherwise. The state pointer may be NULL.
|
||||||
|
|
||||||
|
The init function pointer must point to a initialization function for
|
||||||
|
your ethernet netif interface. The following code illustrates it's use.
|
||||||
|
|
||||||
|
err_t netif_if_init(struct netif *netif)
|
||||||
|
{
|
||||||
|
u8_t i;
|
||||||
|
|
||||||
|
for(i = 0; i < ETHARP_HWADDR_LEN; i++) netif->hwaddr[i] = some_eth_addr[i];
|
||||||
|
init_my_eth_device();
|
||||||
|
return ERR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
For ethernet drivers, the input function pointer must point to the lwip
|
||||||
|
function ethernet_input() declared in "netif/etharp.h". Other drivers
|
||||||
|
must use ip_input() declared in "lwip/ip.h".
|
||||||
|
|
||||||
|
- netif_set_default(struct netif *netif)
|
||||||
|
|
||||||
|
Registers the default network interface.
|
||||||
|
|
||||||
|
- netif_set_up(struct netif *netif)
|
||||||
|
|
||||||
|
When the netif is fully configured this function must be called.
|
||||||
|
|
||||||
|
- dhcp_start(struct netif *netif)
|
||||||
|
|
||||||
|
Creates a new DHCP client for this interface on the first call.
|
||||||
|
Note: you must call dhcp_fine_tmr() and dhcp_coarse_tmr() at
|
||||||
|
the predefined regular intervals after starting the client.
|
||||||
|
|
||||||
|
You can peek in the netif->dhcp struct for the actual DHCP status.
|
||||||
|
|
||||||
|
|
||||||
|
--- Optimalization hints
|
||||||
|
|
||||||
|
The first thing you want to optimize is the lwip_standard_checksum()
|
||||||
|
routine from src/core/inet.c. You can override this standard
|
||||||
|
function with the #define LWIP_CHKSUM <your_checksum_routine>.
|
||||||
|
|
||||||
|
There are C examples given in inet.c or you might want to
|
||||||
|
craft an assembly function for this. RFC1071 is a good
|
||||||
|
introduction to this subject.
|
||||||
|
|
||||||
|
Other significant improvements can be made by supplying
|
||||||
|
assembly or inline replacements for htons() and htonl()
|
||||||
|
if you're using a little-endian architecture.
|
||||||
|
#define LWIP_PLATFORM_BYTESWAP 1
|
||||||
|
#define LWIP_PLATFORM_HTONS(x) <your_htons>
|
||||||
|
#define LWIP_PLATFORM_HTONL(x) <your_htonl>
|
||||||
|
|
||||||
|
Check your network interface driver if it reads at
|
||||||
|
a higher speed than the maximum wire-speed. If the
|
||||||
|
hardware isn't serviced frequently and fast enough
|
||||||
|
buffer overflows are likely to occur.
|
||||||
|
|
||||||
|
E.g. when using the cs8900 driver, call cs8900if_service(ethif)
|
||||||
|
as frequently as possible. When using an RTOS let the cs8900 interrupt
|
||||||
|
wake a high priority task that services your driver using a binary
|
||||||
|
semaphore or event flag. Some drivers might allow additional tuning
|
||||||
|
to match your application and network.
|
||||||
|
|
||||||
|
For a production release it is recommended to set LWIP_STATS to 0.
|
||||||
|
Note that speed performance isn't influenced much by simply setting
|
||||||
|
high values to the memory options.
|
||||||
|
|||||||
135
doc/savannah.txt
Normal file
135
doc/savannah.txt
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
Daily Use Guide for using Savannah for lwIP
|
||||||
|
|
||||||
|
Table of Contents:
|
||||||
|
|
||||||
|
1 - Obtaining lwIP from the CVS repository
|
||||||
|
2 - Committers/developers CVS access using SSH (to be written)
|
||||||
|
3 - Merging from DEVEL branch to main trunk (stable branch)
|
||||||
|
4 - How to release lwIP
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1 Obtaining lwIP from the CVS repository
|
||||||
|
----------------------------------------
|
||||||
|
|
||||||
|
To perform an anonymous CVS checkout of the main trunk (this is where
|
||||||
|
bug fixes and incremental enhancements occur), do this:
|
||||||
|
|
||||||
|
cvs -z3 -d:pserver:anonymous@cvs.sv.gnu.org:/sources/lwip checkout lwip
|
||||||
|
|
||||||
|
Or, obtain a stable branch (updated with bug fixes only) as follows:
|
||||||
|
cvs -z3 -d:pserver:anonymous@cvs.sv.gnu.org:/sources/lwip checkout \
|
||||||
|
-r STABLE-0_7 -d lwip-0.7 lwip
|
||||||
|
|
||||||
|
Or, obtain a specific (fixed) release as follows:
|
||||||
|
cvs -z3 -d:pserver:anonymous@cvs.sv.gnu.org:/sources/lwip checkout \
|
||||||
|
-r STABLE-0_7_0 -d lwip-0.7.0 lwip
|
||||||
|
|
||||||
|
3 Committers/developers CVS access using SSH
|
||||||
|
--------------------------------------------
|
||||||
|
|
||||||
|
The Savannah server uses SSH (Secure Shell) protocol 2 authentication and encryption.
|
||||||
|
As such, CVS commits to the server occur through a SSH tunnel for project members.
|
||||||
|
To create a SSH2 key pair in UNIX-like environments, do this:
|
||||||
|
|
||||||
|
ssh-keygen -t dsa
|
||||||
|
|
||||||
|
Under Windows, a recommended SSH client is "PuTTY", freely available with good
|
||||||
|
documentation and a graphic user interface. Use its key generator.
|
||||||
|
|
||||||
|
Now paste the id_dsa.pub contents into your Savannah account public key list. Wait
|
||||||
|
a while so that Savannah can update its configuration (This can take minutes).
|
||||||
|
|
||||||
|
Try to login using SSH:
|
||||||
|
|
||||||
|
ssh -v your_login@cvs.sv.gnu.org
|
||||||
|
|
||||||
|
If it tells you:
|
||||||
|
|
||||||
|
Authenticating with public key "your_key_name"...
|
||||||
|
Server refused to allocate pty
|
||||||
|
|
||||||
|
then you could login; Savannah refuses to give you a shell - which is OK, as we
|
||||||
|
are allowed to use SSH for CVS only. Now, you should be able to do this:
|
||||||
|
|
||||||
|
export CVS_RSH=ssh
|
||||||
|
cvs -z3 -d:ext:your_login@cvs.sv.gnu.org:/sources/lwip co lwip
|
||||||
|
|
||||||
|
after which you can edit your local files with bug fixes or new features and
|
||||||
|
commit them. Make sure you know what you are doing when using CVS to make
|
||||||
|
changes on the repository. If in doubt, ask on the lwip-members mailing list.
|
||||||
|
|
||||||
|
(If SSH asks about authenticity of the host, you can check the key
|
||||||
|
fingerprint against http://savannah.nongnu.org/cvs/?group=lwip)
|
||||||
|
|
||||||
|
|
||||||
|
3 Merging from DEVEL branch to main trunk (stable)
|
||||||
|
--------------------------------------------------
|
||||||
|
|
||||||
|
Merging is a delicate process in CVS and requires the
|
||||||
|
following disciplined steps in order to prevent conflicts
|
||||||
|
in the future. Conflicts can be hard to solve!
|
||||||
|
|
||||||
|
Merging from branch A to branch B requires that the A branch
|
||||||
|
has a tag indicating the previous merger. This tag is called
|
||||||
|
'merged_from_A_to_B'. After merging, the tag is moved in the
|
||||||
|
A branch to remember this merger for future merge actions.
|
||||||
|
|
||||||
|
IMPORTANT: AFTER COMMITTING A SUCCESFUL MERGE IN THE
|
||||||
|
REPOSITORY, THE TAG MUST BE SET ON THE SOURCE BRANCH OF THE
|
||||||
|
MERGE ACTION (REPLACING EXISTING TAGS WITH THE SAME NAME).
|
||||||
|
|
||||||
|
Merge all changes in DEVEL since our last merge to main:
|
||||||
|
|
||||||
|
In the working copy of the main trunk:
|
||||||
|
cvs update -P -jmerged_from_DEVEL_to_main -jDEVEL
|
||||||
|
|
||||||
|
(This will apply the changes between 'merged_from_DEVEL_to_main'
|
||||||
|
and 'DEVEL' to your work set of files)
|
||||||
|
|
||||||
|
We can now commit the merge result.
|
||||||
|
cvs commit -R -m "Merged from DEVEL to main."
|
||||||
|
|
||||||
|
If this worked out OK, we now move the tag in the DEVEL branch
|
||||||
|
to this merge point, so we can use this point for future merges:
|
||||||
|
|
||||||
|
cvs rtag -F -r DEVEL merged_from_DEVEL_to_main lwip
|
||||||
|
|
||||||
|
4 How to release lwIP
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
First, checkout a clean copy of the branch to be released. Tag this set with
|
||||||
|
tag name "STABLE-0_6_3". (I use release number 0.6.3 throughout this example).
|
||||||
|
|
||||||
|
Login CVS using pserver authentication, then export a clean copy of the
|
||||||
|
tagged tree. Export is similar to a checkout, except that the CVS metadata
|
||||||
|
is not created locally.
|
||||||
|
|
||||||
|
export CVS_RSH=ssh
|
||||||
|
cvs -z3 -d:pserver:anonymous@cvs.sv.gnu.org:/sources/lwip checkout \
|
||||||
|
-r STABLE-0_6_3 -d lwip-0.6.3 lwip
|
||||||
|
|
||||||
|
Archive this directory using tar, gzip'd, bzip2'd and zip'd.
|
||||||
|
|
||||||
|
tar czvf lwip-0.6.3.tar.gz lwip-0.6.3
|
||||||
|
tar cjvf lwip-0.6.3.tar.bz2 lwip-0.6.3
|
||||||
|
zip -r lwip-0.6.3.zip lwip-0.6.3
|
||||||
|
|
||||||
|
Now, sign the archives with a detached GPG binary signature as follows:
|
||||||
|
|
||||||
|
gpg -b lwip-0.6.3.tar.gz
|
||||||
|
gpg -b lwip-0.6.3.tar.bz2
|
||||||
|
gpg -b lwip-0.6.3.zip
|
||||||
|
|
||||||
|
Upload these files using anonymous FTP:
|
||||||
|
ncftp ftp://savannah.gnu.org/incoming/savannah/lwip
|
||||||
|
|
||||||
|
ncftp>mput *0.6.3.*
|
||||||
|
|
||||||
|
Additionally, you may post a news item on Savannah, like this:
|
||||||
|
|
||||||
|
A new 0.6.3 release is now available here:
|
||||||
|
http://savannah.nongnu.org/files/?group=lwip&highlight=0.6.3
|
||||||
|
|
||||||
|
You will have to submit this via the user News interface, then approve
|
||||||
|
this via the Administrator News interface.
|
||||||
181
doc/snmp_agent.txt
Normal file
181
doc/snmp_agent.txt
Normal file
@@ -0,0 +1,181 @@
|
|||||||
|
SNMPv1 agent for lwIP
|
||||||
|
|
||||||
|
Author: Christiaan Simons
|
||||||
|
|
||||||
|
This is a brief introduction how to use and configure the SNMP agent.
|
||||||
|
Note the agent uses the raw-API UDP interface so you may also want to
|
||||||
|
read rawapi.txt to gain a better understanding of the SNMP message handling.
|
||||||
|
|
||||||
|
0 Agent Capabilities
|
||||||
|
====================
|
||||||
|
|
||||||
|
SNMPv1 per RFC1157
|
||||||
|
This is an old(er) standard but is still widely supported.
|
||||||
|
For SNMPv2c and v3 have a greater complexity and need many
|
||||||
|
more lines of code. IMHO this breaks the idea of "lightweight IP".
|
||||||
|
|
||||||
|
Note the S in SNMP stands for "Simple". Note that "Simple" is
|
||||||
|
relative. SNMP is simple compared to the complex ISO network
|
||||||
|
management protocols CMIP (Common Management Information Protocol)
|
||||||
|
and CMOT (CMip Over Tcp).
|
||||||
|
|
||||||
|
MIB II per RFC1213
|
||||||
|
The standard lwIP stack management information base.
|
||||||
|
This is a required MIB, so this is always enabled.
|
||||||
|
When builing lwIP without TCP, the mib-2.tcp group is omitted.
|
||||||
|
The groups EGP, CMOT and transmission are disabled by default.
|
||||||
|
|
||||||
|
Most mib-2 objects are not writable except:
|
||||||
|
sysName, sysLocation, sysContact, snmpEnableAuthenTraps.
|
||||||
|
Writing to or changing the ARP and IP address and route
|
||||||
|
tables is not possible.
|
||||||
|
|
||||||
|
Note lwIP has a very limited notion of IP routing. It currently
|
||||||
|
doen't have a route table and doesn't have a notion of the U,G,H flags.
|
||||||
|
Instead lwIP uses the interface list with only one default interface
|
||||||
|
acting as a single gateway interface (G) for the default route.
|
||||||
|
|
||||||
|
The agent returns a "virtual table" with the default route 0.0.0.0
|
||||||
|
for the default interface and network routes (no H) for each
|
||||||
|
network interface in the netif_list.
|
||||||
|
All routes are considered to be up (U).
|
||||||
|
|
||||||
|
Loading additional MIBs
|
||||||
|
MIBs can only be added in compile-time, not in run-time.
|
||||||
|
There is no MIB compiler thus additional MIBs must be hand coded.
|
||||||
|
|
||||||
|
Large SNMP message support
|
||||||
|
The packet decoding and encoding routines are designed
|
||||||
|
to use pbuf-chains. Larger payloads then the minimum
|
||||||
|
SNMP requirement of 484 octets are supported if the
|
||||||
|
PBUF_POOL_SIZE and IP_REASS_BUFSIZE are set to match your
|
||||||
|
local requirement.
|
||||||
|
|
||||||
|
1 Building the Agent
|
||||||
|
====================
|
||||||
|
|
||||||
|
First of all you'll need to add the following define
|
||||||
|
to your local lwipopts.h:
|
||||||
|
|
||||||
|
#define LWIP_SNMP 1
|
||||||
|
|
||||||
|
and add the source files in lwip/src/core/snmp
|
||||||
|
and some snmp headers in lwip/src/include/lwip to your makefile.
|
||||||
|
|
||||||
|
Note you'll might need to adapt you network driver to update
|
||||||
|
the mib2 variables for your interface.
|
||||||
|
|
||||||
|
2 Running the Agent
|
||||||
|
===================
|
||||||
|
|
||||||
|
The following function calls must be made in your program to
|
||||||
|
actually get the SNMP agent running.
|
||||||
|
|
||||||
|
Before starting the agent you should supply pointers
|
||||||
|
to non-volatile memory for sysContact, sysLocation,
|
||||||
|
and snmpEnableAuthenTraps. You can do this by calling
|
||||||
|
|
||||||
|
snmp_set_syscontact()
|
||||||
|
snmp_set_syslocation()
|
||||||
|
snmp_set_snmpenableauthentraps()
|
||||||
|
|
||||||
|
Additionally you may want to set
|
||||||
|
|
||||||
|
snmp_set_sysdescr()
|
||||||
|
snmp_set_sysobjid() (if you have a private MIB)
|
||||||
|
snmp_set_sysname()
|
||||||
|
|
||||||
|
Also before starting the agent you need to setup
|
||||||
|
one or more trap destinations using these calls:
|
||||||
|
|
||||||
|
snmp_trap_dst_enable();
|
||||||
|
snmp_trap_dst_ip_set();
|
||||||
|
|
||||||
|
In the lwIP initialisation sequence call snmp_init() just after
|
||||||
|
the call to udp_init().
|
||||||
|
|
||||||
|
Exactly every 10 msec the SNMP uptime timestamp must be updated with
|
||||||
|
snmp_inc_sysuptime(). You should call this from a timer interrupt
|
||||||
|
or a timer signal handler depending on your runtime environment.
|
||||||
|
|
||||||
|
An alternative way to update the SNMP uptime timestamp is to do a call like
|
||||||
|
snmp_add_sysuptime(100) each 1000ms (which is bigger "step", but call to
|
||||||
|
a lower frequency). Another one is to not call snmp_inc_sysuptime() or
|
||||||
|
snmp_add_sysuptime(), and to define the SNMP_GET_SYSUPTIME(sysuptime) macro.
|
||||||
|
This one is undefined by default in mib2.c. SNMP_GET_SYSUPTIME is called inside
|
||||||
|
snmp_get_sysuptime(u32_t *value), and enable to change "sysuptime" value only
|
||||||
|
when it's queried (any function which need "sysuptime" have to call
|
||||||
|
snmp_get_sysuptime).
|
||||||
|
|
||||||
|
|
||||||
|
3 Private MIBs
|
||||||
|
==============
|
||||||
|
|
||||||
|
If want to extend the agent with your own private MIB you'll need to
|
||||||
|
add the following define to your local lwipopts.h:
|
||||||
|
|
||||||
|
#define SNMP_PRIVATE_MIB 1
|
||||||
|
|
||||||
|
You must provide the private_mib.h and associated files yourself.
|
||||||
|
Note we don't have a "MIB compiler" that generates C source from a MIB,
|
||||||
|
so you're required to do some serious coding if you enable this!
|
||||||
|
|
||||||
|
Note the lwIP enterprise ID (26381) is assigned to the lwIP project,
|
||||||
|
ALL OBJECT IDENTIFIERS LIVING UNDER THIS ID ARE ASSIGNED BY THE lwIP
|
||||||
|
MAINTAINERS!
|
||||||
|
|
||||||
|
If you need to create your own private MIB you'll need
|
||||||
|
to apply for your own enterprise ID with IANA: http://www.iana.org/numbers.html
|
||||||
|
|
||||||
|
You can set it by passing a struct snmp_obj_id to the agent
|
||||||
|
using snmp_set_sysobjid(&my_object_id), just before snmp_init().
|
||||||
|
|
||||||
|
Note the object identifiers for thes MIB-2 and your private MIB
|
||||||
|
tree must be kept in sorted ascending (lexicographical) order.
|
||||||
|
This to ensure correct getnext operation.
|
||||||
|
|
||||||
|
An example for a private MIB is part of the "minimal Unix" project:
|
||||||
|
contrib/ports/unix/proj/minimal/lwip_prvmib.c
|
||||||
|
|
||||||
|
The next chapter gives a more detailed description of the
|
||||||
|
MIB-2 tree and the optional private MIB.
|
||||||
|
|
||||||
|
4 The Gory Details
|
||||||
|
==================
|
||||||
|
|
||||||
|
4.0 Object identifiers and the MIB tree.
|
||||||
|
|
||||||
|
We have three distinct parts for all object identifiers:
|
||||||
|
|
||||||
|
The prefix
|
||||||
|
.iso.org.dod.internet
|
||||||
|
|
||||||
|
the middle part
|
||||||
|
.mgmt.mib-2.ip.ipNetToMediaTable.ipNetToMediaEntry.ipNetToMediaPhysAddress
|
||||||
|
|
||||||
|
and the index part
|
||||||
|
.1.192.168.0.1
|
||||||
|
|
||||||
|
Objects located above the .internet hierarchy aren't supported.
|
||||||
|
Currently only the .mgmt sub-tree is available and
|
||||||
|
when the SNMP_PRIVATE_MIB is enabled the .private tree
|
||||||
|
becomes available too.
|
||||||
|
|
||||||
|
Object identifiers from incoming requests are checked
|
||||||
|
for a matching prefix, middle part and index part
|
||||||
|
or are expanded(*) for GetNext requests with short
|
||||||
|
or inexisting names in the request.
|
||||||
|
(* we call this "expansion" but this also
|
||||||
|
resembles the "auto-completion" operation)
|
||||||
|
|
||||||
|
The middle part is usually located in ROM (const)
|
||||||
|
to preserve precious RAM on small microcontrollers.
|
||||||
|
However RAM location is possible for an dynamically
|
||||||
|
changing private tree.
|
||||||
|
|
||||||
|
The index part is handled by functions which in
|
||||||
|
turn use dynamically allocated index trees from RAM.
|
||||||
|
These trees are updated by e.g. the etharp code
|
||||||
|
when new entries are made or removed form the ARP cache.
|
||||||
|
|
||||||
|
/** @todo more gory details */
|
||||||
157
doc/sys_arch.txt
157
doc/sys_arch.txt
@@ -1,4 +1,4 @@
|
|||||||
sys_arch interface for lwIP 0.5
|
sys_arch interface for lwIP 0.6++
|
||||||
|
|
||||||
Author: Adam Dunkels
|
Author: Adam Dunkels
|
||||||
|
|
||||||
@@ -16,6 +16,11 @@ functionality. Previous versions of lwIP required the sys_arch to
|
|||||||
implement timer scheduling as well but as of lwIP 0.5 this is
|
implement timer scheduling as well but as of lwIP 0.5 this is
|
||||||
implemented in a higher layer.
|
implemented in a higher layer.
|
||||||
|
|
||||||
|
In addition to the source file providing the functionality of sys_arch,
|
||||||
|
the OS emulation layer must provide several header files defining
|
||||||
|
macros used throughout lwip. The files required and the macros they
|
||||||
|
must define are listed below the sys_arch description.
|
||||||
|
|
||||||
Semaphores can be either counting or binary - lwIP works with both
|
Semaphores can be either counting or binary - lwIP works with both
|
||||||
kinds. Mailboxes are used for message passing and can be implemented
|
kinds. Mailboxes are used for message passing and can be implemented
|
||||||
either as a queue which allows multiple messages to be posted to a
|
either as a queue which allows multiple messages to be posted to a
|
||||||
@@ -42,35 +47,35 @@ The following functions must be implemented by the sys_arch:
|
|||||||
|
|
||||||
- void sys_sem_free(sys_sem_t sem)
|
- void sys_sem_free(sys_sem_t sem)
|
||||||
|
|
||||||
Deallocates a semaphore.
|
Deallocates a semaphore.
|
||||||
|
|
||||||
- void sys_sem_signal(sys_sem_t sem)
|
- void sys_sem_signal(sys_sem_t sem)
|
||||||
|
|
||||||
Signals a semaphore.
|
Signals a semaphore.
|
||||||
|
|
||||||
- u16_t sys_arch_sem_wait(sys_sem_t sem, u16_t timeout)
|
- u32_t sys_arch_sem_wait(sys_sem_t sem, u32_t timeout)
|
||||||
|
|
||||||
Blocks the thread while waiting for the semaphore to be
|
Blocks the thread while waiting for the semaphore to be
|
||||||
signaled. If the "timeout" argument is non-zero, the thread should
|
signaled. If the "timeout" argument is non-zero, the thread should
|
||||||
only be blocked for the specified time (measured in
|
only be blocked for the specified time (measured in
|
||||||
milliseconds).
|
milliseconds). If the "timeout" argument is zero, the thread should be
|
||||||
|
blocked until the semaphore is signalled.
|
||||||
|
|
||||||
If the timeout argument is non-zero, the return value is the amount
|
If the timeout argument is non-zero, the return value is the number of
|
||||||
of time spent waiting for the semaphore to be signaled. If the
|
milliseconds spent waiting for the semaphore to be signaled. If the
|
||||||
semaphore wasn't signaled within the specified time, the return
|
semaphore wasn't signaled within the specified time, the return value is
|
||||||
value is zero. If the thread didn't have to wait for the semaphore
|
SYS_ARCH_TIMEOUT. If the thread didn't have to wait for the semaphore
|
||||||
(i.e., it was already signaled), care must be taken to ensure that
|
(i.e., it was already signaled), the function may return zero.
|
||||||
the function does not return a zero value since this is used to
|
|
||||||
indicate that a timeout occured. A suitable way to implement this is
|
|
||||||
to check if the time spent waiting is zero and if so, the value 1 is
|
|
||||||
returned.
|
|
||||||
|
|
||||||
Notice that lwIP implements a function with a similar name,
|
Notice that lwIP implements a function with a similar name,
|
||||||
sys_sem_wait(), that uses the sys_arch_sem_wait() function.
|
sys_sem_wait(), that uses the sys_arch_sem_wait() function.
|
||||||
|
|
||||||
- sys_mbox_t sys_mbox_new(void)
|
- sys_mbox_t sys_mbox_new(int size)
|
||||||
|
|
||||||
Creates an empty mailbox.
|
Creates an empty mailbox for maximum "size" elements. Elements stored
|
||||||
|
in mailboxes are pointers. You have to define macros "_MBOX_SIZE"
|
||||||
|
in your lwipopts.h, or ignore this parameter in your implementation
|
||||||
|
and use a default size.
|
||||||
|
|
||||||
- void sys_mbox_free(sys_mbox_t mbox)
|
- void sys_mbox_free(sys_mbox_t mbox)
|
||||||
|
|
||||||
@@ -80,24 +85,43 @@ The following functions must be implemented by the sys_arch:
|
|||||||
|
|
||||||
- void sys_mbox_post(sys_mbox_t mbox, void *msg)
|
- void sys_mbox_post(sys_mbox_t mbox, void *msg)
|
||||||
|
|
||||||
Posts the "msg" to the mailbox.
|
Posts the "msg" to the mailbox. This function have to block until
|
||||||
|
the "msg" is really posted.
|
||||||
|
|
||||||
- u16_t sys_arch_mbox_fetch(sys_mbox_t mbox, void **msg, u16_t timeout)
|
- err_t sys_mbox_trypost(sys_mbox_t mbox, void *msg)
|
||||||
|
|
||||||
|
Try to post the "msg" to the mailbox. Returns ERR_MEM if this one
|
||||||
|
is full, else, ERR_OK if the "msg" is posted.
|
||||||
|
|
||||||
|
- u32_t sys_arch_mbox_fetch(sys_mbox_t mbox, void **msg, u32_t timeout)
|
||||||
|
|
||||||
Blocks the thread until a message arrives in the mailbox, but does
|
Blocks the thread until a message arrives in the mailbox, but does
|
||||||
not block the thread longer than "timeout" milliseconds (similar to
|
not block the thread longer than "timeout" milliseconds (similar to
|
||||||
the sys_arch_sem_wait() function). The "msg" argument is a result
|
the sys_arch_sem_wait() function). If "timeout" is 0, the thread should
|
||||||
|
be blocked until a message arrives. The "msg" argument is a result
|
||||||
parameter that is set by the function (i.e., by doing "*msg =
|
parameter that is set by the function (i.e., by doing "*msg =
|
||||||
ptr"). The "msg" parameter maybe NULL to indicate that the message
|
ptr"). The "msg" parameter maybe NULL to indicate that the message
|
||||||
should be dropped.
|
should be dropped.
|
||||||
|
|
||||||
The return values are the same as for the sys_arch_sem_wait()
|
The return values are the same as for the sys_arch_sem_wait() function:
|
||||||
function and the function must not return zero even if a message was
|
Number of milliseconds spent waiting or SYS_ARCH_TIMEOUT if there was a
|
||||||
present in the mailbox and the time spent waiting was zero
|
timeout.
|
||||||
milliseconds.
|
|
||||||
|
|
||||||
Note that a function with a similar name, sys_mbox_fetch(), is
|
Note that a function with a similar name, sys_mbox_fetch(), is
|
||||||
implemented by lwIP.
|
implemented by lwIP.
|
||||||
|
|
||||||
|
- u32_t sys_arch_mbox_tryfetch(sys_mbox_t mbox, void **msg)
|
||||||
|
|
||||||
|
This is similar to sys_arch_mbox_fetch, however if a message is not
|
||||||
|
present in the mailbox, it immediately returns with the code
|
||||||
|
SYS_MBOX_EMPTY. On success 0 is returned.
|
||||||
|
|
||||||
|
To allow for efficient implementations, this can be defined as a
|
||||||
|
function-like macro in sys_arch.h instead of a normal function. For
|
||||||
|
example, a naive implementation could be:
|
||||||
|
#define sys_arch_mbox_tryfetch(mbox,msg) \
|
||||||
|
sys_arch_mbox_fetch(mbox,msg,1)
|
||||||
|
although this would introduce unnecessary delays.
|
||||||
|
|
||||||
- struct sys_timeouts *sys_arch_timeouts(void)
|
- struct sys_timeouts *sys_arch_timeouts(void)
|
||||||
|
|
||||||
@@ -107,7 +131,7 @@ The following functions must be implemented by the sys_arch:
|
|||||||
pointer to a linked list of timeouts. This function is called by
|
pointer to a linked list of timeouts. This function is called by
|
||||||
the lwIP timeout scheduler and must not return a NULL value.
|
the lwIP timeout scheduler and must not return a NULL value.
|
||||||
|
|
||||||
In a single threadd sys_arch implementation, this function will
|
In a single thread sys_arch implementation, this function will
|
||||||
simply return a pointer to a global sys_timeouts variable stored in
|
simply return a pointer to a global sys_timeouts variable stored in
|
||||||
the sys_arch module.
|
the sys_arch module.
|
||||||
|
|
||||||
@@ -115,9 +139,88 @@ If threads are supported by the underlying operating system and if
|
|||||||
such functionality is needed in lwIP, the following function will have
|
such functionality is needed in lwIP, the following function will have
|
||||||
to be implemented as well:
|
to be implemented as well:
|
||||||
|
|
||||||
- void sys_thread_new(void (* thread)(void *arg), void *arg)
|
- sys_thread_t sys_thread_new(char *name, void (* thread)(void *arg), void *arg, int stacksize, int prio)
|
||||||
|
|
||||||
Starts a new thread that will begin its execution in the function
|
Starts a new thread named "name" with priority "prio" that will begin its
|
||||||
"thread()". The "arg" argument will be passed as an argument to the
|
execution in the function "thread()". The "arg" argument will be passed as an
|
||||||
thread() function.
|
argument to the thread() function. The stack size to used for this thread is
|
||||||
|
the "stacksize" parameter. The id of the new thread is returned. Both the id
|
||||||
|
and the priority are system dependent.
|
||||||
|
|
||||||
|
- sys_prot_t sys_arch_protect(void)
|
||||||
|
|
||||||
|
This optional function does a "fast" critical region protection and returns
|
||||||
|
the previous protection level. This function is only called during very short
|
||||||
|
critical regions. An embedded system which supports ISR-based drivers might
|
||||||
|
want to implement this function by disabling interrupts. Task-based systems
|
||||||
|
might want to implement this by using a mutex or disabling tasking. This
|
||||||
|
function should support recursive calls from the same task or interrupt. In
|
||||||
|
other words, sys_arch_protect() could be called while already protected. In
|
||||||
|
that case the return value indicates that it is already protected.
|
||||||
|
|
||||||
|
sys_arch_protect() is only required if your port is supporting an operating
|
||||||
|
system.
|
||||||
|
|
||||||
|
- void sys_arch_unprotect(sys_prot_t pval)
|
||||||
|
|
||||||
|
This optional function does a "fast" set of critical region protection to the
|
||||||
|
value specified by pval. See the documentation for sys_arch_protect() for
|
||||||
|
more information. This function is only required if your port is supporting
|
||||||
|
an operating system.
|
||||||
|
|
||||||
|
Note:
|
||||||
|
|
||||||
|
Be carefull with using mem_malloc() in sys_arch. When malloc() refers to
|
||||||
|
mem_malloc() you can run into a circular function call problem. In mem.c
|
||||||
|
mem_init() tries to allcate a semaphore using mem_malloc, which of course
|
||||||
|
can't be performed when sys_arch uses mem_malloc.
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
Additional files required for the "OS support" emulation layer:
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
cc.h - Architecture environment, some compiler specific, some
|
||||||
|
environment specific (probably should move env stuff
|
||||||
|
to sys_arch.h.)
|
||||||
|
|
||||||
|
Typedefs for the types used by lwip -
|
||||||
|
u8_t, s8_t, u16_t, s16_t, u32_t, s32_t, mem_ptr_t
|
||||||
|
|
||||||
|
Compiler hints for packing lwip's structures -
|
||||||
|
PACK_STRUCT_FIELD(x)
|
||||||
|
PACK_STRUCT_STRUCT
|
||||||
|
PACK_STRUCT_BEGIN
|
||||||
|
PACK_STRUCT_END
|
||||||
|
|
||||||
|
Platform specific diagnostic output -
|
||||||
|
LWIP_PLATFORM_DIAG(x) - non-fatal, print a message.
|
||||||
|
LWIP_PLATFORM_ASSERT(x) - fatal, print message and abandon execution.
|
||||||
|
|
||||||
|
"lightweight" synchronization mechanisms -
|
||||||
|
SYS_ARCH_DECL_PROTECT(x) - declare a protection state variable.
|
||||||
|
SYS_ARCH_PROTECT(x) - enter protection mode.
|
||||||
|
SYS_ARCH_UNPROTECT(x) - leave protection mode.
|
||||||
|
|
||||||
|
If the compiler does not provide memset() this file must include a
|
||||||
|
definition of it, or include a file which defines it.
|
||||||
|
|
||||||
|
This file must either include a system-local <errno.h> which defines
|
||||||
|
the standard *nix error codes, or it should #define LWIP_PROVIDE_ERRNO
|
||||||
|
to make lwip/arch.h define the codes which are used throughout.
|
||||||
|
|
||||||
|
|
||||||
|
perf.h - Architecture specific performance measurement.
|
||||||
|
Measurement calls made throughout lwip, these can be defined to nothing.
|
||||||
|
PERF_START - start measuring something.
|
||||||
|
PERF_STOP(x) - stop measuring something, and record the result.
|
||||||
|
|
||||||
|
sys_arch.h - Tied to sys_arch.c
|
||||||
|
|
||||||
|
Arch dependent types for the following objects:
|
||||||
|
sys_sem_t, sys_mbox_t, sys_thread_t,
|
||||||
|
And, optionally:
|
||||||
|
sys_prot_t
|
||||||
|
|
||||||
|
Defines to set vars of sys_mbox_t and sys_sem_t to NULL.
|
||||||
|
SYS_MBOX_NULL NULL
|
||||||
|
SYS_SEM_NULL NULL
|
||||||
|
|||||||
@@ -1,91 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright (c) 2001, 2002 Swedish Institute of Computer Science.
|
|
||||||
# All rights reserved.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
# are permitted provided that the following conditions are met:
|
|
||||||
#
|
|
||||||
# 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
# this list of conditions and the following disclaimer.
|
|
||||||
# 2. 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.
|
|
||||||
# 3. The name of the author may not be used to endorse or promote products
|
|
||||||
# derived from this software without specific prior written permission.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
#
|
|
||||||
# This file is part of the lwIP TCP/IP stack.
|
|
||||||
#
|
|
||||||
# Author: Adam Dunkels <adam@sics.se>
|
|
||||||
#
|
|
||||||
|
|
||||||
CCDEP=gcc
|
|
||||||
CC=gcc
|
|
||||||
CFLAGS=-g -Wall -DIPv4 -Os -fpack-struct
|
|
||||||
LWIPARCH=unix
|
|
||||||
ARFLAGS=rs
|
|
||||||
LWIPDIR=../../src
|
|
||||||
|
|
||||||
CFLAGS:=$(CFLAGS) \
|
|
||||||
-I$(LWIPDIR)/include -I$(LWIPDIR)/arch/$(LWIPARCH)/include -I$(LWIPDIR)/include/ipv4 \
|
|
||||||
-Iapps -I.
|
|
||||||
|
|
||||||
# COREFILES, CORE4FILES: The minimum set of files needed for lwIP.
|
|
||||||
COREFILES=$(LWIPDIR)/core/mem.c $(LWIPDIR)/core/memp.c $(LWIPDIR)/core/netif.c \
|
|
||||||
$(LWIPDIR)/core/pbuf.c $(LWIPDIR)/core/stats.c $(LWIPDIR)/core/sys.c \
|
|
||||||
$(LWIPDIR)/core/tcp.c $(LWIPDIR)/core/tcp_in.c \
|
|
||||||
$(LWIPDIR)/core/tcp_out.c $(LWIPDIR)/core/udp.c
|
|
||||||
CORE4FILES=$(LWIPDIR)/core/ipv4/icmp.c $(LWIPDIR)/core/ipv4/ip.c \
|
|
||||||
$(LWIPDIR)/core/inet.c $(LWIPDIR)/core/ipv4/ip_addr.c
|
|
||||||
|
|
||||||
# NETIFFILES: Files implementing various generic network interface functions.'
|
|
||||||
NETIFFILES=$(LWIPDIR)/netif/etharp.c mintapif.c
|
|
||||||
|
|
||||||
# LWIPFILES: All the above.
|
|
||||||
LWIPFILES=$(COREFILES) $(CORE4FILES) $(NETIFFILES)
|
|
||||||
LWIPFILESW=$(wildcard $(LWIPFILES))
|
|
||||||
LWIPOBJS=$(notdir $(LWIPFILESW:.c=.o))
|
|
||||||
|
|
||||||
# APPFILES
|
|
||||||
APPFILES=echo.c
|
|
||||||
|
|
||||||
LWIPLIB=liblwip4.a
|
|
||||||
APPLIB=liblwipapps.a
|
|
||||||
APPOBJS=$(notdir $(APPFILES:.c=.o))
|
|
||||||
|
|
||||||
%.o:
|
|
||||||
$(CC) $(CFLAGS) -c $(<:.o=.c)
|
|
||||||
|
|
||||||
all ipv4 compile: minimal
|
|
||||||
.PHONY: all
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f *.o $(LWIPLIB) $(APPLIB) minimal .depend* *.core core
|
|
||||||
|
|
||||||
depend dep: .depend
|
|
||||||
|
|
||||||
include .depend
|
|
||||||
|
|
||||||
$(APPLIB): $(APPOBJS)
|
|
||||||
$(AR) $(ARFLAGS) $(APPLIB) $?
|
|
||||||
|
|
||||||
$(LWIPLIB): $(LWIPOBJS)
|
|
||||||
$(AR) $(ARFLAGS) $(LWIPLIB) $?
|
|
||||||
|
|
||||||
.depend: main.c $(LWIPFILES) $(APPFILES)
|
|
||||||
$(CCDEP) $(CFLAGS) -MM $^ > .depend || rm -f .depend
|
|
||||||
|
|
||||||
minimal: .depend $(LWIPLIB) $(APPLIB) main.o $(APPFILES)
|
|
||||||
$(CC) $(CFLAGS) $(LDFLAGS) -o minimal main.o $(APPLIB) $(LWIPLIB)
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
This is an example of a very minimal lwIP project. It runs in a single
|
|
||||||
thread and runs a single example application - an echo server. The
|
|
||||||
echo application is implemented using the raw API.
|
|
||||||
@@ -1,220 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "lwip/debug.h"
|
|
||||||
#include "lwip/stats.h"
|
|
||||||
#include "lwip/tcp.h"
|
|
||||||
|
|
||||||
struct echo_state {
|
|
||||||
struct pbuf *p;
|
|
||||||
u8_t failed;
|
|
||||||
#define FAILED_MAX 8
|
|
||||||
};
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static void
|
|
||||||
echo_err(void *arg, err_t err)
|
|
||||||
{
|
|
||||||
struct echo_state *es = arg;
|
|
||||||
|
|
||||||
if(arg != NULL) {
|
|
||||||
pbuf_free(es->p);
|
|
||||||
mem_free(arg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static void
|
|
||||||
close_conn(struct tcp_pcb *pcb, struct echo_state *es)
|
|
||||||
{
|
|
||||||
tcp_arg(pcb, NULL);
|
|
||||||
#if 0
|
|
||||||
tcp_sent(pcb, NULL);
|
|
||||||
tcp_recv(pcb, NULL);
|
|
||||||
#endif /* 0 */
|
|
||||||
if(es != NULL) {
|
|
||||||
pbuf_free(es->p);
|
|
||||||
mem_free(es);
|
|
||||||
}
|
|
||||||
tcp_close(pcb);
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static void
|
|
||||||
send_buf(struct tcp_pcb *pcb, struct echo_state *es)
|
|
||||||
{
|
|
||||||
struct pbuf *q;
|
|
||||||
|
|
||||||
do {
|
|
||||||
q = es->p;
|
|
||||||
es->p = pbuf_dechain(q);
|
|
||||||
if(tcp_write(pcb, q->payload, q->len, 1) == ERR_MEM) {
|
|
||||||
pbuf_chain(q, es->p);
|
|
||||||
es->p = q;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
tcp_recved(pcb, q->len);
|
|
||||||
pbuf_free(q);
|
|
||||||
} while(es->p != NULL);
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static err_t
|
|
||||||
echo_poll(void *arg, struct tcp_pcb *pcb)
|
|
||||||
{
|
|
||||||
struct echo_state *es;
|
|
||||||
|
|
||||||
if(arg == NULL) {
|
|
||||||
return tcp_close(pcb);
|
|
||||||
}
|
|
||||||
|
|
||||||
es = arg;
|
|
||||||
|
|
||||||
if(es->failed >= FAILED_MAX) {
|
|
||||||
close_conn(pcb, es);
|
|
||||||
tcp_abort(pcb);
|
|
||||||
return ERR_ABRT;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(es->p != NULL) {
|
|
||||||
++es->failed;
|
|
||||||
send_buf(pcb, es);
|
|
||||||
}
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static err_t
|
|
||||||
echo_sent(void *arg, struct tcp_pcb *pcb, u16_t len)
|
|
||||||
{
|
|
||||||
struct echo_state *es;
|
|
||||||
|
|
||||||
es = arg;
|
|
||||||
|
|
||||||
if(es != NULL && es->p != NULL) {
|
|
||||||
send_buf(pcb, es);
|
|
||||||
}
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static err_t
|
|
||||||
echo_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
|
|
||||||
{
|
|
||||||
struct echo_state *es;
|
|
||||||
|
|
||||||
es = arg;
|
|
||||||
|
|
||||||
if(p == NULL) {
|
|
||||||
close_conn(pcb, es);
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(es->p != NULL) {
|
|
||||||
pbuf_chain(es->p, p);
|
|
||||||
} else {
|
|
||||||
es->p = p;
|
|
||||||
}
|
|
||||||
|
|
||||||
send_buf(pcb, es);
|
|
||||||
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static err_t
|
|
||||||
echo_accept(void *arg, struct tcp_pcb *pcb, err_t err)
|
|
||||||
{
|
|
||||||
struct echo_state *es;
|
|
||||||
|
|
||||||
tcp_setprio(pcb, TCP_PRIO_MIN);
|
|
||||||
|
|
||||||
/* Allocate memory for the structure that holds the state of the
|
|
||||||
connection. */
|
|
||||||
es = mem_malloc(sizeof(struct echo_state));
|
|
||||||
|
|
||||||
if(es == NULL) {
|
|
||||||
return ERR_MEM;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Initialize the structure. */
|
|
||||||
es->p = NULL;
|
|
||||||
es->failed = 0;
|
|
||||||
|
|
||||||
/* Tell TCP that this is the structure we wish to be passed for our
|
|
||||||
callbacks. */
|
|
||||||
tcp_arg(pcb, es);
|
|
||||||
|
|
||||||
/* Tell TCP that we wish to be informed of incoming data by a call
|
|
||||||
to the http_recv() function. */
|
|
||||||
#if 0
|
|
||||||
tcp_recv(pcb, echo_recv);
|
|
||||||
|
|
||||||
tcp_err(pcb, echo_err);
|
|
||||||
#endif /* 0 */
|
|
||||||
|
|
||||||
tcp_poll(pcb, echo_poll, 2);
|
|
||||||
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
void
|
|
||||||
echo_init(void)
|
|
||||||
{
|
|
||||||
struct tcp_pcb *pcb;
|
|
||||||
|
|
||||||
pcb = tcp_new();
|
|
||||||
tcp_bind(pcb, IP_ADDR_ANY, 7);
|
|
||||||
pcb = tcp_listen(pcb);
|
|
||||||
#if 0
|
|
||||||
tcp_accept(pcb, echo_accept);
|
|
||||||
#endif /* 0 */
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
err_t
|
|
||||||
lwip_tcp_event(void *arg, struct tcp_pcb *pcb,
|
|
||||||
enum lwip_event ev, struct pbuf *p,
|
|
||||||
u16_t size, err_t err)
|
|
||||||
{
|
|
||||||
switch(ev) {
|
|
||||||
case LWIP_EVENT_ACCEPT:
|
|
||||||
return echo_accept(arg, pcb, err);
|
|
||||||
case LWIP_EVENT_SENT:
|
|
||||||
return echo_sent(arg, pcb, size);
|
|
||||||
case LWIP_EVENT_RECV:
|
|
||||||
return echo_recv(arg, pcb, p, err);
|
|
||||||
case LWIP_EVENT_ERR:
|
|
||||||
echo_err(arg, err);
|
|
||||||
break;
|
|
||||||
case LWIP_EVENT_POLL:
|
|
||||||
return echo_poll(arg, pcb);
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
@@ -1,169 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __LWIPOPTS_H__
|
|
||||||
#define __LWIPOPTS_H__
|
|
||||||
|
|
||||||
#define NO_SYS 1
|
|
||||||
#define LWIP_EVENT_API 1
|
|
||||||
|
|
||||||
/* ---------- Memory options ---------- */
|
|
||||||
/* MEM_ALIGNMENT: should be set to the alignment of the CPU for which
|
|
||||||
lwIP is compiled. 4 byte alignment -> define MEM_ALIGNMENT to 4, 2
|
|
||||||
byte alignment -> define MEM_ALIGNMENT to 2. */
|
|
||||||
#define MEM_ALIGNMENT 2
|
|
||||||
|
|
||||||
/* MEM_SIZE: the size of the heap memory. If the application will send
|
|
||||||
a lot of data that needs to be copied, this should be set high. */
|
|
||||||
#define MEM_SIZE 1000
|
|
||||||
|
|
||||||
/* MEMP_NUM_PBUF: the number of memp struct pbufs. If the application
|
|
||||||
sends a lot of data out of ROM (or other static memory), this
|
|
||||||
should be set high. */
|
|
||||||
#define MEMP_NUM_PBUF 8
|
|
||||||
/* MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One
|
|
||||||
per active UDP "connection". */
|
|
||||||
#define MEMP_NUM_UDP_PCB 4
|
|
||||||
/* MEMP_NUM_TCP_PCB: the number of simulatenously active TCP
|
|
||||||
connections. */
|
|
||||||
#define MEMP_NUM_TCP_PCB 2
|
|
||||||
/* MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP
|
|
||||||
connections. */
|
|
||||||
#define MEMP_NUM_TCP_PCB_LISTEN 8
|
|
||||||
/* MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP
|
|
||||||
segments. */
|
|
||||||
#define MEMP_NUM_TCP_SEG 8
|
|
||||||
|
|
||||||
/* The following four are used only with the sequential API and can be
|
|
||||||
set to 0 if the application only will use the raw API. */
|
|
||||||
/* MEMP_NUM_NETBUF: the number of struct netbufs. */
|
|
||||||
#define MEMP_NUM_NETBUF 0
|
|
||||||
/* MEMP_NUM_NETCONN: the number of struct netconns. */
|
|
||||||
#define MEMP_NUM_NETCONN 0
|
|
||||||
/* MEMP_NUM_APIMSG: the number of struct api_msg, used for
|
|
||||||
communication between the TCP/IP stack and the sequential
|
|
||||||
programs. */
|
|
||||||
#define MEMP_NUM_API_MSG 0
|
|
||||||
/* MEMP_NUM_TCPIPMSG: the number of struct tcpip_msg, which is used
|
|
||||||
for sequential API communication and incoming packets. Used in
|
|
||||||
src/api/tcpip.c. */
|
|
||||||
#define MEMP_NUM_TCPIP_MSG 0
|
|
||||||
/* MEMP_NUM_SYS_TIMEOUT: the number of simulateously active
|
|
||||||
timeouts. */
|
|
||||||
#define MEMP_NUM_SYS_TIMEOUT 0
|
|
||||||
|
|
||||||
/* ---------- Pbuf options ---------- */
|
|
||||||
/* PBUF_POOL_SIZE: the number of buffers in the pbuf pool. */
|
|
||||||
#define PBUF_POOL_SIZE 8
|
|
||||||
|
|
||||||
/* PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. */
|
|
||||||
#define PBUF_POOL_BUFSIZE 128
|
|
||||||
|
|
||||||
/* PBUF_LINK_HLEN: the number of bytes that should be allocated for a
|
|
||||||
link level header. */
|
|
||||||
#define PBUF_LINK_HLEN 16
|
|
||||||
|
|
||||||
/* ---------- TCP options ---------- */
|
|
||||||
#define LWIP_TCP 1
|
|
||||||
#define TCP_TTL 255
|
|
||||||
|
|
||||||
/* Controls if TCP should queue segments that arrive out of
|
|
||||||
order. Define to 0 if your device is low on memory. */
|
|
||||||
#define TCP_QUEUE_OOSEQ 0
|
|
||||||
|
|
||||||
/* TCP Maximum segment size. */
|
|
||||||
#define TCP_MSS 128
|
|
||||||
|
|
||||||
/* TCP sender buffer space (bytes). */
|
|
||||||
#define TCP_SND_BUF 256
|
|
||||||
|
|
||||||
/* TCP sender buffer space (pbufs). This must be at least = 2 *
|
|
||||||
TCP_SND_BUF/TCP_MSS for things to work. */
|
|
||||||
#define TCP_SND_QUEUELEN 4 * TCP_SND_BUF/TCP_MSS
|
|
||||||
|
|
||||||
/* TCP receive window. */
|
|
||||||
#define TCP_WND 512
|
|
||||||
|
|
||||||
/* Maximum number of retransmissions of data segments. */
|
|
||||||
#define TCP_MAXRTX 12
|
|
||||||
|
|
||||||
/* Maximum number of retransmissions of SYN segments. */
|
|
||||||
#define TCP_SYNMAXRTX 4
|
|
||||||
|
|
||||||
/* ---------- ARP options ---------- */
|
|
||||||
#define ARP_TABLE_SIZE 10
|
|
||||||
#define ARP_QUEUEING 0
|
|
||||||
|
|
||||||
/* ---------- IP options ---------- */
|
|
||||||
/* Define IP_FORWARD to 1 if you wish to have the ability to forward
|
|
||||||
IP packets across network interfaces. If you are going to run lwIP
|
|
||||||
on a device with only one network interface, define this to 0. */
|
|
||||||
#define IP_FORWARD 0
|
|
||||||
|
|
||||||
/* If defined to 1, IP options are allowed (but not parsed). If
|
|
||||||
defined to 0, all packets with IP options are dropped. */
|
|
||||||
#define IP_OPTIONS 1
|
|
||||||
|
|
||||||
/* ---------- ICMP options ---------- */
|
|
||||||
#define ICMP_TTL 255
|
|
||||||
|
|
||||||
|
|
||||||
/* ---------- DHCP options ---------- */
|
|
||||||
/* Define LWIP_DHCP to 1 if you want DHCP configuration of
|
|
||||||
interfaces. DHCP is not implemented in lwIP 0.5.1, however, so
|
|
||||||
turning this on does currently not work. */
|
|
||||||
#define LWIP_DHCP 0
|
|
||||||
|
|
||||||
/* 1 if you want to do an ARP check on the offered address
|
|
||||||
(recommended). */
|
|
||||||
#define DHCP_DOES_ARP_CHECK 1
|
|
||||||
|
|
||||||
/* ---------- UDP options ---------- */
|
|
||||||
#define LWIP_UDP 0
|
|
||||||
#define UDP_TTL 255
|
|
||||||
|
|
||||||
|
|
||||||
/* ---------- Statistics options ---------- */
|
|
||||||
/*#define STATS*/
|
|
||||||
|
|
||||||
#ifdef STATS
|
|
||||||
#define LINK_STATS
|
|
||||||
#define IP_STATS
|
|
||||||
#define ICMP_STATS
|
|
||||||
#define UDP_STATS
|
|
||||||
#define TCP_STATS
|
|
||||||
#define MEM_STATS
|
|
||||||
#define MEMP_STATS
|
|
||||||
#define PBUF_STATS
|
|
||||||
#define SYS_STATS
|
|
||||||
#endif /* STATS */
|
|
||||||
|
|
||||||
#endif /* __LWIPOPTS_H__ */
|
|
||||||
@@ -1,101 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "lwip/debug.h"
|
|
||||||
|
|
||||||
#include "lwip/mem.h"
|
|
||||||
#include "lwip/memp.h"
|
|
||||||
#include "lwip/sys.h"
|
|
||||||
|
|
||||||
#include "lwip/stats.h"
|
|
||||||
|
|
||||||
#include "lwip/ip.h"
|
|
||||||
#include "lwip/udp.h"
|
|
||||||
#include "lwip/tcp.h"
|
|
||||||
|
|
||||||
#include "mintapif.h"
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
int
|
|
||||||
main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
struct ip_addr ipaddr, netmask, gw;
|
|
||||||
struct netif *netif;
|
|
||||||
|
|
||||||
#ifdef PERF
|
|
||||||
perf_init("/tmp/minimal.perf");
|
|
||||||
#endif /* PERF */
|
|
||||||
#ifdef STATS
|
|
||||||
stats_init();
|
|
||||||
#endif /* STATS */
|
|
||||||
|
|
||||||
mem_init();
|
|
||||||
memp_init();
|
|
||||||
pbuf_init();
|
|
||||||
netif_init();
|
|
||||||
ip_init();
|
|
||||||
udp_init();
|
|
||||||
tcp_init();
|
|
||||||
printf("TCP/IP initialized.\n");
|
|
||||||
|
|
||||||
IP4_ADDR(&gw, 192,168,0,1);
|
|
||||||
IP4_ADDR(&ipaddr, 192,168,0,2);
|
|
||||||
IP4_ADDR(&netmask, 255,255,255,0);
|
|
||||||
|
|
||||||
netif = netif_add(&ipaddr, &netmask, &gw, mintapif_init, ip_input);
|
|
||||||
|
|
||||||
netif_set_default(netif);
|
|
||||||
|
|
||||||
echo_init();
|
|
||||||
|
|
||||||
printf("Applications started.\n");
|
|
||||||
|
|
||||||
|
|
||||||
while(1) {
|
|
||||||
|
|
||||||
if(mintapif_wait(netif, 100) == MINTAPIF_TIMEOUT) {
|
|
||||||
tcp_tmr();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,354 +0,0 @@
|
|||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/ioctl.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
#include <sys/uio.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
|
|
||||||
#ifdef linux
|
|
||||||
#include <sys/ioctl.h>
|
|
||||||
#include <linux/if.h>
|
|
||||||
#include <linux/if_tun.h>
|
|
||||||
#define DEVTAP "/dev/net/tun"
|
|
||||||
#else /* linux */
|
|
||||||
#define DEVTAP "/dev/tap0"
|
|
||||||
#endif /* linux */
|
|
||||||
|
|
||||||
#include "lwip/stats.h"
|
|
||||||
#include "lwip/mem.h"
|
|
||||||
#include "netif/etharp.h"
|
|
||||||
|
|
||||||
#include "mintapif.h"
|
|
||||||
|
|
||||||
/* Define those to better describe your network interface. */
|
|
||||||
#define IFNAME0 'e'
|
|
||||||
#define IFNAME1 't'
|
|
||||||
|
|
||||||
struct mintapif {
|
|
||||||
struct eth_addr *ethaddr;
|
|
||||||
/* Add whatever per-interface state that is needed here. */
|
|
||||||
u32_t lasttime;
|
|
||||||
int fd;
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct eth_addr ethbroadcast = {{0xff,0xff,0xff,0xff,0xff,0xff}};
|
|
||||||
|
|
||||||
/* Forward declarations. */
|
|
||||||
static void mintapif_input(struct netif *netif);
|
|
||||||
static err_t mintapif_output(struct netif *netif, struct pbuf *p,
|
|
||||||
struct ip_addr *ipaddr);
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static void
|
|
||||||
low_level_init(struct netif *netif)
|
|
||||||
{
|
|
||||||
struct mintapif *mintapif;
|
|
||||||
char buf[1024];
|
|
||||||
|
|
||||||
mintapif = netif->state;
|
|
||||||
|
|
||||||
/* Obtain MAC address from network interface. */
|
|
||||||
mintapif->ethaddr->addr[0] = 1;
|
|
||||||
mintapif->ethaddr->addr[1] = 2;
|
|
||||||
mintapif->ethaddr->addr[2] = 3;
|
|
||||||
mintapif->ethaddr->addr[3] = 4;
|
|
||||||
mintapif->ethaddr->addr[4] = 5;
|
|
||||||
mintapif->ethaddr->addr[5] = 6;
|
|
||||||
|
|
||||||
/* Do whatever else is needed to initialize interface. */
|
|
||||||
|
|
||||||
mintapif->fd = open(DEVTAP, O_RDWR);
|
|
||||||
if(mintapif->fd == -1) {
|
|
||||||
perror("tapif: tapif_init: open");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef linux
|
|
||||||
{
|
|
||||||
struct ifreq ifr;
|
|
||||||
memset(&ifr, 0, sizeof(ifr));
|
|
||||||
ifr.ifr_flags = IFF_TAP|IFF_NO_PI;
|
|
||||||
if (ioctl(mintapif->fd, TUNSETIFF, (void *) &ifr) < 0) {
|
|
||||||
perror(buf);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* Linux */
|
|
||||||
|
|
||||||
snprintf(buf, sizeof(buf), "ifconfig tap0 inet %d.%d.%d.%d",
|
|
||||||
ip4_addr1(&(netif->gw)),
|
|
||||||
ip4_addr2(&(netif->gw)),
|
|
||||||
ip4_addr3(&(netif->gw)),
|
|
||||||
ip4_addr4(&(netif->gw)));
|
|
||||||
|
|
||||||
system(buf);
|
|
||||||
|
|
||||||
mintapif->lasttime = 0;
|
|
||||||
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
/*
|
|
||||||
* low_level_output():
|
|
||||||
*
|
|
||||||
* Should do the actual transmission of the packet. The packet is
|
|
||||||
* contained in the pbuf that is passed to the function. This pbuf
|
|
||||||
* might be chained.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
static err_t
|
|
||||||
low_level_output(struct netif *netif, struct pbuf *p)
|
|
||||||
{
|
|
||||||
struct mintapif *mintapif;
|
|
||||||
struct pbuf *q;
|
|
||||||
char buf[1500];
|
|
||||||
char *bufptr;
|
|
||||||
|
|
||||||
mintapif = netif->state;
|
|
||||||
|
|
||||||
/* initiate transfer(); */
|
|
||||||
|
|
||||||
bufptr = &buf[0];
|
|
||||||
|
|
||||||
for(q = p; q != NULL; q = q->next) {
|
|
||||||
/* Send the data from the pbuf to the interface, one pbuf at a
|
|
||||||
time. The size of the data in each pbuf is kept in the ->len
|
|
||||||
variable. */
|
|
||||||
/* send data from(q->payload, q->len); */
|
|
||||||
memcpy(bufptr, q->payload, q->len);
|
|
||||||
bufptr += q->len;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* signal that packet should be sent(); */
|
|
||||||
if(write(mintapif->fd, buf, p->tot_len) == -1) {
|
|
||||||
perror("tapif: write");
|
|
||||||
}
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
/*
|
|
||||||
* low_level_input():
|
|
||||||
*
|
|
||||||
* Should allocate a pbuf and transfer the bytes of the incoming
|
|
||||||
* packet from the interface into the pbuf.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static struct pbuf *
|
|
||||||
low_level_input(struct mintapif *mintapif)
|
|
||||||
{
|
|
||||||
struct pbuf *p, *q;
|
|
||||||
u16_t len;
|
|
||||||
char buf[1500];
|
|
||||||
char *bufptr;
|
|
||||||
|
|
||||||
/* Obtain the size of the packet and put it into the "len"
|
|
||||||
variable. */
|
|
||||||
len = read(mintapif->fd, buf, sizeof(buf));
|
|
||||||
|
|
||||||
/* if(((double)rand()/(double)RAND_MAX) < 0.1) {
|
|
||||||
printf("drop\n");
|
|
||||||
return NULL;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
|
|
||||||
/* We allocate a pbuf chain of pbufs from the pool. */
|
|
||||||
p = pbuf_alloc(PBUF_LINK, len, PBUF_POOL);
|
|
||||||
|
|
||||||
if(p != NULL) {
|
|
||||||
/* We iterate over the pbuf chain until we have read the entire
|
|
||||||
packet into the pbuf. */
|
|
||||||
bufptr = &buf[0];
|
|
||||||
for(q = p; q != NULL; q = q->next) {
|
|
||||||
/* Read enough bytes to fill this pbuf in the chain. The
|
|
||||||
avaliable data in the pbuf is given by the q->len
|
|
||||||
variable. */
|
|
||||||
/* read data into(q->payload, q->len); */
|
|
||||||
memcpy(q->payload, bufptr, q->len);
|
|
||||||
bufptr += q->len;
|
|
||||||
}
|
|
||||||
/* acknowledge that packet has been read(); */
|
|
||||||
} else {
|
|
||||||
/* drop packet(); */
|
|
||||||
printf("Could not allocate pbufs\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
/*
|
|
||||||
* mintapif_output():
|
|
||||||
*
|
|
||||||
* This function is called by the TCP/IP stack when an IP packet
|
|
||||||
* should be sent. It calls the function called low_level_output() to
|
|
||||||
* do the actuall transmission of the packet.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static err_t
|
|
||||||
mintapif_output(struct netif *netif, struct pbuf *p,
|
|
||||||
struct ip_addr *ipaddr)
|
|
||||||
{
|
|
||||||
p = etharp_output(netif, ipaddr, p);
|
|
||||||
if(p != NULL) {
|
|
||||||
return low_level_output(netif, p);
|
|
||||||
}
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
/*
|
|
||||||
* mintapif_input():
|
|
||||||
*
|
|
||||||
* This function should be called when a packet is ready to be read
|
|
||||||
* from the interface. It uses the function low_level_input() that
|
|
||||||
* should handle the actual reception of bytes from the network
|
|
||||||
* interface.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static void
|
|
||||||
mintapif_input(struct netif *netif)
|
|
||||||
{
|
|
||||||
struct mintapif *mintapif;
|
|
||||||
struct eth_hdr *ethhdr;
|
|
||||||
struct pbuf *p, *q;
|
|
||||||
|
|
||||||
|
|
||||||
mintapif = netif->state;
|
|
||||||
|
|
||||||
p = low_level_input(mintapif);
|
|
||||||
|
|
||||||
if(p != NULL) {
|
|
||||||
|
|
||||||
#ifdef LINK_STATS
|
|
||||||
lwip_stats.link.recv++;
|
|
||||||
#endif /* LINK_STATS */
|
|
||||||
|
|
||||||
ethhdr = p->payload;
|
|
||||||
|
|
||||||
q = NULL;
|
|
||||||
switch(htons(ethhdr->type)) {
|
|
||||||
case ETHTYPE_IP:
|
|
||||||
q = etharp_ip_input(netif, p);
|
|
||||||
pbuf_header(p, -14);
|
|
||||||
netif->input(p, netif);
|
|
||||||
break;
|
|
||||||
case ETHTYPE_ARP:
|
|
||||||
q = etharp_arp_input(netif, mintapif->ethaddr, p);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
pbuf_free(p);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if(q != NULL) {
|
|
||||||
low_level_output(netif, q);
|
|
||||||
pbuf_free(q);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
/*
|
|
||||||
* mintapif_init():
|
|
||||||
*
|
|
||||||
* Should be called at the beginning of the program to set up the
|
|
||||||
* network interface. It calls the function low_level_init() to do the
|
|
||||||
* actual setup of the hardware.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
void
|
|
||||||
mintapif_init(struct netif *netif)
|
|
||||||
{
|
|
||||||
struct mintapif *mintapif;
|
|
||||||
|
|
||||||
mintapif = mem_malloc(sizeof(struct mintapif));
|
|
||||||
netif->state = mintapif;
|
|
||||||
netif->name[0] = IFNAME0;
|
|
||||||
netif->name[1] = IFNAME1;
|
|
||||||
netif->output = mintapif_output;
|
|
||||||
netif->linkoutput = low_level_output;
|
|
||||||
|
|
||||||
mintapif->ethaddr = (struct eth_addr *)&(netif->hwaddr[0]);
|
|
||||||
|
|
||||||
low_level_init(netif);
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
enum mintapif_signal
|
|
||||||
mintapif_wait(struct netif *netif, u16_t time)
|
|
||||||
{
|
|
||||||
fd_set fdset;
|
|
||||||
struct timeval tv, now;
|
|
||||||
struct timezone tz;
|
|
||||||
int ret;
|
|
||||||
struct mintapif *mintapif;
|
|
||||||
|
|
||||||
mintapif = netif->state;
|
|
||||||
|
|
||||||
while(1) {
|
|
||||||
|
|
||||||
if(mintapif->lasttime >= (u32_t)time * 1000) {
|
|
||||||
mintapif->lasttime = 0;
|
|
||||||
return MINTAPIF_TIMEOUT;
|
|
||||||
}
|
|
||||||
|
|
||||||
tv.tv_sec = 0;
|
|
||||||
tv.tv_usec = (u32_t)time * 1000 - mintapif->lasttime;
|
|
||||||
|
|
||||||
|
|
||||||
FD_ZERO(&fdset);
|
|
||||||
FD_SET(mintapif->fd, &fdset);
|
|
||||||
|
|
||||||
gettimeofday(&now, &tz);
|
|
||||||
ret = select(mintapif->fd + 1, &fdset, NULL, NULL, &tv);
|
|
||||||
if(ret == 0) {
|
|
||||||
mintapif->lasttime = 0;
|
|
||||||
return MINTAPIF_TIMEOUT;
|
|
||||||
}
|
|
||||||
gettimeofday(&tv, &tz);
|
|
||||||
mintapif->lasttime += (tv.tv_sec - now.tv_sec) * 1000000 + (tv.tv_usec - now.tv_usec);
|
|
||||||
|
|
||||||
mintapif_input(netif);
|
|
||||||
}
|
|
||||||
|
|
||||||
return MINTAPIF_PACKET;
|
|
||||||
}
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __MINTAPIF_H__
|
|
||||||
#define __MINTAPIF_H__
|
|
||||||
|
|
||||||
#include "lwip/netif.h"
|
|
||||||
|
|
||||||
enum mintapif_signal {
|
|
||||||
MINTAPIF_TIMEOUT,
|
|
||||||
MINTAPIF_PACKET
|
|
||||||
};
|
|
||||||
|
|
||||||
void mintapif_init(struct netif *netif);
|
|
||||||
enum mintapif_signal mintapif_wait(struct netif *netif, u16_t time);
|
|
||||||
|
|
||||||
#endif /* __MINTAPIF_H__ */
|
|
||||||
@@ -1,244 +0,0 @@
|
|||||||
# Microsoft Developer Studio Project File - Name="lwip4" - Package Owner=<4>
|
|
||||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
|
||||||
# ** NICHT BEARBEITEN **
|
|
||||||
|
|
||||||
# TARGTYPE "Win32 (x86) Static Library" 0x0104
|
|
||||||
|
|
||||||
CFG=lwip4 - Win32 Debug
|
|
||||||
!MESSAGE Dies ist kein g<>ltiges Makefile. Zum Erstellen dieses Projekts mit NMAKE
|
|
||||||
!MESSAGE verwenden Sie den Befehl "Makefile exportieren" und f<>hren Sie den Befehl
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE NMAKE /f "lwip4.mak".
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE Sie k<>nnen beim Ausf<73>hren von NMAKE eine Konfiguration angeben
|
|
||||||
!MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel:
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE NMAKE /f "lwip4.mak" CFG="lwip4 - Win32 Debug"
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE F<>r die Konfiguration stehen zur Auswahl:
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE "lwip4 - Win32 Release" (basierend auf "Win32 (x86) Static Library")
|
|
||||||
!MESSAGE "lwip4 - Win32 Debug" (basierend auf "Win32 (x86) Static Library")
|
|
||||||
!MESSAGE
|
|
||||||
|
|
||||||
# Begin Project
|
|
||||||
# PROP AllowPerConfigDependencies 0
|
|
||||||
# PROP Scc_ProjName ""
|
|
||||||
# PROP Scc_LocalPath ""
|
|
||||||
CPP=cl.exe
|
|
||||||
RSC=rc.exe
|
|
||||||
|
|
||||||
!IF "$(CFG)" == "lwip4 - Win32 Release"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 0
|
|
||||||
# PROP BASE Output_Dir "Release"
|
|
||||||
# PROP BASE Intermediate_Dir "Release"
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 0
|
|
||||||
# PROP Output_Dir "Release"
|
|
||||||
# PROP Intermediate_Dir "Release"
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
|
|
||||||
# ADD CPP /nologo /W3 /GX /O2 /I "..\..\..\src\include" /I "..\..\..\src\include\ipv4" /I "..\..\..\proj\msvc6" /I "..\..\..\src\arch\msvc6\include" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
|
|
||||||
# ADD BASE RSC /l 0x407 /d "NDEBUG"
|
|
||||||
# ADD RSC /l 0x407 /d "NDEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LIB32=link.exe -lib
|
|
||||||
# ADD BASE LIB32 /nologo
|
|
||||||
# ADD LIB32 /nologo
|
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "lwip4 - Win32 Debug"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 1
|
|
||||||
# PROP BASE Output_Dir "Debug"
|
|
||||||
# PROP BASE Intermediate_Dir "Debug"
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 1
|
|
||||||
# PROP Output_Dir "Debug"
|
|
||||||
# PROP Intermediate_Dir "Debug"
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
|
|
||||||
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\..\..\src\include" /I "..\..\..\src\include\ipv4" /I "..\..\..\proj\msvc6" /I "..\..\..\src\arch\msvc6\include" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
|
|
||||||
# ADD BASE RSC /l 0x407 /d "_DEBUG"
|
|
||||||
# ADD RSC /l 0x407 /d "_DEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LIB32=link.exe -lib
|
|
||||||
# ADD BASE LIB32 /nologo
|
|
||||||
# ADD LIB32 /nologo /out:"Debug\lwip4_d.lib"
|
|
||||||
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
# Begin Target
|
|
||||||
|
|
||||||
# Name "lwip4 - Win32 Release"
|
|
||||||
# Name "lwip4 - Win32 Debug"
|
|
||||||
# Begin Group "Quellcodedateien"
|
|
||||||
|
|
||||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\src\core\ipv4\icmp.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\src\core\inet.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\src\core\ipv4\ip.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\src\core\ipv4\ip_addr.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\src\core\mem.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\src\core\memp.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\src\core\netif.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\src\core\pbuf.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\src\core\stats.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\src\core\sys.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\src\core\tcp.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\src\core\tcp_in.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\src\core\tcp_out.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\src\core\udp.c
|
|
||||||
# End Source File
|
|
||||||
# End Group
|
|
||||||
# Begin Group "Header-Dateien"
|
|
||||||
|
|
||||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\src\include\lwip\api.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\src\include\lwip\api_msg.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\src\include\lwip\arch.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\src\arch\msvc6\include\arch\cc.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\src\arch\msvc6\include\arch\cpu.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\src\include\lwip\debug.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\src\include\lwip\def.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\src\include\lwip\err.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\src\include\lwip\event.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\src\include\ipv4\lwip\icmp.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\src\include\ipv4\lwip\inet.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\src\include\ipv4\lwip\ip.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\src\include\ipv4\lwip\ip_addr.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\src\arch\msvc6\include\arch\lib.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\lwipopts.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\src\include\lwip\mem.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\src\include\lwip\memp.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\src\include\lwip\netif.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\src\include\lwip\opt.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\src\include\lwip\pbuf.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\src\include\lwip\sys.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\src\include\lwip\tcp.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\src\include\lwip\tcpip.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\src\include\lwip\udp.h
|
|
||||||
# End Source File
|
|
||||||
# End Group
|
|
||||||
# End Target
|
|
||||||
# End Project
|
|
||||||
@@ -1,168 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __LWIPOPTS_H__
|
|
||||||
#define __LWIPOPTS_H__
|
|
||||||
|
|
||||||
#define NO_SYS 1
|
|
||||||
//#define LWIP_EVENT_API 1
|
|
||||||
|
|
||||||
/* ---------- Memory options ---------- */
|
|
||||||
/* MEM_ALIGNMENT: should be set to the alignment of the CPU for which
|
|
||||||
lwIP is compiled. 4 byte alignment -> define MEM_ALIGNMENT to 4, 2
|
|
||||||
byte alignment -> define MEM_ALIGNMENT to 2. */
|
|
||||||
#define MEM_ALIGNMENT 2
|
|
||||||
|
|
||||||
/* MEM_SIZE: the size of the heap memory. If the application will send
|
|
||||||
a lot of data that needs to be copied, this should be set high. */
|
|
||||||
#define MEM_SIZE 1000
|
|
||||||
|
|
||||||
/* MEMP_NUM_PBUF: the number of memp struct pbufs. If the application
|
|
||||||
sends a lot of data out of ROM (or other static memory), this
|
|
||||||
should be set high. */
|
|
||||||
#define MEMP_NUM_PBUF 8
|
|
||||||
/* MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One
|
|
||||||
per active UDP "connection". */
|
|
||||||
#define MEMP_NUM_UDP_PCB 4
|
|
||||||
/* MEMP_NUM_TCP_PCB: the number of simulatenously active TCP
|
|
||||||
connections. */
|
|
||||||
#define MEMP_NUM_TCP_PCB 2
|
|
||||||
/* MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP
|
|
||||||
connections. */
|
|
||||||
#define MEMP_NUM_TCP_PCB_LISTEN 8
|
|
||||||
/* MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP
|
|
||||||
segments. */
|
|
||||||
#define MEMP_NUM_TCP_SEG 8
|
|
||||||
|
|
||||||
/* The following four are used only with the sequential API and can be
|
|
||||||
set to 0 if the application only will use the raw API. */
|
|
||||||
/* MEMP_NUM_NETBUF: the number of struct netbufs. */
|
|
||||||
#define MEMP_NUM_NETBUF 0
|
|
||||||
/* MEMP_NUM_NETCONN: the number of struct netconns. */
|
|
||||||
#define MEMP_NUM_NETCONN 0
|
|
||||||
/* MEMP_NUM_APIMSG: the number of struct api_msg, used for
|
|
||||||
communication between the TCP/IP stack and the sequential
|
|
||||||
programs. */
|
|
||||||
#define MEMP_NUM_API_MSG 0
|
|
||||||
/* MEMP_NUM_TCPIPMSG: the number of struct tcpip_msg, which is used
|
|
||||||
for sequential API communication and incoming packets. Used in
|
|
||||||
src/api/tcpip.c. */
|
|
||||||
#define MEMP_NUM_TCPIP_MSG 0
|
|
||||||
/* MEMP_NUM_SYS_TIMEOUT: the number of simulateously active
|
|
||||||
timeouts. */
|
|
||||||
#define MEMP_NUM_SYS_TIMEOUT 0
|
|
||||||
|
|
||||||
/* ---------- Pbuf options ---------- */
|
|
||||||
/* PBUF_POOL_SIZE: the number of buffers in the pbuf pool. */
|
|
||||||
#define PBUF_POOL_SIZE 8
|
|
||||||
|
|
||||||
/* PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. */
|
|
||||||
#define PBUF_POOL_BUFSIZE 128
|
|
||||||
|
|
||||||
/* PBUF_LINK_HLEN: the number of bytes that should be allocated for a
|
|
||||||
link level header. */
|
|
||||||
#define PBUF_LINK_HLEN 16
|
|
||||||
|
|
||||||
/* ---------- TCP options ---------- */
|
|
||||||
#define LWIP_TCP 1
|
|
||||||
#define TCP_TTL 255
|
|
||||||
|
|
||||||
/* Controls if TCP should queue segments that arrive out of
|
|
||||||
order. Define to 0 if your device is low on memory. */
|
|
||||||
#define TCP_QUEUE_OOSEQ 0
|
|
||||||
|
|
||||||
/* TCP Maximum segment size. */
|
|
||||||
#define TCP_MSS 128
|
|
||||||
|
|
||||||
/* TCP sender buffer space (bytes). */
|
|
||||||
#define TCP_SND_BUF 256
|
|
||||||
|
|
||||||
/* TCP sender buffer space (pbufs). This must be at least = 2 *
|
|
||||||
TCP_SND_BUF/TCP_MSS for things to work. */
|
|
||||||
#define TCP_SND_QUEUELEN 4 * TCP_SND_BUF/TCP_MSS
|
|
||||||
|
|
||||||
/* TCP receive window. */
|
|
||||||
#define TCP_WND 512
|
|
||||||
|
|
||||||
/* Maximum number of retransmissions of data segments. */
|
|
||||||
#define TCP_MAXRTX 12
|
|
||||||
|
|
||||||
/* Maximum number of retransmissions of SYN segments. */
|
|
||||||
#define TCP_SYNMAXRTX 4
|
|
||||||
|
|
||||||
/* ---------- ARP options ---------- */
|
|
||||||
#define ARP_TABLE_SIZE 10
|
|
||||||
|
|
||||||
/* ---------- IP options ---------- */
|
|
||||||
/* Define IP_FORWARD to 1 if you wish to have the ability to forward
|
|
||||||
IP packets across network interfaces. If you are going to run lwIP
|
|
||||||
on a device with only one network interface, define this to 0. */
|
|
||||||
#define IP_FORWARD 0
|
|
||||||
|
|
||||||
/* If defined to 1, IP options are allowed (but not parsed). If
|
|
||||||
defined to 0, all packets with IP options are dropped. */
|
|
||||||
#define IP_OPTIONS 1
|
|
||||||
|
|
||||||
/* ---------- ICMP options ---------- */
|
|
||||||
#define ICMP_TTL 255
|
|
||||||
|
|
||||||
|
|
||||||
/* ---------- DHCP options ---------- */
|
|
||||||
/* Define LWIP_DHCP to 1 if you want DHCP configuration of
|
|
||||||
interfaces. DHCP is not implemented in lwIP 0.5.1, however, so
|
|
||||||
turning this on does currently not work. */
|
|
||||||
#define LWIP_DHCP 0
|
|
||||||
|
|
||||||
/* 1 if you want to do an ARP check on the offered address
|
|
||||||
(recommended). */
|
|
||||||
#define DHCP_DOES_ARP_CHECK 1
|
|
||||||
|
|
||||||
/* ---------- UDP options ---------- */
|
|
||||||
#define LWIP_UDP 0
|
|
||||||
#define UDP_TTL 255
|
|
||||||
|
|
||||||
|
|
||||||
/* ---------- Statistics options ---------- */
|
|
||||||
/*#define STATS*/
|
|
||||||
|
|
||||||
#ifdef STATS
|
|
||||||
#define LINK_STATS
|
|
||||||
#define IP_STATS
|
|
||||||
#define ICMP_STATS
|
|
||||||
#define UDP_STATS
|
|
||||||
#define TCP_STATS
|
|
||||||
#define MEM_STATS
|
|
||||||
#define MEMP_STATS
|
|
||||||
#define PBUF_STATS
|
|
||||||
#define SYS_STATS
|
|
||||||
#endif /* STATS */
|
|
||||||
|
|
||||||
#endif /* __LWIPOPTS_H__ */
|
|
||||||
@@ -1,527 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001,2002 Florian Schulze.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. Neither the name of the authors nor the names of the contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS 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 AUTHORS 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.
|
|
||||||
*
|
|
||||||
* pktif.c - This file is part of lwIPtest
|
|
||||||
*
|
|
||||||
****************************************************************************
|
|
||||||
*
|
|
||||||
* This file is derived from an example in lwIP with the following license:
|
|
||||||
*
|
|
||||||
* Copyright (c) 2001, Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define WIN32_LEAN_AND_MEAN
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <windows.h>
|
|
||||||
#include <packet32.h>
|
|
||||||
#include <ntddndis.h>
|
|
||||||
|
|
||||||
#include "lwip/debug.h"
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
#include "lwip/def.h"
|
|
||||||
#include "lwip/mem.h"
|
|
||||||
#include "lwip/pbuf.h"
|
|
||||||
#include "lwip/stats.h"
|
|
||||||
#include "lwip/sys.h"
|
|
||||||
#include "lwip/ip.h"
|
|
||||||
|
|
||||||
#include "netif/etharp.h"
|
|
||||||
#include "netif/tcpdump.h"
|
|
||||||
|
|
||||||
#undef NETIF_DEBUG
|
|
||||||
|
|
||||||
/* Define those to better describe your network interface. */
|
|
||||||
#define IFNAME0 'p'
|
|
||||||
#define IFNAME1 'k'
|
|
||||||
|
|
||||||
struct ethernetif {
|
|
||||||
struct eth_addr *ethaddr;
|
|
||||||
/* Add whatever per-interface state that is needed here. */
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct eth_addr ethbroadcast = {{0xff,0xff,0xff,0xff,0xff,0xff}};
|
|
||||||
|
|
||||||
/* Forward declarations. */
|
|
||||||
static void ethernetif_input(struct netif *netif);
|
|
||||||
static err_t ethernetif_output(struct netif *netif, struct pbuf *p,
|
|
||||||
struct ip_addr *ipaddr);
|
|
||||||
|
|
||||||
static struct netif *pktif_netif;
|
|
||||||
|
|
||||||
LPADAPTER lpAdapter;
|
|
||||||
LPPACKET lpPacket;
|
|
||||||
char buffer[256000]; // buffer to hold the data coming from the driver
|
|
||||||
unsigned char *cur_packet;
|
|
||||||
int cur_length;
|
|
||||||
|
|
||||||
struct eth_addr ethaddr;
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
int init_adapter(void)
|
|
||||||
{
|
|
||||||
#define Max_Num_Adapter 10
|
|
||||||
|
|
||||||
char AdapterList[Max_Num_Adapter][1024];
|
|
||||||
|
|
||||||
int i;
|
|
||||||
DWORD dwVersion;
|
|
||||||
DWORD dwWindowsMajorVersion;
|
|
||||||
|
|
||||||
//unicode strings (winnt)
|
|
||||||
WCHAR AdapterName[8192]; // string that contains a list of the network adapters
|
|
||||||
WCHAR *temp,*temp1;
|
|
||||||
|
|
||||||
//ascii strings (win95)
|
|
||||||
char AdapterNamea[8192]; // string that contains a list of the network adapters
|
|
||||||
char *tempa,*temp1a;
|
|
||||||
|
|
||||||
int AdapterNum=0;
|
|
||||||
ULONG AdapterLength;
|
|
||||||
|
|
||||||
PPACKET_OID_DATA ppacket_oid_data;
|
|
||||||
|
|
||||||
BOOLEAN result;
|
|
||||||
|
|
||||||
// obtain the name of the adapters installed on this machine
|
|
||||||
AdapterLength=4096;
|
|
||||||
|
|
||||||
memset(AdapterList,0,sizeof(AdapterList));
|
|
||||||
|
|
||||||
i=0;
|
|
||||||
|
|
||||||
// the data returned by PacketGetAdapterNames is different in Win95 and in WinNT.
|
|
||||||
// We have to check the os on which we are running
|
|
||||||
dwVersion=GetVersion();
|
|
||||||
dwWindowsMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion)));
|
|
||||||
if (!(dwVersion >= 0x80000000 && dwWindowsMajorVersion >= 4))
|
|
||||||
{ // Windows NT
|
|
||||||
if(PacketGetAdapterNames(AdapterName,&AdapterLength)==FALSE){
|
|
||||||
printf("Unable to retrieve the list of the adapters!\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
temp=AdapterName;
|
|
||||||
temp1=AdapterName;
|
|
||||||
while ((*temp!='\0')||(*(temp-1)!='\0'))
|
|
||||||
{
|
|
||||||
if (*temp=='\0')
|
|
||||||
{
|
|
||||||
memcpy(AdapterList[i],temp1,(temp-temp1)*2);
|
|
||||||
temp1=temp+1;
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
temp++;
|
|
||||||
}
|
|
||||||
|
|
||||||
AdapterNum=i;
|
|
||||||
}
|
|
||||||
|
|
||||||
else //windows 95
|
|
||||||
{
|
|
||||||
if(PacketGetAdapterNames(AdapterNamea,&AdapterLength)==FALSE){
|
|
||||||
printf("Unable to retrieve the list of the adapters!\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
tempa=AdapterNamea;
|
|
||||||
temp1a=AdapterNamea;
|
|
||||||
|
|
||||||
while ((*tempa!='\0')||(*(tempa-1)!='\0'))
|
|
||||||
{
|
|
||||||
if (*tempa=='\0')
|
|
||||||
{
|
|
||||||
memcpy(AdapterList[i],temp1a,tempa-temp1a);
|
|
||||||
temp1a=tempa+1;
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
tempa++;
|
|
||||||
}
|
|
||||||
|
|
||||||
AdapterNum=i;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (AdapterNum<=0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
ppacket_oid_data=malloc(sizeof(PACKET_OID_DATA)+6);
|
|
||||||
lpAdapter=PacketOpenAdapter(AdapterList[0]);
|
|
||||||
if (!lpAdapter || (lpAdapter->hFile == INVALID_HANDLE_VALUE))
|
|
||||||
return -1;
|
|
||||||
ppacket_oid_data->Oid=OID_802_3_PERMANENT_ADDRESS;
|
|
||||||
ppacket_oid_data->Length=6;
|
|
||||||
if (!PacketRequest(lpAdapter,FALSE,ppacket_oid_data))
|
|
||||||
return -1;
|
|
||||||
memcpy(ppacket_oid_data->Data,ðaddr,6);
|
|
||||||
free(ppacket_oid_data);
|
|
||||||
PacketSetBuff(lpAdapter,512000);
|
|
||||||
PacketSetReadTimeout(lpAdapter,1);
|
|
||||||
PacketSetHwFilter(lpAdapter,NDIS_PACKET_TYPE_ALL_LOCAL);
|
|
||||||
if((lpPacket = PacketAllocatePacket())==NULL){
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
PacketInitPacket(lpPacket,(char*)buffer,256000);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void shutdown_adapter(void)
|
|
||||||
{
|
|
||||||
struct ethernetif *ethernetif;
|
|
||||||
|
|
||||||
ethernetif = pktif_netif->state;
|
|
||||||
|
|
||||||
PacketFreePacket(lpPacket);
|
|
||||||
PacketCloseAdapter(lpAdapter);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void open_adapter(struct ethernetif *ethernetif)
|
|
||||||
{
|
|
||||||
memcpy(ðaddr,ethernetif->ethaddr,6);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static void
|
|
||||||
low_level_init(struct netif *netif)
|
|
||||||
{
|
|
||||||
struct ethernetif *ethernetif;
|
|
||||||
|
|
||||||
ethernetif = netif->state;
|
|
||||||
|
|
||||||
open_adapter(ethernetif);
|
|
||||||
|
|
||||||
#ifdef NETIF_DEBUG
|
|
||||||
DEBUGF(NETIF_DEBUG, ("pktif: eth_addr %02X%02X%02X%02X%02X%02X\n",ethernetif->ethaddr->addr[0],ethernetif->ethaddr->addr[1],ethernetif->ethaddr->addr[2],ethernetif->ethaddr->addr[3],ethernetif->ethaddr->addr[4],ethernetif->ethaddr->addr[5]));
|
|
||||||
#endif /* NETIF_DEBUG */
|
|
||||||
/* Do whatever else is needed to initialize interface. */
|
|
||||||
|
|
||||||
pktif_netif=netif;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
/*
|
|
||||||
* low_level_output():
|
|
||||||
*
|
|
||||||
* Should do the actual transmission of the packet. The packet is
|
|
||||||
* contained in the pbuf that is passed to the function. This pbuf
|
|
||||||
* might be chained.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
static err_t
|
|
||||||
low_level_output(struct netif *ethernetif, struct pbuf *p)
|
|
||||||
{
|
|
||||||
struct pbuf *q;
|
|
||||||
unsigned char buffer[1600];
|
|
||||||
unsigned char *ptr;
|
|
||||||
LPPACKET lpPacket;
|
|
||||||
|
|
||||||
/* initiate transfer(); */
|
|
||||||
if (p->tot_len>=1600)
|
|
||||||
return ERR_BUF;
|
|
||||||
if((lpPacket = PacketAllocatePacket())==NULL)
|
|
||||||
return ERR_BUF;
|
|
||||||
PacketInitPacket(lpPacket,buffer,p->tot_len);
|
|
||||||
ptr=buffer;
|
|
||||||
for(q = p; q != NULL; q = q->next) {
|
|
||||||
/* Send the data from the pbuf to the interface, one pbuf at a
|
|
||||||
time. The size of the data in each pbuf is kept in the ->len
|
|
||||||
variable. */
|
|
||||||
/* send data from(q->payload, q->len); */
|
|
||||||
#ifdef NETIF_DEBUG
|
|
||||||
DEBUGF(NETIF_DEBUG, ("netif: send ptr %p q->payload %p q->len %i q->next %p\n", ptr, q->payload, (int)q->len, q->next));
|
|
||||||
#endif
|
|
||||||
bcopy(q->payload,ptr,q->len);
|
|
||||||
ptr+=q->len;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* signal that packet should be sent(); */
|
|
||||||
|
|
||||||
if (!PacketSendPacket(lpAdapter,lpPacket,TRUE))
|
|
||||||
return ERR_BUF;
|
|
||||||
PacketFreePacket(lpPacket);
|
|
||||||
|
|
||||||
#ifdef LINK_STATS
|
|
||||||
lwip_stats.link.xmit++;
|
|
||||||
#endif /* LINK_STATS */
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
/*
|
|
||||||
* low_level_input():
|
|
||||||
*
|
|
||||||
* Should allocate a pbuf and transfer the bytes of the incoming
|
|
||||||
* packet from the interface into the pbuf.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static struct pbuf *
|
|
||||||
low_level_input(struct netif *ethernetif)
|
|
||||||
{
|
|
||||||
struct pbuf *p, *q;
|
|
||||||
int start, length;
|
|
||||||
|
|
||||||
/* Obtain the size of the packet and put it into the "len"
|
|
||||||
variable. */
|
|
||||||
length = cur_length;
|
|
||||||
if (length<=0)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
/* We allocate a pbuf chain of pbufs from the pool. */
|
|
||||||
p = pbuf_alloc(PBUF_LINK, (u16_t)length, PBUF_POOL);
|
|
||||||
#ifdef NETIF_DEBUG
|
|
||||||
DEBUGF(NETIF_DEBUG, ("netif: recv length %i p->tot_len %i\n", length, (int)p->tot_len));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if(p != NULL) {
|
|
||||||
/* We iterate over the pbuf chain until we have read the entire
|
|
||||||
packet into the pbuf. */
|
|
||||||
start=0;
|
|
||||||
for(q = p; q != NULL; q = q->next) {
|
|
||||||
/* Read enough bytes to fill this pbuf in the chain. The
|
|
||||||
avaliable data in the pbuf is given by the q->len
|
|
||||||
variable. */
|
|
||||||
/* read data into(q->payload, q->len); */
|
|
||||||
#ifdef NETIF_DEBUG
|
|
||||||
DEBUGF(NETIF_DEBUG, ("netif: recv start %i length %i q->payload %p q->len %i q->next %p\n", start, length, q->payload, (int)q->len, q->next));
|
|
||||||
#endif
|
|
||||||
bcopy(&cur_packet[start],q->payload,q->len);
|
|
||||||
start+=q->len;
|
|
||||||
length-=q->len;
|
|
||||||
if (length<=0)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* acknowledge that packet has been read(); */
|
|
||||||
cur_length=0;
|
|
||||||
#ifdef LINK_STATS
|
|
||||||
lwip_stats.link.recv++;
|
|
||||||
#endif /* LINK_STATS */
|
|
||||||
} else {
|
|
||||||
/* drop packet(); */
|
|
||||||
cur_length=0;
|
|
||||||
#ifdef LINK_STATS
|
|
||||||
lwip_stats.link.memerr++;
|
|
||||||
lwip_stats.link.drop++;
|
|
||||||
#endif /* LINK_STATS */
|
|
||||||
}
|
|
||||||
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
/*
|
|
||||||
* ethernetif_output():
|
|
||||||
*
|
|
||||||
* This function is called by the TCP/IP stack when an IP packet
|
|
||||||
* should be sent. It calls the function called low_level_output() to
|
|
||||||
* do the actuall transmission of the packet.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static err_t
|
|
||||||
ethernetif_output(struct netif *netif, struct pbuf *p,
|
|
||||||
struct ip_addr *ipaddr)
|
|
||||||
{
|
|
||||||
p = etharp_output(netif, ipaddr, p);
|
|
||||||
if(p != NULL) {
|
|
||||||
return low_level_output(netif, p);
|
|
||||||
}
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
/*
|
|
||||||
* ethernetif_input():
|
|
||||||
*
|
|
||||||
* This function should be called when a packet is ready to be read
|
|
||||||
* from the interface. It uses the function low_level_input() that
|
|
||||||
* should handle the actual reception of bytes from the network
|
|
||||||
* interface.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static void
|
|
||||||
ethernetif_input(struct netif *netif)
|
|
||||||
{
|
|
||||||
struct ethernetif *ethernetif;
|
|
||||||
struct eth_hdr *ethhdr;
|
|
||||||
struct pbuf *p;
|
|
||||||
|
|
||||||
|
|
||||||
ethernetif = netif->state;
|
|
||||||
|
|
||||||
p = low_level_input(netif);
|
|
||||||
|
|
||||||
if(p != NULL) {
|
|
||||||
|
|
||||||
#ifdef LINK_STATS
|
|
||||||
lwip_stats.link.recv++;
|
|
||||||
#endif /* LINK_STATS */
|
|
||||||
|
|
||||||
ethhdr = p->payload;
|
|
||||||
|
|
||||||
switch(htons(ethhdr->type)) {
|
|
||||||
case ETHTYPE_IP:
|
|
||||||
etharp_ip_input(netif, p);
|
|
||||||
pbuf_header(p, -14);
|
|
||||||
//if(ip_lookup(p->payload, netif)) {
|
|
||||||
netif->input(p, netif);
|
|
||||||
//}
|
|
||||||
break;
|
|
||||||
case ETHTYPE_ARP:
|
|
||||||
p = etharp_arp_input(netif, ethernetif->ethaddr, p);
|
|
||||||
if(p != NULL) {
|
|
||||||
low_level_output(netif, p);
|
|
||||||
pbuf_free(p);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
pbuf_free(p);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static void
|
|
||||||
arp_timer(void *arg)
|
|
||||||
{
|
|
||||||
etharp_tmr();
|
|
||||||
sys_timeout(ARP_TMR_INTERVAL, (sys_timeout_handler)arp_timer, NULL);
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
/*
|
|
||||||
* ethernetif_init():
|
|
||||||
*
|
|
||||||
* Should be called at the beginning of the program to set up the
|
|
||||||
* network interface. It calls the function low_level_init() to do the
|
|
||||||
* actual setup of the hardware.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
void
|
|
||||||
ethernetif_init(struct netif *netif)
|
|
||||||
{
|
|
||||||
struct ethernetif *ethernetif;
|
|
||||||
|
|
||||||
ethernetif = mem_malloc(sizeof(struct ethernetif));
|
|
||||||
netif->state = ethernetif;
|
|
||||||
netif->name[0] = IFNAME0;
|
|
||||||
netif->name[1] = IFNAME1;
|
|
||||||
netif->output = ethernetif_output;
|
|
||||||
|
|
||||||
ethernetif->ethaddr = (struct eth_addr *)&(netif->hwaddr[0]);
|
|
||||||
|
|
||||||
low_level_init(netif);
|
|
||||||
etharp_init();
|
|
||||||
|
|
||||||
sys_timeout(ARP_TMR_INTERVAL, (sys_timeout_handler)arp_timer, NULL);
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
/*
|
|
||||||
* pktif_update():
|
|
||||||
*
|
|
||||||
* Needs to be called periodically to get new packets. This could
|
|
||||||
* be done inside a thread.
|
|
||||||
*/
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static void ProcessPackets(LPPACKET lpPacket)
|
|
||||||
{
|
|
||||||
|
|
||||||
ULONG ulLines, ulBytesReceived;
|
|
||||||
char *base;
|
|
||||||
char *buf;
|
|
||||||
u_int off=0;
|
|
||||||
u_int tlen,tlen1;
|
|
||||||
struct bpf_hdr *hdr;
|
|
||||||
struct ethernetif *ethernetif;
|
|
||||||
|
|
||||||
ethernetif = pktif_netif->state;
|
|
||||||
|
|
||||||
ulBytesReceived = lpPacket->ulBytesReceived;
|
|
||||||
|
|
||||||
buf = lpPacket->Buffer;
|
|
||||||
|
|
||||||
off=0;
|
|
||||||
|
|
||||||
while(off<ulBytesReceived)
|
|
||||||
{
|
|
||||||
//if(kbhit())return;
|
|
||||||
hdr=(struct bpf_hdr *)(buf+off);
|
|
||||||
tlen1=hdr->bh_datalen;
|
|
||||||
cur_length=tlen1;
|
|
||||||
tlen=hdr->bh_caplen;
|
|
||||||
off+=hdr->bh_hdrlen;
|
|
||||||
|
|
||||||
ulLines = (tlen + 15) / 16;
|
|
||||||
if (ulLines > 5) ulLines=5;
|
|
||||||
|
|
||||||
base =(char*)(buf+off);
|
|
||||||
cur_packet=base;
|
|
||||||
off=Packet_WORDALIGN(off+tlen);
|
|
||||||
|
|
||||||
ethernetif_input(pktif_netif);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void update_adapter(void)
|
|
||||||
{
|
|
||||||
struct ethernetif *ethernetif;
|
|
||||||
|
|
||||||
ethernetif = pktif_netif->state;
|
|
||||||
|
|
||||||
if(PacketReceivePacket(lpAdapter,lpPacket,TRUE)==TRUE)
|
|
||||||
ProcessPackets(lpPacket);
|
|
||||||
cur_length=0;
|
|
||||||
cur_packet=NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,104 +0,0 @@
|
|||||||
# Microsoft Developer Studio Project File - Name="pktif" - Package Owner=<4>
|
|
||||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
|
||||||
# ** NICHT BEARBEITEN **
|
|
||||||
|
|
||||||
# TARGTYPE "Win32 (x86) Static Library" 0x0104
|
|
||||||
|
|
||||||
CFG=pktif - Win32 Debug
|
|
||||||
!MESSAGE Dies ist kein g<>ltiges Makefile. Zum Erstellen dieses Projekts mit NMAKE
|
|
||||||
!MESSAGE verwenden Sie den Befehl "Makefile exportieren" und f<>hren Sie den Befehl
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE NMAKE /f "pktif.mak".
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE Sie k<>nnen beim Ausf<73>hren von NMAKE eine Konfiguration angeben
|
|
||||||
!MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel:
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE NMAKE /f "pktif.mak" CFG="pktif - Win32 Debug"
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE F<>r die Konfiguration stehen zur Auswahl:
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE "pktif - Win32 Release" (basierend auf "Win32 (x86) Static Library")
|
|
||||||
!MESSAGE "pktif - Win32 Debug" (basierend auf "Win32 (x86) Static Library")
|
|
||||||
!MESSAGE
|
|
||||||
|
|
||||||
# Begin Project
|
|
||||||
# PROP AllowPerConfigDependencies 0
|
|
||||||
# PROP Scc_ProjName ""
|
|
||||||
# PROP Scc_LocalPath ""
|
|
||||||
CPP=cl.exe
|
|
||||||
RSC=rc.exe
|
|
||||||
|
|
||||||
!IF "$(CFG)" == "pktif - Win32 Release"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 0
|
|
||||||
# PROP BASE Output_Dir "Release"
|
|
||||||
# PROP BASE Intermediate_Dir "Release"
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 0
|
|
||||||
# PROP Output_Dir "Release"
|
|
||||||
# PROP Intermediate_Dir "Release"
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
|
|
||||||
# ADD CPP /nologo /W3 /GX /O2 /I "..\..\..\src\include" /I "..\..\..\src\include\ipv4" /I "..\..\..\proj\msvc6" /I "..\..\..\src\arch\msvc6\include" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
|
|
||||||
# ADD BASE RSC /l 0x407 /d "NDEBUG"
|
|
||||||
# ADD RSC /l 0x407 /d "NDEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LIB32=link.exe -lib
|
|
||||||
# ADD BASE LIB32 /nologo
|
|
||||||
# ADD LIB32 /nologo
|
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "pktif - Win32 Debug"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 1
|
|
||||||
# PROP BASE Output_Dir "Debug"
|
|
||||||
# PROP BASE Intermediate_Dir "Debug"
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 1
|
|
||||||
# PROP Output_Dir "Debug"
|
|
||||||
# PROP Intermediate_Dir "Debug"
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
|
|
||||||
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\..\..\src\include" /I "..\..\..\src\include\ipv4" /I "..\..\..\proj\msvc6" /I "..\..\..\src\arch\msvc6\include" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
|
|
||||||
# ADD BASE RSC /l 0x407 /d "_DEBUG"
|
|
||||||
# ADD RSC /l 0x407 /d "_DEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LIB32=link.exe -lib
|
|
||||||
# ADD BASE LIB32 /nologo
|
|
||||||
# ADD LIB32 /nologo /out:"Debug\pktif_d.lib"
|
|
||||||
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
# Begin Target
|
|
||||||
|
|
||||||
# Name "pktif - Win32 Release"
|
|
||||||
# Name "pktif - Win32 Debug"
|
|
||||||
# Begin Group "Quellcodedateien"
|
|
||||||
|
|
||||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\src\netif\etharp.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\pktif.c
|
|
||||||
# End Source File
|
|
||||||
# End Group
|
|
||||||
# Begin Group "Header-Dateien"
|
|
||||||
|
|
||||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\src\include\netif\etharp.h
|
|
||||||
# End Source File
|
|
||||||
# End Group
|
|
||||||
# End Target
|
|
||||||
# End Project
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
lwIP for Win32
|
|
||||||
|
|
||||||
***WARNING***
|
|
||||||
The current CVS code of this port isn't much tested.
|
|
||||||
***WARNING***
|
|
||||||
|
|
||||||
This is a quickly hacked port and example project of the lwIP library to
|
|
||||||
Win32/MSVC.
|
|
||||||
|
|
||||||
Due to the nature of the lwip library you have to copy this whole project
|
|
||||||
into a new subdir in proj and modify lwipopts.h to your needs. If you move
|
|
||||||
it to another directory besides proj, you have to update the include paths
|
|
||||||
in the project settings.
|
|
||||||
|
|
||||||
Included in the proj/msvc6 directory is the network interface driver using
|
|
||||||
the winpcap library.
|
|
||||||
|
|
||||||
There is no more documentation yet. Try to figure it out yourself.
|
|
||||||
|
|
||||||
This is provided as is, it's just a hack to test some stuff, no serious
|
|
||||||
implementation.
|
|
||||||
|
|
||||||
Florian Schulze (florian.proff.schulze@gmx.net)
|
|
||||||
|
|
||||||
lwIP: http://www.sics.se/~adam/lwip/
|
|
||||||
WinPCap: http://netgroup-serv.polito.it/winpcap/
|
|
||||||
@@ -1,217 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001,2002 Florian Schulze.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. Neither the name of the authors nor the names of the contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS 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 AUTHORS 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.
|
|
||||||
*
|
|
||||||
* test.c - This file is part of lwIPtest
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "lwip/debug.h"
|
|
||||||
#include "lwip/mem.h"
|
|
||||||
#include "lwip/memp.h"
|
|
||||||
#include "lwip/sys.h"
|
|
||||||
|
|
||||||
#include "lwip/stats.h"
|
|
||||||
|
|
||||||
#include "lwip/tcpip.h"
|
|
||||||
|
|
||||||
#include "netif/loopif.h"
|
|
||||||
#include "netif/tcpdump.h"
|
|
||||||
|
|
||||||
#include "arch/perf.h"
|
|
||||||
|
|
||||||
//#include "httpd.h"
|
|
||||||
//#include "ftpd.h"
|
|
||||||
//#include "fs.h"
|
|
||||||
|
|
||||||
void ethernetif_init(struct netif *netif);
|
|
||||||
int init_adapter(void);
|
|
||||||
void shutdown_adapter(void);
|
|
||||||
void update_adapter(void);
|
|
||||||
|
|
||||||
int dbg_printf(const char *fmt, ...)
|
|
||||||
{
|
|
||||||
va_list v;
|
|
||||||
int r;
|
|
||||||
|
|
||||||
va_start(v, fmt);
|
|
||||||
r = vfprintf(stderr,fmt, v);
|
|
||||||
va_end(v);
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
static err_t netio_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
|
|
||||||
{
|
|
||||||
if (err == ERR_OK && p != NULL)
|
|
||||||
{
|
|
||||||
tcp_recved(pcb, p->tot_len);
|
|
||||||
pbuf_free(p);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
pbuf_free(p);
|
|
||||||
|
|
||||||
if (err == ERR_OK && p == NULL)
|
|
||||||
{
|
|
||||||
tcp_arg(pcb, NULL);
|
|
||||||
tcp_sent(pcb, NULL);
|
|
||||||
tcp_recv(pcb, NULL);
|
|
||||||
tcp_close(pcb);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
static err_t netio_accept(void *arg, struct tcp_pcb *pcb, err_t err)
|
|
||||||
{
|
|
||||||
tcp_arg(pcb, NULL);
|
|
||||||
tcp_sent(pcb, NULL);
|
|
||||||
tcp_recv(pcb, netio_recv);
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
void netio_init(void)
|
|
||||||
{
|
|
||||||
struct tcp_pcb *pcb;
|
|
||||||
|
|
||||||
pcb = tcp_new();
|
|
||||||
tcp_bind(pcb, IP_ADDR_ANY, 18767);
|
|
||||||
pcb = tcp_listen(pcb);
|
|
||||||
tcp_accept(pcb, netio_accept);
|
|
||||||
}
|
|
||||||
|
|
||||||
void main_loop()
|
|
||||||
{
|
|
||||||
struct ip_addr ipaddr, netmask, gw;
|
|
||||||
int last_time;
|
|
||||||
int timer1;
|
|
||||||
int timer2;
|
|
||||||
int done;
|
|
||||||
|
|
||||||
IP4_ADDR(&gw, 192,168,2,201);
|
|
||||||
IP4_ADDR(&ipaddr, 192,168,2,200);
|
|
||||||
IP4_ADDR(&netmask, 255,255,255,0);
|
|
||||||
|
|
||||||
if (init_adapter() != 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
netif_set_default(netif_add(&ipaddr, &netmask, &gw, ethernetif_init,
|
|
||||||
ip_input));
|
|
||||||
|
|
||||||
/*
|
|
||||||
IP4_ADDR(&gw, 127,0,0,1);
|
|
||||||
IP4_ADDR(&ipaddr, 127,0,0,1);
|
|
||||||
IP4_ADDR(&netmask, 255,0,0,0);
|
|
||||||
|
|
||||||
netif_add(&ipaddr, &netmask, &gw, loopif_init,
|
|
||||||
ip_input);
|
|
||||||
*/
|
|
||||||
|
|
||||||
tcp_init();
|
|
||||||
udp_init();
|
|
||||||
ip_init();
|
|
||||||
|
|
||||||
//httpd_init();
|
|
||||||
netio_init();
|
|
||||||
//ftpd_init();
|
|
||||||
|
|
||||||
last_time=clock();
|
|
||||||
timer1=0;
|
|
||||||
timer2=0;
|
|
||||||
done=0;
|
|
||||||
|
|
||||||
while(!done)
|
|
||||||
{
|
|
||||||
int cur_time;
|
|
||||||
int time_diff;
|
|
||||||
|
|
||||||
cur_time=clock();
|
|
||||||
time_diff=cur_time-last_time;
|
|
||||||
if (time_diff>0)
|
|
||||||
{
|
|
||||||
last_time=cur_time;
|
|
||||||
timer1+=time_diff;
|
|
||||||
timer2+=time_diff;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (timer1>10)
|
|
||||||
{
|
|
||||||
tcp_fasttmr();
|
|
||||||
timer1=0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (timer2>45)
|
|
||||||
{
|
|
||||||
tcp_slowtmr();
|
|
||||||
timer2=0;
|
|
||||||
done=kbhit();
|
|
||||||
}
|
|
||||||
|
|
||||||
update_adapter();
|
|
||||||
}
|
|
||||||
|
|
||||||
shutdown_adapter();
|
|
||||||
}
|
|
||||||
|
|
||||||
void bcopy(const void *src, void *dest, int len)
|
|
||||||
{
|
|
||||||
memcpy(dest,src,len);
|
|
||||||
}
|
|
||||||
|
|
||||||
void bzero(void *data, int n)
|
|
||||||
{
|
|
||||||
memset(data,0,n);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
setvbuf(stdout,NULL,_IONBF,0);
|
|
||||||
#ifdef PERF
|
|
||||||
perf_init("/tmp/lwip.perf");
|
|
||||||
#endif /* PERF */
|
|
||||||
#ifdef STATS
|
|
||||||
stats_init();
|
|
||||||
#endif /* STATS */
|
|
||||||
sys_init();
|
|
||||||
mem_init();
|
|
||||||
memp_init();
|
|
||||||
pbuf_init();
|
|
||||||
|
|
||||||
//tcpdump_init();
|
|
||||||
|
|
||||||
printf("System initialized.\n");
|
|
||||||
|
|
||||||
main_loop();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,154 +0,0 @@
|
|||||||
# Microsoft Developer Studio Project File - Name="test" - Package Owner=<4>
|
|
||||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
|
||||||
# ** NICHT BEARBEITEN **
|
|
||||||
|
|
||||||
# TARGTYPE "Win32 (x86) Console Application" 0x0103
|
|
||||||
|
|
||||||
CFG=test - Win32 Debug
|
|
||||||
!MESSAGE Dies ist kein g<>ltiges Makefile. Zum Erstellen dieses Projekts mit NMAKE
|
|
||||||
!MESSAGE verwenden Sie den Befehl "Makefile exportieren" und f<>hren Sie den Befehl
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE NMAKE /f "test.mak".
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE Sie k<>nnen beim Ausf<73>hren von NMAKE eine Konfiguration angeben
|
|
||||||
!MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel:
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE NMAKE /f "test.mak" CFG="test - Win32 Debug"
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE F<>r die Konfiguration stehen zur Auswahl:
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE "test - Win32 Release" (basierend auf "Win32 (x86) Console Application")
|
|
||||||
!MESSAGE "test - Win32 Debug" (basierend auf "Win32 (x86) Console Application")
|
|
||||||
!MESSAGE
|
|
||||||
|
|
||||||
# Begin Project
|
|
||||||
# PROP AllowPerConfigDependencies 0
|
|
||||||
# PROP Scc_ProjName ""
|
|
||||||
# PROP Scc_LocalPath ""
|
|
||||||
CPP=cl.exe
|
|
||||||
RSC=rc.exe
|
|
||||||
|
|
||||||
!IF "$(CFG)" == "test - Win32 Release"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 0
|
|
||||||
# PROP BASE Output_Dir "Release"
|
|
||||||
# PROP BASE Intermediate_Dir "Release"
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 0
|
|
||||||
# PROP Output_Dir "Release"
|
|
||||||
# PROP Intermediate_Dir "Release"
|
|
||||||
# PROP Ignore_Export_Lib 0
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
|
||||||
# ADD CPP /nologo /W3 /GX /O2 /I "..\..\..\src\include" /I "..\..\..\src\include\ipv4" /I "..\..\..\proj\msvc6" /I "..\..\..\src\arch\msvc6\include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
|
||||||
# ADD BASE RSC /l 0x407 /d "NDEBUG"
|
|
||||||
# ADD RSC /l 0x407 /d "NDEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LINK32=link.exe
|
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
|
|
||||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Packet.lib /nologo /subsystem:console /machine:I386
|
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "test - Win32 Debug"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 1
|
|
||||||
# PROP BASE Output_Dir "Debug"
|
|
||||||
# PROP BASE Intermediate_Dir "Debug"
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 1
|
|
||||||
# PROP Output_Dir "Debug"
|
|
||||||
# PROP Intermediate_Dir "Debug"
|
|
||||||
# PROP Ignore_Export_Lib 0
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
|
|
||||||
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\..\src\include" /I "..\..\src\include\ipv4" /I "..\..\src\arch\msvc6\include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
|
|
||||||
# ADD BASE RSC /l 0x407 /d "_DEBUG"
|
|
||||||
# ADD RSC /l 0x407 /d "_DEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LINK32=link.exe
|
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
|
|
||||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Packet.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
|
|
||||||
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
# Begin Target
|
|
||||||
|
|
||||||
# Name "test - Win32 Release"
|
|
||||||
# Name "test - Win32 Debug"
|
|
||||||
# Begin Group "Quellcodedateien"
|
|
||||||
|
|
||||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\test.c
|
|
||||||
# End Source File
|
|
||||||
# End Group
|
|
||||||
# Begin Group "Header-Dateien"
|
|
||||||
|
|
||||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
|
||||||
# End Group
|
|
||||||
# Begin Group "Ressourcendateien"
|
|
||||||
|
|
||||||
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
|
|
||||||
# End Group
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\lwip4\Release\lwip4.lib
|
|
||||||
|
|
||||||
!IF "$(CFG)" == "test - Win32 Release"
|
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "test - Win32 Debug"
|
|
||||||
|
|
||||||
# PROP Exclude_From_Build 1
|
|
||||||
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\lwip4\Debug\lwip4_d.lib
|
|
||||||
|
|
||||||
!IF "$(CFG)" == "test - Win32 Release"
|
|
||||||
|
|
||||||
# PROP Exclude_From_Build 1
|
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "test - Win32 Debug"
|
|
||||||
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\pktif\Debug\pktif_d.lib
|
|
||||||
|
|
||||||
!IF "$(CFG)" == "test - Win32 Release"
|
|
||||||
|
|
||||||
# PROP Exclude_From_Build 1
|
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "test - Win32 Debug"
|
|
||||||
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\pktif\Release\pktif.lib
|
|
||||||
|
|
||||||
!IF "$(CFG)" == "test - Win32 Release"
|
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "test - Win32 Debug"
|
|
||||||
|
|
||||||
# PROP Exclude_From_Build 1
|
|
||||||
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
# End Source File
|
|
||||||
# End Target
|
|
||||||
# End Project
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
Microsoft Developer Studio Workspace File, Format Version 6.00
|
|
||||||
# WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GEL<45>SCHT WERDEN!
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
Project: "lwip4"=.\lwip4\lwip4.dsp - Package Owner=<4>
|
|
||||||
|
|
||||||
Package=<5>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
Package=<4>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
Project: "pktif"=.\pktif\pktif.dsp - Package Owner=<4>
|
|
||||||
|
|
||||||
Package=<5>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
Package=<4>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
Project: "test"=.\test.dsp - Package Owner=<4>
|
|
||||||
|
|
||||||
Package=<5>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
Package=<4>
|
|
||||||
{{{
|
|
||||||
Begin Project Dependency
|
|
||||||
Project_Dep_Name lwip4
|
|
||||||
End Project Dependency
|
|
||||||
Begin Project Dependency
|
|
||||||
Project_Dep_Name pktif
|
|
||||||
End Project Dependency
|
|
||||||
}}}
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
Global:
|
|
||||||
|
|
||||||
Package=<5>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
Package=<3>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
@@ -1,86 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright (c) 2001, 2002 Swedish Institute of Computer Science.
|
|
||||||
# All rights reserved.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
# are permitted provided that the following conditions are met:
|
|
||||||
#
|
|
||||||
# 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
# this list of conditions and the following disclaimer.
|
|
||||||
# 2. 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.
|
|
||||||
# 3. The name of the author may not be used to endorse or promote products
|
|
||||||
# derived from this software without specific prior written permission.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
#
|
|
||||||
# This file is part of the lwIP TCP/IP stack.
|
|
||||||
#
|
|
||||||
# Author: Adam Dunkels <adam@sics.se>
|
|
||||||
#
|
|
||||||
|
|
||||||
CCDEP=gcc
|
|
||||||
CC=gcc
|
|
||||||
CFLAGS=-g -Wall -fPIC -DIPv4 -DLWIP_DEBUG
|
|
||||||
LWIPARCH=unix
|
|
||||||
LWIPDIR=../../src
|
|
||||||
|
|
||||||
CFLAGS:=$(CFLAGS) \
|
|
||||||
-I$(LWIPDIR)/include -I$(LWIPDIR)/arch/$(LWIPARCH)/include -I$(LWIPDIR)/include/ipv4 \
|
|
||||||
-Iapps -I.
|
|
||||||
|
|
||||||
# COREFILES, CORE4FILES: The minimum set of files needed for lwIP.
|
|
||||||
COREFILES=$(LWIPDIR)/core/mem.c $(LWIPDIR)/core/memp.c $(LWIPDIR)/core/netif.c \
|
|
||||||
$(LWIPDIR)/core/pbuf.c $(LWIPDIR)/core/stats.c $(LWIPDIR)/core/sys.c \
|
|
||||||
$(LWIPDIR)/core/tcp.c $(LWIPDIR)/core/tcp_in.c \
|
|
||||||
$(LWIPDIR)/core/tcp_out.c $(LWIPDIR)/core/udp.c
|
|
||||||
CORE4FILES=$(LWIPDIR)/core/ipv4/icmp.c $(LWIPDIR)/core/ipv4/ip.c \
|
|
||||||
$(LWIPDIR)/core/inet.c $(LWIPDIR)/core/ipv4/ip_addr.c
|
|
||||||
|
|
||||||
|
|
||||||
# APIFILES: The files which implement the sequential and socket APIs.
|
|
||||||
APIFILES=$(LWIPDIR)/api/api_lib.c $(LWIPDIR)/api/api_msg.c $(LWIPDIR)/api/tcpip.c \
|
|
||||||
$(LWIPDIR)/api/err.c $(LWIPDIR)/api/sockets.c
|
|
||||||
|
|
||||||
# NETIFFILES: Files implementing various generic network interface functions.'
|
|
||||||
NETIFFILES=$(LWIPDIR)/netif/loopif.c \
|
|
||||||
$(LWIPDIR)/netif/etharp.c
|
|
||||||
|
|
||||||
# ARCHFILES: Archiecture specific files.
|
|
||||||
ARCHFILES=$(wildcard $(LWIPDIR)/arch/$(LWIPARCH)/*.c $(LWIPDIR)/arch/$(LWIPARCH)/netif/*.c)
|
|
||||||
|
|
||||||
# LWIPFILES: All the above.
|
|
||||||
LWIPFILES=$(COREFILES) $(CORE4FILES) $(APIFILES) $(NETIFFILES) $(ARCHFILES)
|
|
||||||
LWIPFILESW=$(wildcard $(LWIPFILES))
|
|
||||||
LWIPOBJS=$(notdir $(LWIPFILESW:.c=.o))
|
|
||||||
|
|
||||||
LWIPLIB=liblwip4$(LWIPARCH)lib.so
|
|
||||||
|
|
||||||
%.o:
|
|
||||||
$(CC) $(CFLAGS) -c $(<:.o=.c)
|
|
||||||
|
|
||||||
all: $(LWIPLIB)
|
|
||||||
.PHONY: all
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f *.o $(LWIPLIB) *.s .depend* *.core core
|
|
||||||
|
|
||||||
depend dep: .depend
|
|
||||||
|
|
||||||
include .depend
|
|
||||||
|
|
||||||
$(LWIPLIB): $(LWIPOBJS) unixlib.o
|
|
||||||
$(CC) -g -nostartfiles -shared -o $@ $^
|
|
||||||
|
|
||||||
.depend: unixlib.c $(LWIPFILES)
|
|
||||||
$(CCDEP) $(CFLAGS) -MM $^ > .depend || rm -f .depend
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
This directory contains an example of how to compile lwIP as a self
|
|
||||||
initialising shared library on Linux.
|
|
||||||
|
|
||||||
Some brief instructions:
|
|
||||||
|
|
||||||
* Compile the code:
|
|
||||||
|
|
||||||
> make clean all
|
|
||||||
|
|
||||||
This should produce liblwip4unixlib.so. This is the shared library.
|
|
||||||
|
|
||||||
* Link an application against the shared library
|
|
||||||
|
|
||||||
If you're using gcc you can do this by including -llwip4unixlib in
|
|
||||||
your link command.
|
|
||||||
|
|
||||||
* Run your application
|
|
||||||
|
|
||||||
Ensure that LD_LIBRARY_PATH includes the directory that contains
|
|
||||||
liblwip4unixlib.so (ie. this directory)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
If you are unsure about shared libraries and libraries on linux in
|
|
||||||
general, you might find this HOWTO useful:
|
|
||||||
|
|
||||||
<http://www.tldp.org/HOWTO/Program-Library-HOWTO/>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Kieran Mansley, October 2002.
|
|
||||||
@@ -1,172 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __LWIPOPTS_H__
|
|
||||||
#define __LWIPOPTS_H__
|
|
||||||
|
|
||||||
/* ---------- Memory options ---------- */
|
|
||||||
/* MEM_ALIGNMENT: should be set to the alignment of the CPU for which
|
|
||||||
lwIP is compiled. 4 byte alignment -> define MEM_ALIGNMENT to 4, 2
|
|
||||||
byte alignment -> define MEM_ALIGNMENT to 2. */
|
|
||||||
#define MEM_ALIGNMENT 1
|
|
||||||
|
|
||||||
/* MEM_SIZE: the size of the heap memory. If the application will send
|
|
||||||
a lot of data that needs to be copied, this should be set high. */
|
|
||||||
#define MEM_SIZE 1600
|
|
||||||
|
|
||||||
/* MEMP_NUM_PBUF: the number of memp struct pbufs. If the application
|
|
||||||
sends a lot of data out of ROM (or other static memory), this
|
|
||||||
should be set high. */
|
|
||||||
#define MEMP_NUM_PBUF 16
|
|
||||||
/* MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One
|
|
||||||
per active UDP "connection". */
|
|
||||||
#define MEMP_NUM_UDP_PCB 4
|
|
||||||
/* MEMP_NUM_TCP_PCB: the number of simulatenously active TCP
|
|
||||||
connections. */
|
|
||||||
#define MEMP_NUM_TCP_PCB 5
|
|
||||||
/* MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP
|
|
||||||
connections. */
|
|
||||||
#define MEMP_NUM_TCP_PCB_LISTEN 8
|
|
||||||
/* MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP
|
|
||||||
segments. */
|
|
||||||
#define MEMP_NUM_TCP_SEG 16
|
|
||||||
/* MEMP_NUM_SYS_TIMEOUT: the number of simulateously active
|
|
||||||
timeouts. */
|
|
||||||
#define MEMP_NUM_SYS_TIMEOUT 3
|
|
||||||
|
|
||||||
|
|
||||||
/* The following four are used only with the sequential API and can be
|
|
||||||
set to 0 if the application only will use the raw API. */
|
|
||||||
/* MEMP_NUM_NETBUF: the number of struct netbufs. */
|
|
||||||
#define MEMP_NUM_NETBUF 2
|
|
||||||
/* MEMP_NUM_NETCONN: the number of struct netconns. */
|
|
||||||
#define MEMP_NUM_NETCONN 4
|
|
||||||
/* MEMP_NUM_APIMSG: the number of struct api_msg, used for
|
|
||||||
communication between the TCP/IP stack and the sequential
|
|
||||||
programs. */
|
|
||||||
#define MEMP_NUM_API_MSG 8
|
|
||||||
/* MEMP_NUM_TCPIPMSG: the number of struct tcpip_msg, which is used
|
|
||||||
for sequential API communication and incoming packets. Used in
|
|
||||||
src/api/tcpip.c. */
|
|
||||||
#define MEMP_NUM_TCPIP_MSG 8
|
|
||||||
|
|
||||||
/* These two control is reclaimer functions should be compiled
|
|
||||||
in. Should always be turned on (1). */
|
|
||||||
#define MEM_RECLAIM 1
|
|
||||||
#define MEMP_RECLAIM 1
|
|
||||||
|
|
||||||
/* ---------- Pbuf options ---------- */
|
|
||||||
/* PBUF_POOL_SIZE: the number of buffers in the pbuf pool. */
|
|
||||||
#define PBUF_POOL_SIZE 6
|
|
||||||
|
|
||||||
/* PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. */
|
|
||||||
#define PBUF_POOL_BUFSIZE 128
|
|
||||||
|
|
||||||
/* PBUF_LINK_HLEN: the number of bytes that should be allocated for a
|
|
||||||
link level header. */
|
|
||||||
#define PBUF_LINK_HLEN 16
|
|
||||||
|
|
||||||
/* ---------- TCP options ---------- */
|
|
||||||
#define LWIP_TCP 1
|
|
||||||
#define TCP_TTL 255
|
|
||||||
|
|
||||||
/* Controls if TCP should queue segments that arrive out of
|
|
||||||
order. Define to 0 if your device is low on memory. */
|
|
||||||
#define TCP_QUEUE_OOSEQ 1
|
|
||||||
|
|
||||||
/* TCP Maximum segment size. */
|
|
||||||
#define TCP_MSS 128
|
|
||||||
|
|
||||||
/* TCP sender buffer space (bytes). */
|
|
||||||
#define TCP_SND_BUF 256
|
|
||||||
|
|
||||||
/* TCP sender buffer space (pbufs). This must be at least = 2 *
|
|
||||||
TCP_SND_BUF/TCP_MSS for things to work. */
|
|
||||||
#define TCP_SND_QUEUELEN 4 * TCP_SND_BUF/TCP_MSS
|
|
||||||
|
|
||||||
/* TCP receive window. */
|
|
||||||
#define TCP_WND 1024
|
|
||||||
|
|
||||||
/* Maximum number of retransmissions of data segments. */
|
|
||||||
#define TCP_MAXRTX 12
|
|
||||||
|
|
||||||
/* Maximum number of retransmissions of SYN segments. */
|
|
||||||
#define TCP_SYNMAXRTX 4
|
|
||||||
|
|
||||||
/* ---------- ARP options ---------- */
|
|
||||||
#define ARP_TABLE_SIZE 10
|
|
||||||
#define ARP_QUEUEING 1
|
|
||||||
|
|
||||||
/* ---------- IP options ---------- */
|
|
||||||
/* Define IP_FORWARD to 1 if you wish to have the ability to forward
|
|
||||||
IP packets across network interfaces. If you are going to run lwIP
|
|
||||||
on a device with only one network interface, define this to 0. */
|
|
||||||
#define IP_FORWARD 1
|
|
||||||
|
|
||||||
/* If defined to 1, IP options are allowed (but not parsed). If
|
|
||||||
defined to 0, all packets with IP options are dropped. */
|
|
||||||
#define IP_OPTIONS 1
|
|
||||||
|
|
||||||
/* ---------- ICMP options ---------- */
|
|
||||||
#define ICMP_TTL 255
|
|
||||||
|
|
||||||
|
|
||||||
/* ---------- DHCP options ---------- */
|
|
||||||
/* Define LWIP_DHCP to 1 if you want DHCP configuration of
|
|
||||||
interfaces. DHCP is not implemented in lwIP 0.5.1, however, so
|
|
||||||
turning this on does currently not work. */
|
|
||||||
#define LWIP_DHCP 0
|
|
||||||
|
|
||||||
/* 1 if you want to do an ARP check on the offered address
|
|
||||||
(recommended). */
|
|
||||||
#define DHCP_DOES_ARP_CHECK 1
|
|
||||||
|
|
||||||
/* ---------- UDP options ---------- */
|
|
||||||
#define LWIP_UDP 1
|
|
||||||
#define UDP_TTL 255
|
|
||||||
|
|
||||||
|
|
||||||
/* ---------- Statistics options ---------- */
|
|
||||||
#define STATS
|
|
||||||
|
|
||||||
#ifdef STATS
|
|
||||||
#define LINK_STATS
|
|
||||||
#define IP_STATS
|
|
||||||
#define ICMP_STATS
|
|
||||||
#define UDP_STATS
|
|
||||||
#define TCP_STATS
|
|
||||||
#define MEM_STATS
|
|
||||||
#define MEMP_STATS
|
|
||||||
#define PBUF_STATS
|
|
||||||
#define SYS_STATS
|
|
||||||
#endif /* STATS */
|
|
||||||
|
|
||||||
#endif /* __LWIPOPTS_H__ */
|
|
||||||
@@ -1,91 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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: Kieran Mansley <kjm25@cam.ac.uk>
|
|
||||||
*
|
|
||||||
* $Id: unixlib.c,v 1.2 2003/01/08 10:09:40 likewise Exp $
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
/* unixlib.c
|
|
||||||
*
|
|
||||||
* The initialisation functions for a shared library
|
|
||||||
*
|
|
||||||
* You may need to configure this file to your own needs - it is only an example
|
|
||||||
* of how lwIP can be used as a self initialising shared library.
|
|
||||||
*
|
|
||||||
* In particular, you should change the gateway, ipaddr, and netmask to be the values
|
|
||||||
* you would like the stack to use.
|
|
||||||
*/
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
#include "lwip/sys.h"
|
|
||||||
#include "lwip/mem.h"
|
|
||||||
#include "lwip/memp.h"
|
|
||||||
#include "lwip/pbuf.h"
|
|
||||||
#include "lwip/tcp.h"
|
|
||||||
#include "lwip/tcpip.h"
|
|
||||||
#include "lwip/netif.h"
|
|
||||||
#include "lwip/stats.h"
|
|
||||||
|
|
||||||
#include "netif/tapif.h"
|
|
||||||
|
|
||||||
static void
|
|
||||||
tcpip_init_done(void *arg)
|
|
||||||
{
|
|
||||||
sys_sem_t *sem;
|
|
||||||
sem = arg;
|
|
||||||
sys_sem_signal(*sem);
|
|
||||||
}
|
|
||||||
|
|
||||||
void _init(void){
|
|
||||||
struct ip_addr ipaddr, netmask, gateway;
|
|
||||||
sys_sem_t sem;
|
|
||||||
|
|
||||||
stats_init();
|
|
||||||
sys_init();
|
|
||||||
mem_init();
|
|
||||||
memp_init();
|
|
||||||
pbuf_init();
|
|
||||||
|
|
||||||
sem = sys_sem_new(0);
|
|
||||||
tcpip_init(tcpip_init_done, &sem);
|
|
||||||
sys_sem_wait(sem);
|
|
||||||
sys_sem_free(sem);
|
|
||||||
|
|
||||||
netif_init();
|
|
||||||
/*
|
|
||||||
CHANGE THESE to suit your own network configuration:
|
|
||||||
*/
|
|
||||||
IP4_ADDR(&gateway, 192,168,1,1);
|
|
||||||
IP4_ADDR(&ipaddr, 192,168,1,1);
|
|
||||||
IP4_ADDR(&netmask, 255,255,255,0);
|
|
||||||
|
|
||||||
netif_set_default(netif_add(&ipaddr, &netmask, &gateway, tapif_init,
|
|
||||||
tcpip_input));
|
|
||||||
}
|
|
||||||
|
|
||||||
void _fini(void){
|
|
||||||
}
|
|
||||||
@@ -1,107 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright (c) 2001, 2002 Swedish Institute of Computer Science.
|
|
||||||
# All rights reserved.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
# are permitted provided that the following conditions are met:
|
|
||||||
#
|
|
||||||
# 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
# this list of conditions and the following disclaimer.
|
|
||||||
# 2. 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.
|
|
||||||
# 3. The name of the author may not be used to endorse or promote products
|
|
||||||
# derived from this software without specific prior written permission.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
#
|
|
||||||
# This file is part of the lwIP TCP/IP stack.
|
|
||||||
#
|
|
||||||
# Author: Adam Dunkels <adam@sics.se>
|
|
||||||
#
|
|
||||||
|
|
||||||
CCDEP=gcc
|
|
||||||
CC=gcc
|
|
||||||
CFLAGS=-g -Wall -DIPv4 -DLWIP_DEBUG -pedantic
|
|
||||||
LDFLAGS=-lpcap
|
|
||||||
LWIPARCH=unix
|
|
||||||
ARFLAGS=rs
|
|
||||||
LWIPDIR=../../src
|
|
||||||
|
|
||||||
CFLAGS:=$(CFLAGS) \
|
|
||||||
-I$(LWIPDIR)/include -I$(LWIPDIR)/arch/$(LWIPARCH)/include -I$(LWIPDIR)/include/ipv4 \
|
|
||||||
-Iapps -I.
|
|
||||||
|
|
||||||
# COREFILES, CORE4FILES: The minimum set of files needed for lwIP.
|
|
||||||
COREFILES=$(LWIPDIR)/core/mem.c $(LWIPDIR)/core/memp.c $(LWIPDIR)/core/netif.c \
|
|
||||||
$(LWIPDIR)/core/pbuf.c $(LWIPDIR)/core/stats.c $(LWIPDIR)/core/sys.c \
|
|
||||||
$(LWIPDIR)/core/tcp.c $(LWIPDIR)/core/tcp_in.c \
|
|
||||||
$(LWIPDIR)/core/tcp_out.c $(LWIPDIR)/core/udp.c
|
|
||||||
CORE4FILES=$(wildcard $(LWIPDIR)/core/ipv4/*.c) $(LWIPDIR)/core/inet.c
|
|
||||||
|
|
||||||
|
|
||||||
# APIFILES: The files which implement the sequential and socket APIs.
|
|
||||||
APIFILES=$(LWIPDIR)/api/api_lib.c $(LWIPDIR)/api/api_msg.c $(LWIPDIR)/api/tcpip.c \
|
|
||||||
$(LWIPDIR)/api/err.c $(LWIPDIR)/api/sockets.c
|
|
||||||
|
|
||||||
# NETIFFILES: Files implementing various generic network interface functions.'
|
|
||||||
NETIFFILES=$(LWIPDIR)/netif/loopif.c \
|
|
||||||
$(LWIPDIR)/netif/etharp.c $(LWIPDIR)/netif/slipif.c
|
|
||||||
|
|
||||||
# ARCHFILES: Archiecture specific files.
|
|
||||||
ARCHFILES=$(wildcard $(LWIPDIR)/arch/$(LWIPARCH)/*.c $(LWIPDIR)/arch/$(LWIPARCH)/netif/*.c)
|
|
||||||
|
|
||||||
# APPFILES: Applications.
|
|
||||||
APPFILES=apps/fs.c apps/httpd.c \
|
|
||||||
apps/udpecho.c apps/tcpecho.c \
|
|
||||||
apps/shell.c
|
|
||||||
|
|
||||||
# LWIPFILES: All the above.
|
|
||||||
LWIPFILES=$(COREFILES) $(CORE4FILES) $(APIFILES) $(NETIFFILES) $(ARCHFILES)
|
|
||||||
LWIPFILESW=$(wildcard $(LWIPFILES))
|
|
||||||
LWIPOBJS=$(notdir $(LWIPFILESW:.c=.o))
|
|
||||||
|
|
||||||
LWIPLIB=liblwip4.a
|
|
||||||
APPLIB=liblwipapps.a
|
|
||||||
APPOBJS=$(notdir $(APPFILES:.c=.o))
|
|
||||||
|
|
||||||
%.o:
|
|
||||||
$(CC) $(CFLAGS) -c $(<:.o=.c)
|
|
||||||
|
|
||||||
all ipv4 compile: simhost
|
|
||||||
.PHONY: all
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f *.o $(LWIPLIB) $(APPLIB) simhost simnode simrouter *.s .depend* *.core core
|
|
||||||
|
|
||||||
depend dep: .depend
|
|
||||||
|
|
||||||
include .depend
|
|
||||||
|
|
||||||
$(APPLIB): $(APPOBJS)
|
|
||||||
$(AR) $(ARFLAGS) $(APPLIB) $?
|
|
||||||
|
|
||||||
$(LWIPLIB): $(LWIPOBJS)
|
|
||||||
$(AR) $(ARFLAGS) $(LWIPLIB) $?
|
|
||||||
|
|
||||||
.depend: simhost.c simnode.c simrouter.c $(LWIPFILES) $(APPFILES)
|
|
||||||
$(CCDEP) $(CFLAGS) -MM $^ > .depend || rm -f .depend
|
|
||||||
|
|
||||||
simhost: .depend $(LWIPLIB) $(APPLIB) simhost.o $(APPFILES)
|
|
||||||
$(CC) $(CFLAGS) $(LDFLAGS) -pthread -o simhost simhost.o $(APPLIB) $(LWIPLIB)
|
|
||||||
|
|
||||||
simrouter: .depend $(LWIPLIB) $(APPLIB) simrouter.o
|
|
||||||
$(CC) $(CFLAGS) $(LDFLAGS) -pthread -o simrouter simrouter.o $(APPLIB) $(LWIPLIB)
|
|
||||||
|
|
||||||
simnode: .depend $(LWIPLIB) $(APPLIB) simnode.o
|
|
||||||
$(CC) $(CFLAGS) $(LDFLAGS) -pthread -o simnode simnode.o $(APPLIB) $(LWIPLIB)
|
|
||||||
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
This directory contains an example of how a project using lwIP might
|
|
||||||
look. It is also the development platform of lwIP, since it can be run
|
|
||||||
as a user process under FreeBSD or Linux. There are also a number of
|
|
||||||
example applications (including a simple web server) in the apps/
|
|
||||||
directory.
|
|
||||||
|
|
||||||
Some short instructions on how to build and run lwIP on a FreeBSD or
|
|
||||||
Linux host. For FreeBSD, the tap interface must be enabled in the
|
|
||||||
kernel configuration and the kernel must be recompiled. The tap
|
|
||||||
interface is enabled by adding the line "pseudo-device tap" in the
|
|
||||||
kernel configuration. See Chapter 9 in the FreeBSD handbook for
|
|
||||||
instructions on how to build a custom FreeBSD kernel.
|
|
||||||
|
|
||||||
* Compile the code. This must be done by using GNU Make. Under
|
|
||||||
FreeBSD, GNU Make can be found in the ports collection under
|
|
||||||
/usr/ports/devel/gmake (type "make install distclean" to
|
|
||||||
install). Under Linux, GNU Make is the default "make".
|
|
||||||
|
|
||||||
> gmake (FreeBSD)
|
|
||||||
|
|
||||||
> make (Linux)
|
|
||||||
|
|
||||||
* The compilation process produces the executable file "simhost". To
|
|
||||||
run this, you have to be root.
|
|
||||||
|
|
||||||
> su (Type password for the root account)
|
|
||||||
# ./simhost
|
|
||||||
|
|
||||||
* The lwIP TCP/IP stack is now running with IP address
|
|
||||||
192.168.0.2. Some things that you can try:
|
|
||||||
|
|
||||||
To see the packets that are going to and from the lwIP stack, run
|
|
||||||
tcpdump:
|
|
||||||
|
|
||||||
# tcpdump -l -n -i tap0
|
|
||||||
|
|
||||||
You can ping lwIP:
|
|
||||||
|
|
||||||
> ping 192.168.0.2
|
|
||||||
|
|
||||||
For a telnet shell, run:
|
|
||||||
|
|
||||||
> telnet 192.168.0.2
|
|
||||||
|
|
||||||
Finally, "simhost" also includes a simple web server; the URL is
|
|
||||||
of course http://192.168.0.2/.
|
|
||||||
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#include "lwip/def.h"
|
|
||||||
#include "fs.h"
|
|
||||||
#include "fsdata.h"
|
|
||||||
#include "fsdata.c"
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
int
|
|
||||||
fs_open(char *name, struct fs_file *file)
|
|
||||||
{
|
|
||||||
struct fsdata_file_noconst *f;
|
|
||||||
|
|
||||||
for(f = (struct fsdata_file_noconst *)FS_ROOT;
|
|
||||||
f != NULL;
|
|
||||||
f = (struct fsdata_file_noconst *)f->next) {
|
|
||||||
if(!strcmp(name, (char *)f->name)) {
|
|
||||||
file->data = (char *)f->data;
|
|
||||||
file->len = f->len;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __FS_H__
|
|
||||||
#define __FS_H__
|
|
||||||
|
|
||||||
struct fs_file {
|
|
||||||
char *data;
|
|
||||||
int len;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* file must be allocated by caller and will be filled in
|
|
||||||
by the function. */
|
|
||||||
int fs_open(char *name, struct fs_file *file);
|
|
||||||
|
|
||||||
#endif /* __FS_H__ */
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
<html>
|
|
||||||
<head><title>lwIP - A Lightweight TCP/IP Stack</title></head>
|
|
||||||
<body bgcolor="white" text="black">
|
|
||||||
|
|
||||||
<table width="100%">
|
|
||||||
<tr valign="top"><td width="80">
|
|
||||||
<a href="http://www.sics.se/"><img src="img/sics.gif"
|
|
||||||
border="0" alt="SICS logo" title="SICS logo"></a>
|
|
||||||
</td><td width="500">
|
|
||||||
<h1>lwIP - A Lightweight TCP/IP Stack</h1>
|
|
||||||
<h2>404 - Page not found</h2>
|
|
||||||
<p>
|
|
||||||
Sorry, the page you are requesting was not found on this
|
|
||||||
server.
|
|
||||||
</p>
|
|
||||||
</td><td>
|
|
||||||
|
|
||||||
</td></tr>
|
|
||||||
</table>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 724 B |
@@ -1,44 +0,0 @@
|
|||||||
<html>
|
|
||||||
<head><title>lwIP - A Lightweight TCP/IP Stack</title></head>
|
|
||||||
<body bgcolor="white" text="black">
|
|
||||||
|
|
||||||
<table width="100%">
|
|
||||||
<tr valign="top"><td width="80">
|
|
||||||
<a href="http://www.sics.se/"><img src="img/sics.gif"
|
|
||||||
border="0" alt="SICS logo" title="SICS logo"></a>
|
|
||||||
</td><td width="500">
|
|
||||||
<h1>lwIP - A Lightweight TCP/IP Stack</h1>
|
|
||||||
<p>
|
|
||||||
The web page you are watching was served by a simple web
|
|
||||||
server running on top of the lightweight TCP/IP stack <a
|
|
||||||
href="http://www.sics.se/~adam/lwip/">lwIP</a>.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
lwIP is an open source implementation of the TCP/IP
|
|
||||||
protocol suite that was originally written by Adam Dunkels
|
|
||||||
of the Swedish Institute of Computer Science but now is
|
|
||||||
being actively developed by a team of developers
|
|
||||||
distributed world-wide. Since it's release, lwIP has
|
|
||||||
spurred a lot of interest and has been ported to several
|
|
||||||
platforms and operating systems. lwIP can be used either
|
|
||||||
with or without an underlying OS.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
The focus of the lwIP TCP/IP implementation is to reduce
|
|
||||||
the RAM usage while still having a full scale TCP. This
|
|
||||||
makes lwIP suitable for use in embedded systems with tens
|
|
||||||
of kilobytes of free RAM and room for around 40 kilobytes
|
|
||||||
of code ROM.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
More information about lwIP can be found at the lwIP
|
|
||||||
homepage at <a
|
|
||||||
href="http://www.sics.se/~adam/lwip/">http://www.sics.se/~adam/lwip/</a>.
|
|
||||||
</p>
|
|
||||||
</td><td>
|
|
||||||
|
|
||||||
</td></tr>
|
|
||||||
</table>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
||||||
@@ -1,334 +0,0 @@
|
|||||||
static const unsigned char data_img_sics_gif[] = {
|
|
||||||
/* /img/sics.gif */
|
|
||||||
0x2f, 0x69, 0x6d, 0x67, 0x2f, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x67, 0x69, 0x66, 0,
|
|
||||||
0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x32,
|
|
||||||
0x30, 0x30, 0x20, 0x4f, 0x4b, 0xd, 0xa, 0x53, 0x65, 0x72,
|
|
||||||
0x76, 0x65, 0x72, 0x3a, 0x20, 0x6c, 0x77, 0x49, 0x50, 0x2f,
|
|
||||||
0x70, 0x72, 0x65, 0x2d, 0x30, 0x2e, 0x36, 0x20, 0x28, 0x68,
|
|
||||||
0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e,
|
|
||||||
0x73, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x2f, 0x7e, 0x61,
|
|
||||||
0x64, 0x61, 0x6d, 0x2f, 0x6c, 0x77, 0x69, 0x70, 0x2f, 0x29,
|
|
||||||
0xd, 0xa, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d,
|
|
||||||
0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x69, 0x6d, 0x61, 0x67,
|
|
||||||
0x65, 0x2f, 0x67, 0x69, 0x66, 0xd, 0xa, 0xd, 0xa, 0x47,
|
|
||||||
0x49, 0x46, 0x38, 0x39, 0x61, 0x46, 00, 0x22, 00, 0xa5,
|
|
||||||
00, 00, 0xd9, 0x2b, 0x39, 0x6a, 0x6a, 0x6a, 0xbf, 0xbf,
|
|
||||||
0xbf, 0x93, 0x93, 0x93, 0xf, 0xf, 0xf, 0xb0, 0xb0, 0xb0,
|
|
||||||
0xa6, 0xa6, 0xa6, 0x80, 0x80, 0x80, 0x76, 0x76, 0x76, 0x1e,
|
|
||||||
0x1e, 0x1e, 0x9d, 0x9d, 0x9d, 0x2e, 0x2e, 0x2e, 0x49, 0x49,
|
|
||||||
0x49, 0x54, 0x54, 0x54, 0x8a, 0x8a, 0x8a, 0x60, 0x60, 0x60,
|
|
||||||
0xc6, 0xa6, 0x99, 0xbd, 0xb5, 0xb2, 0xc2, 0xab, 0xa1, 0xd9,
|
|
||||||
0x41, 0x40, 0xd5, 0x67, 0x55, 0xc0, 0xb0, 0xaa, 0xd5, 0x5e,
|
|
||||||
0x4e, 0xd6, 0x50, 0x45, 0xcc, 0x93, 0x7d, 0xc8, 0xa1, 0x90,
|
|
||||||
0xce, 0x8b, 0x76, 0xd2, 0x7b, 0x65, 0xd1, 0x84, 0x6d, 0xc9,
|
|
||||||
0x99, 0x86, 0x3a, 0x3a, 0x3a, 00, 00, 00, 0xb8, 0xb8,
|
|
||||||
0xb8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0x2c, 00, 00, 00, 00, 0x46,
|
|
||||||
00, 0x22, 00, 00, 0x6, 0xfe, 0x40, 0x90, 0x70, 0x48,
|
|
||||||
0x2c, 0x1a, 0x8f, 0xc8, 0xa4, 0x72, 0xc9, 0x6c, 0x3a, 0x9f,
|
|
||||||
0xd0, 0xa8, 0x74, 0x4a, 0xad, 0x5a, 0xaf, 0xd8, 0xac, 0x76,
|
|
||||||
0xa9, 0x40, 0x4, 0xbe, 0x83, 0xe2, 0x60, 0x3c, 0x50, 0x20,
|
|
||||||
0xd, 0x8e, 0x6f, 00, 0x31, 0x28, 0x1c, 0xd, 0x7, 0xb5,
|
|
||||||
0xc3, 0x60, 0x75, 0x24, 0x3e, 0xf8, 0xfc, 0x87, 0x11, 0x6,
|
|
||||||
0xe9, 0x3d, 0x46, 0x7, 0xb, 0x7a, 0x7a, 0x7c, 0x43, 0x6,
|
|
||||||
0x1e, 0x84, 0x78, 0xb, 0x7, 0x6e, 0x51, 0x1, 0x8a, 0x84,
|
|
||||||
0x8, 0x7e, 0x79, 0x80, 0x87, 0x89, 0x91, 0x7a, 0x93, 0xa,
|
|
||||||
0x4, 0x99, 0x78, 0x96, 0x4f, 0x3, 0x9e, 0x79, 0x1, 0x94,
|
|
||||||
0x9f, 0x43, 0x9c, 0xa3, 0xa4, 0x5, 0x77, 0xa3, 0xa0, 0x4e,
|
|
||||||
0x98, 0x79, 0xb, 0x1e, 0x83, 0xa4, 0xa6, 0x1f, 0x96, 0x5,
|
|
||||||
0x9d, 0xaa, 0x78, 0x1, 0x7, 0x84, 0x4, 0x1e, 0x1e, 0xbb,
|
|
||||||
0xb8, 0x51, 0x84, 0xe, 0x43, 0x5, 0x7, 0x77, 0xa5, 0x7f,
|
|
||||||
0x42, 0xb1, 0xb2, 0x1, 0x63, 0x8, 0xd, 0xbb, 0x1, 0xc,
|
|
||||||
0x7a, 0xd, 0x44, 0xe, 0xd8, 0xaf, 0x4c, 0x5, 0x7a, 0x4,
|
|
||||||
0x47, 0x7, 0x7, 0xb7, 0x80, 0xa2, 0xe1, 0x7d, 0x44, 0x5,
|
|
||||||
0x1, 0x4, 0x1, 0xd0, 0xea, 0x87, 0x93, 0x4f, 0xe0, 0x9a,
|
|
||||||
0x49, 0xce, 0xd8, 0x79, 0x4, 0x66, 0x20, 0x15, 0x10, 0x10,
|
|
||||||
0x11, 0x92, 0x29, 0x80, 0xb6, 0xc0, 0x91, 0x15, 0x45, 0x1e,
|
|
||||||
0x90, 0x19, 0x71, 0x46, 0xa8, 0x5c, 0x4, 0xe, 00, 0x22,
|
|
||||||
0x4e, 0xe8, 0x40, 0x24, 0x9f, 0x3e, 0x4, 0x6, 0xa7, 0x58,
|
|
||||||
0xd4, 0x93, 0xa0, 0x1c, 0x91, 0x3f, 0xe8, 0xf0, 0x88, 0x3,
|
|
||||||
0xb1, 0x21, 0xa2, 0x49, 00, 0x19, 0x86, 0xfc, 0x52, 0x44,
|
|
||||||
0xe0, 0x1, 0x9d, 0x29, 0x21, 0x15, 0x25, 0x50, 0xf7, 0x67,
|
|
||||||
0x25, 0x1e, 0x6, 0xfd, 0x4e, 0x9a, 0xb4, 0x90, 0xac, 0x15,
|
|
||||||
0xfa, 0xcb, 0x52, 0x53, 0x1e, 0x8c, 0xf2, 0xf8, 0x7, 0x92,
|
|
||||||
0x2d, 0x8, 0x3a, 0x4d, 0x12, 0x49, 0x95, 0x49, 0xdb, 0x14,
|
|
||||||
0x4, 0xc4, 0x14, 0x85, 0x29, 0xaa, 0xe7, 0x1, 0x8, 0xa4,
|
|
||||||
0x49, 0x1, 0x14, 0x51, 0xe0, 0x53, 0x91, 0xd5, 0x29, 0x6,
|
|
||||||
0x1a, 0x64, 0x2, 0xf4, 0xc7, 0x81, 0x9e, 0x5, 0x20, 0x22,
|
|
||||||
0x64, 0xa5, 0x30, 0xae, 0xab, 0x9e, 0x97, 0x53, 0xd8, 0xb9,
|
|
||||||
0xfd, 0x50, 0xef, 0x93, 0x2, 0x42, 0x74, 0x34, 0xe8, 0x9c,
|
|
||||||
0x20, 0x21, 0xc9, 0x1, 0x68, 0x78, 0xe6, 0x55, 0x29, 0x20,
|
|
||||||
0x56, 0x4f, 0x4c, 0x40, 0x51, 0x71, 0x82, 0xc0, 0x70, 0x21,
|
|
||||||
0x22, 0x85, 0xbe, 0x4b, 0x1c, 0x44, 0x5, 0xea, 0xa4, 0x1,
|
|
||||||
0xbf, 0x22, 0xb5, 0xf0, 0x1c, 0x6, 0x51, 0x38, 0x8f, 0xe0,
|
|
||||||
0x22, 0xec, 0x18, 0xac, 0x39, 0x22, 0xd4, 0xd6, 0x93, 0x44,
|
|
||||||
0x1, 0x32, 0x82, 0xc8, 0xfc, 0x61, 0xb3, 0x1, 0x45, 0xc,
|
|
||||||
0x2e, 0x83, 0x30, 0xd0, 0xe, 0x17, 0x24, 0xf, 0x70, 0x85,
|
|
||||||
0x94, 0xee, 0x5, 0x5, 0x53, 0x4b, 0x32, 0x1b, 0x3f, 0x98,
|
|
||||||
0xd3, 0x1d, 0x29, 0x81, 0xb0, 0xae, 0x1e, 0x8c, 0x7e, 0x68,
|
|
||||||
0xe0, 0x60, 0x5a, 0x54, 0x8f, 0xb0, 0x78, 0x69, 0x73, 0x6,
|
|
||||||
0xa2, 00, 0x6b, 0x57, 0xca, 0x3d, 0x11, 0x50, 0xbd, 0x4,
|
|
||||||
0x30, 0x4b, 0x3a, 0xd4, 0xab, 0x5f, 0x1f, 0x9b, 0x3d, 0x13,
|
|
||||||
0x74, 0x27, 0x88, 0x3c, 0x25, 0xe0, 0x17, 0xbe, 0x7a, 0x79,
|
|
||||||
0x45, 0xd, 0xc, 0xb0, 0x8b, 0xda, 0x90, 0xca, 0x80, 0x6,
|
|
||||||
0x5d, 0x17, 0x60, 0x1c, 0x22, 0x4c, 0xd8, 0x57, 0x22, 0x6,
|
|
||||||
0x20, 00, 0x98, 0x7, 0x8, 0xe4, 0x56, 0x80, 0x80, 0x1c,
|
|
||||||
0xc5, 0xb7, 0xc5, 0x82, 0xc, 0x36, 0xe8, 0xe0, 0x83, 0x10,
|
|
||||||
0x46, 0x28, 0xe1, 0x84, 0x14, 0x56, 0x68, 0xa1, 0x10, 0x41,
|
|
||||||
00, 00, 0x3b, };
|
|
||||||
|
|
||||||
static const unsigned char data_404_html[] = {
|
|
||||||
/* /404.html */
|
|
||||||
0x2f, 0x34, 0x30, 0x34, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0,
|
|
||||||
0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x34,
|
|
||||||
0x30, 0x34, 0x20, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x6e, 0x6f,
|
|
||||||
0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0xd, 0xa, 0x53,
|
|
||||||
0x65, 0x72, 0x76, 0x65, 0x72, 0x3a, 0x20, 0x6c, 0x77, 0x49,
|
|
||||||
0x50, 0x2f, 0x70, 0x72, 0x65, 0x2d, 0x30, 0x2e, 0x36, 0x20,
|
|
||||||
0x28, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77,
|
|
||||||
0x77, 0x2e, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x2f,
|
|
||||||
0x7e, 0x61, 0x64, 0x61, 0x6d, 0x2f, 0x6c, 0x77, 0x69, 0x70,
|
|
||||||
0x2f, 0x29, 0xd, 0xa, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
|
|
||||||
0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65,
|
|
||||||
0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0xd, 0xa, 0xd,
|
|
||||||
0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xa, 0x3c, 0x68,
|
|
||||||
0x65, 0x61, 0x64, 0x3e, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65,
|
|
||||||
0x3e, 0x6c, 0x77, 0x49, 0x50, 0x20, 0x2d, 0x20, 0x41, 0x20,
|
|
||||||
0x4c, 0x69, 0x67, 0x68, 0x74, 0x77, 0x65, 0x69, 0x67, 0x68,
|
|
||||||
0x74, 0x20, 0x54, 0x43, 0x50, 0x2f, 0x49, 0x50, 0x20, 0x53,
|
|
||||||
0x74, 0x61, 0x63, 0x6b, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c,
|
|
||||||
0x65, 0x3e, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0xa,
|
|
||||||
0x3c, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x62, 0x67, 0x63, 0x6f,
|
|
||||||
0x6c, 0x6f, 0x72, 0x3d, 0x22, 0x77, 0x68, 0x69, 0x74, 0x65,
|
|
||||||
0x22, 0x20, 0x74, 0x65, 0x78, 0x74, 0x3d, 0x22, 0x62, 0x6c,
|
|
||||||
0x61, 0x63, 0x6b, 0x22, 0x3e, 0xa, 0xa, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x69,
|
|
||||||
0x64, 0x74, 0x68, 0x3d, 0x22, 0x31, 0x30, 0x30, 0x25, 0x22,
|
|
||||||
0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74,
|
|
||||||
0x72, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22,
|
|
||||||
0x74, 0x6f, 0x70, 0x22, 0x3e, 0x3c, 0x74, 0x64, 0x20, 0x77,
|
|
||||||
0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x38, 0x30, 0x22, 0x3e,
|
|
||||||
0x9, 0x20, 0x20, 0xa, 0x9, 0x20, 0x20, 0x3c, 0x61, 0x20,
|
|
||||||
0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70,
|
|
||||||
0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x73, 0x69, 0x63,
|
|
||||||
0x73, 0x2e, 0x73, 0x65, 0x2f, 0x22, 0x3e, 0x3c, 0x69, 0x6d,
|
|
||||||
0x67, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x69, 0x6d, 0x67,
|
|
||||||
0x2f, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x67, 0x69, 0x66, 0x22,
|
|
||||||
0xa, 0x9, 0x20, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72,
|
|
||||||
0x3d, 0x22, 0x30, 0x22, 0x20, 0x61, 0x6c, 0x74, 0x3d, 0x22,
|
|
||||||
0x53, 0x49, 0x43, 0x53, 0x20, 0x6c, 0x6f, 0x67, 0x6f, 0x22,
|
|
||||||
0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x49,
|
|
||||||
0x43, 0x53, 0x20, 0x6c, 0x6f, 0x67, 0x6f, 0x22, 0x3e, 0x3c,
|
|
||||||
0x2f, 0x61, 0x3e, 0xa, 0x9, 0x3c, 0x2f, 0x74, 0x64, 0x3e,
|
|
||||||
0x3c, 0x74, 0x64, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d,
|
|
||||||
0x22, 0x35, 0x30, 0x30, 0x22, 0x3e, 0x9, 0x20, 0x20, 0xa,
|
|
||||||
0x9, 0x20, 0x20, 0x3c, 0x68, 0x31, 0x3e, 0x6c, 0x77, 0x49,
|
|
||||||
0x50, 0x20, 0x2d, 0x20, 0x41, 0x20, 0x4c, 0x69, 0x67, 0x68,
|
|
||||||
0x74, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x54, 0x43,
|
|
||||||
0x50, 0x2f, 0x49, 0x50, 0x20, 0x53, 0x74, 0x61, 0x63, 0x6b,
|
|
||||||
0x3c, 0x2f, 0x68, 0x31, 0x3e, 0xa, 0x9, 0x20, 0x20, 0x3c,
|
|
||||||
0x68, 0x32, 0x3e, 0x34, 0x30, 0x34, 0x20, 0x2d, 0x20, 0x50,
|
|
||||||
0x61, 0x67, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f,
|
|
||||||
0x75, 0x6e, 0x64, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0xa, 0x9,
|
|
||||||
0x20, 0x20, 0x3c, 0x70, 0x3e, 0xa, 0x9, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x53, 0x6f, 0x72, 0x72, 0x79, 0x2c, 0x20, 0x74, 0x68,
|
|
||||||
0x65, 0x20, 0x70, 0x61, 0x67, 0x65, 0x20, 0x79, 0x6f, 0x75,
|
|
||||||
0x20, 0x61, 0x72, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65,
|
|
||||||
0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x61, 0x73, 0x20,
|
|
||||||
0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20,
|
|
||||||
0x6f, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0xa, 0x9, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e,
|
|
||||||
0x20, 0xa, 0x9, 0x20, 0x20, 0x3c, 0x2f, 0x70, 0x3e, 0xa,
|
|
||||||
0x9, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e,
|
|
||||||
0xa, 0x9, 0x20, 0x20, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b,
|
|
||||||
0xa, 0x9, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x2f, 0x74,
|
|
||||||
0x72, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c,
|
|
||||||
0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0xa, 0x3c, 0x2f,
|
|
||||||
0x62, 0x6f, 0x64, 0x79, 0x3e, 0xa, 0x3c, 0x2f, 0x68, 0x74,
|
|
||||||
0x6d, 0x6c, 0x3e, 0xa, };
|
|
||||||
|
|
||||||
static const unsigned char data_index_html[] = {
|
|
||||||
/* /index.html */
|
|
||||||
0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0,
|
|
||||||
0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x32,
|
|
||||||
0x30, 0x30, 0x20, 0x4f, 0x4b, 0xd, 0xa, 0x53, 0x65, 0x72,
|
|
||||||
0x76, 0x65, 0x72, 0x3a, 0x20, 0x6c, 0x77, 0x49, 0x50, 0x2f,
|
|
||||||
0x70, 0x72, 0x65, 0x2d, 0x30, 0x2e, 0x36, 0x20, 0x28, 0x68,
|
|
||||||
0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e,
|
|
||||||
0x73, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x2f, 0x7e, 0x61,
|
|
||||||
0x64, 0x61, 0x6d, 0x2f, 0x6c, 0x77, 0x69, 0x70, 0x2f, 0x29,
|
|
||||||
0xd, 0xa, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d,
|
|
||||||
0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74,
|
|
||||||
0x2f, 0x68, 0x74, 0x6d, 0x6c, 0xd, 0xa, 0xd, 0xa, 0x3c,
|
|
||||||
0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xa, 0x3c, 0x68, 0x65, 0x61,
|
|
||||||
0x64, 0x3e, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x6c,
|
|
||||||
0x77, 0x49, 0x50, 0x20, 0x2d, 0x20, 0x41, 0x20, 0x4c, 0x69,
|
|
||||||
0x67, 0x68, 0x74, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20,
|
|
||||||
0x54, 0x43, 0x50, 0x2f, 0x49, 0x50, 0x20, 0x53, 0x74, 0x61,
|
|
||||||
0x63, 0x6b, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e,
|
|
||||||
0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0xa, 0x3c, 0x62,
|
|
||||||
0x6f, 0x64, 0x79, 0x20, 0x62, 0x67, 0x63, 0x6f, 0x6c, 0x6f,
|
|
||||||
0x72, 0x3d, 0x22, 0x77, 0x68, 0x69, 0x74, 0x65, 0x22, 0x20,
|
|
||||||
0x74, 0x65, 0x78, 0x74, 0x3d, 0x22, 0x62, 0x6c, 0x61, 0x63,
|
|
||||||
0x6b, 0x22, 0x3e, 0xa, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c,
|
|
||||||
0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x69, 0x64, 0x74,
|
|
||||||
0x68, 0x3d, 0x22, 0x31, 0x30, 0x30, 0x25, 0x22, 0x3e, 0xa,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x72, 0x20,
|
|
||||||
0x76, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x74, 0x6f,
|
|
||||||
0x70, 0x22, 0x3e, 0x3c, 0x74, 0x64, 0x20, 0x77, 0x69, 0x64,
|
|
||||||
0x74, 0x68, 0x3d, 0x22, 0x38, 0x30, 0x22, 0x3e, 0x9, 0x20,
|
|
||||||
0x20, 0xa, 0x9, 0x20, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72,
|
|
||||||
0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
|
|
||||||
0x2f, 0x77, 0x77, 0x77, 0x2e, 0x73, 0x69, 0x63, 0x73, 0x2e,
|
|
||||||
0x73, 0x65, 0x2f, 0x22, 0x3e, 0x3c, 0x69, 0x6d, 0x67, 0x20,
|
|
||||||
0x73, 0x72, 0x63, 0x3d, 0x22, 0x69, 0x6d, 0x67, 0x2f, 0x73,
|
|
||||||
0x69, 0x63, 0x73, 0x2e, 0x67, 0x69, 0x66, 0x22, 0xa, 0x9,
|
|
||||||
0x20, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3d, 0x22,
|
|
||||||
0x30, 0x22, 0x20, 0x61, 0x6c, 0x74, 0x3d, 0x22, 0x53, 0x49,
|
|
||||||
0x43, 0x53, 0x20, 0x6c, 0x6f, 0x67, 0x6f, 0x22, 0x20, 0x74,
|
|
||||||
0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x53, 0x49, 0x43, 0x53,
|
|
||||||
0x20, 0x6c, 0x6f, 0x67, 0x6f, 0x22, 0x3e, 0x3c, 0x2f, 0x61,
|
|
||||||
0x3e, 0xa, 0x9, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74,
|
|
||||||
0x64, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x35,
|
|
||||||
0x30, 0x30, 0x22, 0x3e, 0x9, 0x20, 0x20, 0xa, 0x9, 0x20,
|
|
||||||
0x20, 0x3c, 0x68, 0x31, 0x3e, 0x6c, 0x77, 0x49, 0x50, 0x20,
|
|
||||||
0x2d, 0x20, 0x41, 0x20, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x77,
|
|
||||||
0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x54, 0x43, 0x50, 0x2f,
|
|
||||||
0x49, 0x50, 0x20, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x3c, 0x2f,
|
|
||||||
0x68, 0x31, 0x3e, 0xa, 0x9, 0x20, 0x20, 0x3c, 0x70, 0x3e,
|
|
||||||
0xa, 0x9, 0x20, 0x20, 0x20, 0x20, 0x54, 0x68, 0x65, 0x20,
|
|
||||||
0x77, 0x65, 0x62, 0x20, 0x70, 0x61, 0x67, 0x65, 0x20, 0x79,
|
|
||||||
0x6f, 0x75, 0x20, 0x61, 0x72, 0x65, 0x20, 0x77, 0x61, 0x74,
|
|
||||||
0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x61, 0x73, 0x20,
|
|
||||||
0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20,
|
|
||||||
0x61, 0x20, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x77,
|
|
||||||
0x65, 0x62, 0xa, 0x9, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65,
|
|
||||||
0x72, 0x76, 0x65, 0x72, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69,
|
|
||||||
0x6e, 0x67, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x70, 0x20,
|
|
||||||
0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x67,
|
|
||||||
0x68, 0x74, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x54,
|
|
||||||
0x43, 0x50, 0x2f, 0x49, 0x50, 0x20, 0x73, 0x74, 0x61, 0x63,
|
|
||||||
0x6b, 0x20, 0x3c, 0x61, 0xa, 0x9, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70,
|
|
||||||
0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x73, 0x69, 0x63,
|
|
||||||
0x73, 0x2e, 0x73, 0x65, 0x2f, 0x7e, 0x61, 0x64, 0x61, 0x6d,
|
|
||||||
0x2f, 0x6c, 0x77, 0x69, 0x70, 0x2f, 0x22, 0x3e, 0x6c, 0x77,
|
|
||||||
0x49, 0x50, 0x3c, 0x2f, 0x61, 0x3e, 0x2e, 0xa, 0x9, 0x20,
|
|
||||||
0x20, 0x3c, 0x2f, 0x70, 0x3e, 0xa, 0x9, 0x20, 0x20, 0x3c,
|
|
||||||
0x70, 0x3e, 0xa, 0x9, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x77,
|
|
||||||
0x49, 0x50, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x6f,
|
|
||||||
0x70, 0x65, 0x6e, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
|
|
||||||
0x20, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74,
|
|
||||||
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74,
|
|
||||||
0x68, 0x65, 0x20, 0x54, 0x43, 0x50, 0x2f, 0x49, 0x50, 0xa,
|
|
||||||
0x9, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x6f,
|
|
||||||
0x63, 0x6f, 0x6c, 0x20, 0x73, 0x75, 0x69, 0x74, 0x65, 0x20,
|
|
||||||
0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x61, 0x73, 0x20, 0x6f,
|
|
||||||
0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x20,
|
|
||||||
0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x20, 0x62, 0x79,
|
|
||||||
0x20, 0x41, 0x64, 0x61, 0x6d, 0x20, 0x44, 0x75, 0x6e, 0x6b,
|
|
||||||
0x65, 0x6c, 0x73, 0xa, 0x9, 0x20, 0x20, 0x20, 0x20, 0x6f,
|
|
||||||
0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x77, 0x65, 0x64,
|
|
||||||
0x69, 0x73, 0x68, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x69, 0x74,
|
|
||||||
0x75, 0x74, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x43, 0x6f, 0x6d,
|
|
||||||
0x70, 0x75, 0x74, 0x65, 0x72, 0x20, 0x53, 0x63, 0x69, 0x65,
|
|
||||||
0x6e, 0x63, 0x65, 0x20, 0x62, 0x75, 0x74, 0x20, 0x6e, 0x6f,
|
|
||||||
0x77, 0x20, 0x69, 0x73, 0xa, 0x9, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x62, 0x65, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x63, 0x74, 0x69,
|
|
||||||
0x76, 0x65, 0x6c, 0x79, 0x20, 0x64, 0x65, 0x76, 0x65, 0x6c,
|
|
||||||
0x6f, 0x70, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x20,
|
|
||||||
0x74, 0x65, 0x61, 0x6d, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x65,
|
|
||||||
0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x73, 0xa, 0x9,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69,
|
|
||||||
0x62, 0x75, 0x74, 0x65, 0x64, 0x20, 0x77, 0x6f, 0x72, 0x6c,
|
|
||||||
0x64, 0x2d, 0x77, 0x69, 0x64, 0x65, 0x2e, 0x20, 0x53, 0x69,
|
|
||||||
0x6e, 0x63, 0x65, 0x20, 0x69, 0x74, 0x27, 0x73, 0x20, 0x72,
|
|
||||||
0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c, 0x20, 0x6c, 0x77,
|
|
||||||
0x49, 0x50, 0x20, 0x68, 0x61, 0x73, 0xa, 0x9, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x73, 0x70, 0x75, 0x72, 0x72, 0x65, 0x64, 0x20,
|
|
||||||
0x61, 0x20, 0x6c, 0x6f, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x69,
|
|
||||||
0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x20, 0x61, 0x6e,
|
|
||||||
0x64, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e,
|
|
||||||
0x20, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f,
|
|
||||||
0x20, 0x73, 0x65, 0x76, 0x65, 0x72, 0x61, 0x6c, 0xa, 0x9,
|
|
||||||
0x20, 0x20, 0x20, 0x20, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f,
|
|
||||||
0x72, 0x6d, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x70,
|
|
||||||
0x65, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x79,
|
|
||||||
0x73, 0x74, 0x65, 0x6d, 0x73, 0x2e, 0x20, 0x6c, 0x77, 0x49,
|
|
||||||
0x50, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x75,
|
|
||||||
0x73, 0x65, 0x64, 0x20, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72,
|
|
||||||
0xa, 0x9, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x74, 0x68,
|
|
||||||
0x20, 0x6f, 0x72, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75,
|
|
||||||
0x74, 0x20, 0x61, 0x6e, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72,
|
|
||||||
0x6c, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x4f, 0x53, 0x2e, 0xa,
|
|
||||||
0x9, 0x20, 0x20, 0x3c, 0x2f, 0x70, 0x3e, 0xa, 0x9, 0x20,
|
|
||||||
0x20, 0x3c, 0x70, 0x3e, 0xa, 0x9, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x54, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x20,
|
|
||||||
0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x77, 0x49,
|
|
||||||
0x50, 0x20, 0x54, 0x43, 0x50, 0x2f, 0x49, 0x50, 0x20, 0x69,
|
|
||||||
0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74,
|
|
||||||
0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x74, 0x6f, 0x20,
|
|
||||||
0x72, 0x65, 0x64, 0x75, 0x63, 0x65, 0xa, 0x9, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x74, 0x68, 0x65, 0x20, 0x52, 0x41, 0x4d, 0x20,
|
|
||||||
0x75, 0x73, 0x61, 0x67, 0x65, 0x20, 0x77, 0x68, 0x69, 0x6c,
|
|
||||||
0x65, 0x20, 0x73, 0x74, 0x69, 0x6c, 0x6c, 0x20, 0x68, 0x61,
|
|
||||||
0x76, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x66, 0x75, 0x6c,
|
|
||||||
0x6c, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x20, 0x54, 0x43,
|
|
||||||
0x50, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0xa, 0x9, 0x20,
|
|
||||||
0x20, 0x20, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x73, 0x20, 0x6c,
|
|
||||||
0x77, 0x49, 0x50, 0x20, 0x73, 0x75, 0x69, 0x74, 0x61, 0x62,
|
|
||||||
0x6c, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x75, 0x73, 0x65,
|
|
||||||
0x20, 0x69, 0x6e, 0x20, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64,
|
|
||||||
0x65, 0x64, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73,
|
|
||||||
0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x65, 0x6e, 0x73,
|
|
||||||
0xa, 0x9, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x66, 0x20, 0x6b,
|
|
||||||
0x69, 0x6c, 0x6f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x6f,
|
|
||||||
0x66, 0x20, 0x66, 0x72, 0x65, 0x65, 0x20, 0x52, 0x41, 0x4d,
|
|
||||||
0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x6f, 0x6f, 0x6d, 0x20,
|
|
||||||
0x66, 0x6f, 0x72, 0x20, 0x61, 0x72, 0x6f, 0x75, 0x6e, 0x64,
|
|
||||||
0x20, 0x34, 0x30, 0x20, 0x6b, 0x69, 0x6c, 0x6f, 0x62, 0x79,
|
|
||||||
0x74, 0x65, 0x73, 0xa, 0x9, 0x20, 0x20, 0x20, 0x20, 0x6f,
|
|
||||||
0x66, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x52, 0x4f, 0x4d,
|
|
||||||
0x2e, 0xa, 0x9, 0x20, 0x20, 0x3c, 0x2f, 0x70, 0x3e, 0xa,
|
|
||||||
0x9, 0x20, 0x20, 0x3c, 0x70, 0x3e, 0xa, 0x9, 0x20, 0x20,
|
|
||||||
0x20, 0x20, 0x4d, 0x6f, 0x72, 0x65, 0x20, 0x69, 0x6e, 0x66,
|
|
||||||
0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61,
|
|
||||||
0x62, 0x6f, 0x75, 0x74, 0x20, 0x6c, 0x77, 0x49, 0x50, 0x20,
|
|
||||||
0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x66, 0x6f, 0x75,
|
|
||||||
0x6e, 0x64, 0x20, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20,
|
|
||||||
0x6c, 0x77, 0x49, 0x50, 0xa, 0x9, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x68, 0x6f, 0x6d, 0x65, 0x70, 0x61, 0x67, 0x65, 0x20, 0x61,
|
|
||||||
0x74, 0x20, 0x3c, 0x61, 0xa, 0x9, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70,
|
|
||||||
0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x73, 0x69, 0x63,
|
|
||||||
0x73, 0x2e, 0x73, 0x65, 0x2f, 0x7e, 0x61, 0x64, 0x61, 0x6d,
|
|
||||||
0x2f, 0x6c, 0x77, 0x69, 0x70, 0x2f, 0x22, 0x3e, 0x68, 0x74,
|
|
||||||
0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x73,
|
|
||||||
0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x2f, 0x7e, 0x61, 0x64,
|
|
||||||
0x61, 0x6d, 0x2f, 0x6c, 0x77, 0x69, 0x70, 0x2f, 0x3c, 0x2f,
|
|
||||||
0x61, 0x3e, 0x2e, 0xa, 0x9, 0x20, 0x20, 0x3c, 0x2f, 0x70,
|
|
||||||
0x3e, 0xa, 0x9, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74,
|
|
||||||
0x64, 0x3e, 0xa, 0x9, 0x20, 0x20, 0x26, 0x6e, 0x62, 0x73,
|
|
||||||
0x70, 0x3b, 0xa, 0x9, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c,
|
|
||||||
0x2f, 0x74, 0x72, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20,
|
|
||||||
0x20, 0x3c, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0xa,
|
|
||||||
0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0xa, 0x3c, 0x2f,
|
|
||||||
0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xa, 0xa, };
|
|
||||||
|
|
||||||
const struct fsdata_file file_img_sics_gif[] = {{NULL, data_img_sics_gif, data_img_sics_gif + 14, sizeof(data_img_sics_gif) - 14}};
|
|
||||||
|
|
||||||
const struct fsdata_file file_404_html[] = {{file_img_sics_gif, data_404_html, data_404_html + 10, sizeof(data_404_html) - 10}};
|
|
||||||
|
|
||||||
const struct fsdata_file file_index_html[] = {{file_404_html, data_index_html, data_index_html + 12, sizeof(data_index_html) - 12}};
|
|
||||||
|
|
||||||
#define FS_ROOT file_index_html
|
|
||||||
|
|
||||||
#define FS_NUMFILES 3
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __FSDATA_H__
|
|
||||||
#define __FSDATA_H__
|
|
||||||
|
|
||||||
struct fsdata_file {
|
|
||||||
const struct fsdata_file *next;
|
|
||||||
const unsigned char *name;
|
|
||||||
const unsigned char *data;
|
|
||||||
const int len;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct fsdata_file_noconst {
|
|
||||||
struct fsdata_file *next;
|
|
||||||
unsigned char *name;
|
|
||||||
unsigned char *data;
|
|
||||||
int len;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* __FSDATA_H__ */
|
|
||||||
@@ -1,244 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "lwip/debug.h"
|
|
||||||
|
|
||||||
#include "lwip/stats.h"
|
|
||||||
|
|
||||||
#include "httpd.h"
|
|
||||||
|
|
||||||
#include "lwip/tcp.h"
|
|
||||||
|
|
||||||
#include "fs.h"
|
|
||||||
|
|
||||||
struct http_state {
|
|
||||||
char *file;
|
|
||||||
u32_t left;
|
|
||||||
u8_t retries;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static void
|
|
||||||
conn_err(void *arg, err_t err)
|
|
||||||
{
|
|
||||||
struct http_state *hs;
|
|
||||||
|
|
||||||
hs = arg;
|
|
||||||
mem_free(hs);
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static void
|
|
||||||
close_conn(struct tcp_pcb *pcb, struct http_state *hs)
|
|
||||||
{
|
|
||||||
tcp_arg(pcb, NULL);
|
|
||||||
tcp_sent(pcb, NULL);
|
|
||||||
tcp_recv(pcb, NULL);
|
|
||||||
mem_free(hs);
|
|
||||||
tcp_close(pcb);
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static void
|
|
||||||
send_data(struct tcp_pcb *pcb, struct http_state *hs)
|
|
||||||
{
|
|
||||||
err_t err;
|
|
||||||
u16_t len;
|
|
||||||
|
|
||||||
/* We cannot send more data than space avaliable in the send
|
|
||||||
buffer. */
|
|
||||||
if(tcp_sndbuf(pcb) < hs->left) {
|
|
||||||
len = tcp_sndbuf(pcb);
|
|
||||||
} else {
|
|
||||||
len = hs->left;
|
|
||||||
}
|
|
||||||
|
|
||||||
do {
|
|
||||||
err = tcp_write(pcb, hs->file, len, 0);
|
|
||||||
if(err == ERR_MEM) {
|
|
||||||
len /= 2;
|
|
||||||
}
|
|
||||||
} while(err == ERR_MEM && len > 1);
|
|
||||||
|
|
||||||
if(err == ERR_OK) {
|
|
||||||
hs->file += len;
|
|
||||||
hs->left -= len;
|
|
||||||
/* } else {
|
|
||||||
printf("send_data: error %s len %d %d\n", lwip_strerr(err), len, tcp_sndbuf(pcb));*/
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static err_t
|
|
||||||
http_poll(void *arg, struct tcp_pcb *pcb)
|
|
||||||
{
|
|
||||||
struct http_state *hs;
|
|
||||||
|
|
||||||
hs = arg;
|
|
||||||
|
|
||||||
/* printf("Polll\n");*/
|
|
||||||
if(hs == NULL) {
|
|
||||||
/* printf("Null, close\n");*/
|
|
||||||
tcp_abort(pcb);
|
|
||||||
return ERR_ABRT;
|
|
||||||
} else {
|
|
||||||
++hs->retries;
|
|
||||||
if(hs->retries == 4) {
|
|
||||||
tcp_abort(pcb);
|
|
||||||
return ERR_ABRT;
|
|
||||||
}
|
|
||||||
send_data(pcb, hs);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static err_t
|
|
||||||
http_sent(void *arg, struct tcp_pcb *pcb, u16_t len)
|
|
||||||
{
|
|
||||||
struct http_state *hs;
|
|
||||||
|
|
||||||
hs = arg;
|
|
||||||
|
|
||||||
hs->retries = 0;
|
|
||||||
|
|
||||||
if(hs->left > 0) {
|
|
||||||
send_data(pcb, hs);
|
|
||||||
} else {
|
|
||||||
close_conn(pcb, hs);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static err_t
|
|
||||||
http_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
char *data;
|
|
||||||
struct fs_file file;
|
|
||||||
struct http_state *hs;
|
|
||||||
|
|
||||||
hs = arg;
|
|
||||||
|
|
||||||
if(err == ERR_OK && p != NULL) {
|
|
||||||
|
|
||||||
/* Inform TCP that we have taken the data. */
|
|
||||||
tcp_recved(pcb, p->tot_len);
|
|
||||||
|
|
||||||
if(hs->file == NULL) {
|
|
||||||
data = p->payload;
|
|
||||||
|
|
||||||
if(strncmp(data, "GET ", 4) == 0) {
|
|
||||||
for(i = 0; i < 40; i++) {
|
|
||||||
if(((char *)data + 4)[i] == ' ' ||
|
|
||||||
((char *)data + 4)[i] == '\r' ||
|
|
||||||
((char *)data + 4)[i] == '\n') {
|
|
||||||
((char *)data + 4)[i] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(*(char *)(data + 4) == '/' &&
|
|
||||||
*(char *)(data + 5) == 0) {
|
|
||||||
fs_open("/index.html", &file);
|
|
||||||
} else if(!fs_open((char *)data + 4, &file)) {
|
|
||||||
fs_open("/404.html", &file);
|
|
||||||
}
|
|
||||||
hs->file = file.data;
|
|
||||||
hs->left = file.len;
|
|
||||||
/* printf("data %p len %ld\n", hs->file, hs->left);*/
|
|
||||||
|
|
||||||
pbuf_free(p);
|
|
||||||
send_data(pcb, hs);
|
|
||||||
|
|
||||||
/* Tell TCP that we wish be to informed of data that has been
|
|
||||||
successfully sent by a call to the http_sent() function. */
|
|
||||||
tcp_sent(pcb, http_sent);
|
|
||||||
} else {
|
|
||||||
pbuf_free(p);
|
|
||||||
close_conn(pcb, hs);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
pbuf_free(p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(err == ERR_OK && p == NULL) {
|
|
||||||
close_conn(pcb, hs);
|
|
||||||
}
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static err_t
|
|
||||||
http_accept(void *arg, struct tcp_pcb *pcb, err_t err)
|
|
||||||
{
|
|
||||||
struct http_state *hs;
|
|
||||||
|
|
||||||
tcp_setprio(pcb, TCP_PRIO_MIN);
|
|
||||||
|
|
||||||
/* Allocate memory for the structure that holds the state of the
|
|
||||||
connection. */
|
|
||||||
hs = mem_malloc(sizeof(struct http_state));
|
|
||||||
|
|
||||||
if(hs == NULL) {
|
|
||||||
printf("http_accept: Out of memory\n");
|
|
||||||
return ERR_MEM;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Initialize the structure. */
|
|
||||||
hs->file = NULL;
|
|
||||||
hs->left = 0;
|
|
||||||
hs->retries = 0;
|
|
||||||
|
|
||||||
/* Tell TCP that this is the structure we wish to be passed for our
|
|
||||||
callbacks. */
|
|
||||||
tcp_arg(pcb, hs);
|
|
||||||
|
|
||||||
/* Tell TCP that we wish to be informed of incoming data by a call
|
|
||||||
to the http_recv() function. */
|
|
||||||
tcp_recv(pcb, http_recv);
|
|
||||||
|
|
||||||
tcp_err(pcb, conn_err);
|
|
||||||
|
|
||||||
tcp_poll(pcb, http_poll, 4);
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
void
|
|
||||||
httpd_init(void)
|
|
||||||
{
|
|
||||||
struct tcp_pcb *pcb;
|
|
||||||
|
|
||||||
pcb = tcp_new();
|
|
||||||
tcp_bind(pcb, IP_ADDR_ANY, 80);
|
|
||||||
pcb = tcp_listen(pcb);
|
|
||||||
tcp_accept(pcb, http_accept);
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __HTTPD_H__
|
|
||||||
#define __HTTPD_H__
|
|
||||||
|
|
||||||
void httpd_init(void);
|
|
||||||
|
|
||||||
#endif /* __HTTPD_H__ */
|
|
||||||
@@ -1,97 +0,0 @@
|
|||||||
#!/usr/bin/perl
|
|
||||||
|
|
||||||
open(OUTPUT, "> fsdata.c");
|
|
||||||
|
|
||||||
chdir("fs");
|
|
||||||
open(FILES, "find . -type f |");
|
|
||||||
|
|
||||||
while($file = <FILES>) {
|
|
||||||
|
|
||||||
# Do not include files in CVS directories nor backup files.
|
|
||||||
if($file =~ /(CVS|~)/) {
|
|
||||||
next;
|
|
||||||
}
|
|
||||||
|
|
||||||
chop($file);
|
|
||||||
|
|
||||||
open(HEADER, "> /tmp/header") || die $!;
|
|
||||||
if($file =~ /404/) {
|
|
||||||
print(HEADER "HTTP/1.0 404 File not found\r\n");
|
|
||||||
} else {
|
|
||||||
print(HEADER "HTTP/1.0 200 OK\r\n");
|
|
||||||
}
|
|
||||||
print(HEADER "Server: lwIP/pre-0.6 (http://www.sics.se/~adam/lwip/)\r\n");
|
|
||||||
if($file =~ /\.html$/) {
|
|
||||||
print(HEADER "Content-type: text/html\r\n");
|
|
||||||
} elsif($file =~ /\.gif$/) {
|
|
||||||
print(HEADER "Content-type: image/gif\r\n");
|
|
||||||
} elsif($file =~ /\.png$/) {
|
|
||||||
print(HEADER "Content-type: image/png\r\n");
|
|
||||||
} elsif($file =~ /\.jpg$/) {
|
|
||||||
print(HEADER "Content-type: image/jpeg\r\n");
|
|
||||||
} elsif($file =~ /\.class$/) {
|
|
||||||
print(HEADER "Content-type: application/octet-stream\r\n");
|
|
||||||
} elsif($file =~ /\.ram$/) {
|
|
||||||
print(HEADER "Content-type: audio/x-pn-realaudio\r\n");
|
|
||||||
} else {
|
|
||||||
print(HEADER "Content-type: text/plain\r\n");
|
|
||||||
}
|
|
||||||
print(HEADER "\r\n");
|
|
||||||
close(HEADER);
|
|
||||||
|
|
||||||
unless($file =~ /\.plain$/ || $file =~ /cgi/) {
|
|
||||||
system("cat /tmp/header $file > /tmp/file");
|
|
||||||
} else {
|
|
||||||
system("cp $file /tmp/file");
|
|
||||||
}
|
|
||||||
|
|
||||||
open(FILE, "/tmp/file");
|
|
||||||
unlink("/tmp/file");
|
|
||||||
unlink("/tmp/header");
|
|
||||||
|
|
||||||
$file =~ s/\.//;
|
|
||||||
$fvar = $file;
|
|
||||||
$fvar =~ s-/-_-g;
|
|
||||||
$fvar =~ s-\.-_-g;
|
|
||||||
print(OUTPUT "static const unsigned char data".$fvar."[] = {\n");
|
|
||||||
print(OUTPUT "\t/* $file */\n\t");
|
|
||||||
for($j = 0; $j < length($file); $j++) {
|
|
||||||
printf(OUTPUT "%#02x, ", unpack("C", substr($file, $j, 1)));
|
|
||||||
}
|
|
||||||
printf(OUTPUT "0,\n");
|
|
||||||
|
|
||||||
|
|
||||||
$i = 0;
|
|
||||||
while(read(FILE, $data, 1)) {
|
|
||||||
if($i == 0) {
|
|
||||||
print(OUTPUT "\t");
|
|
||||||
}
|
|
||||||
printf(OUTPUT "%#02x, ", unpack("C", $data));
|
|
||||||
$i++;
|
|
||||||
if($i == 10) {
|
|
||||||
print(OUTPUT "\n");
|
|
||||||
$i = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
print(OUTPUT "};\n\n");
|
|
||||||
close(FILE);
|
|
||||||
push(@fvars, $fvar);
|
|
||||||
push(@files, $file);
|
|
||||||
}
|
|
||||||
|
|
||||||
for($i = 0; $i < @fvars; $i++) {
|
|
||||||
$file = $files[$i];
|
|
||||||
$fvar = $fvars[$i];
|
|
||||||
|
|
||||||
if($i == 0) {
|
|
||||||
$prevfile = "NULL";
|
|
||||||
} else {
|
|
||||||
$prevfile = "file" . $fvars[$i - 1];
|
|
||||||
}
|
|
||||||
print(OUTPUT "const struct fsdata_file file".$fvar."[] = {{$prevfile, data$fvar, ");
|
|
||||||
print(OUTPUT "data$fvar + ". (length($file) + 1) .", ");
|
|
||||||
print(OUTPUT "sizeof(data$fvar) - ". (length($file) + 1) ."}};\n\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
print(OUTPUT "#define FS_ROOT file$fvars[$i - 1]\n\n");
|
|
||||||
print(OUTPUT "#define FS_NUMFILES $i\n");
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,37 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __SHELL_H__
|
|
||||||
#define __SHELL_H__
|
|
||||||
|
|
||||||
void shell_init(void);
|
|
||||||
|
|
||||||
#endif /* __SHELL_H__ */
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "lwip/sys.h"
|
|
||||||
#include "lwip/api.h"
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static void
|
|
||||||
tcpecho_thread(void *arg)
|
|
||||||
{
|
|
||||||
struct netconn *conn, *newconn;
|
|
||||||
err_t err;
|
|
||||||
|
|
||||||
/* Create a new connection identifier. */
|
|
||||||
conn = netconn_new(NETCONN_TCP);
|
|
||||||
|
|
||||||
/* Bind connection to well known port number 7. */
|
|
||||||
netconn_bind(conn, NULL, 7);
|
|
||||||
|
|
||||||
/* Tell connection to go into listening mode. */
|
|
||||||
netconn_listen(conn);
|
|
||||||
|
|
||||||
while(1) {
|
|
||||||
|
|
||||||
/* Grab new connection. */
|
|
||||||
newconn = netconn_accept(conn);
|
|
||||||
/*printf("accepted new connection %p\n", newconn);*/
|
|
||||||
/* Process the new connection. */
|
|
||||||
if(newconn != NULL) {
|
|
||||||
struct netbuf *buf;
|
|
||||||
void *data;
|
|
||||||
u16_t len;
|
|
||||||
|
|
||||||
while((buf = netconn_recv(newconn)) != NULL) {
|
|
||||||
/*printf("Recved\n");*/
|
|
||||||
do {
|
|
||||||
netbuf_data(buf, &data, &len);
|
|
||||||
err = netconn_write(newconn, data, len, NETCONN_COPY);
|
|
||||||
if(err != ERR_OK) {
|
|
||||||
/* printf("tcpecho: netconn_write: error \"%s\"\n", lwip_strerr(err));*/
|
|
||||||
}
|
|
||||||
} while(netbuf_next(buf) >= 0);
|
|
||||||
netbuf_delete(buf);
|
|
||||||
}
|
|
||||||
/*printf("Got EOF, looping\n");*/
|
|
||||||
/* Close connection and discard connection identifier. */
|
|
||||||
netconn_delete(newconn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
void
|
|
||||||
tcpecho_init(void)
|
|
||||||
{
|
|
||||||
sys_thread_new(tcpecho_thread, NULL);
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __TCPECHO_H__
|
|
||||||
#define __TCPECHO_H__
|
|
||||||
|
|
||||||
void tcpecho_init(void);
|
|
||||||
|
|
||||||
#endif /* __TCPECHO_H__ */
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "lwip/api.h"
|
|
||||||
#include "lwip/sys.h"
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
void
|
|
||||||
udpecho_thread(void *arg)
|
|
||||||
{
|
|
||||||
static struct netconn *conn;
|
|
||||||
static struct netbuf *buf;
|
|
||||||
static struct ip_addr *addr;
|
|
||||||
static unsigned short port;
|
|
||||||
char buffer[4096];
|
|
||||||
|
|
||||||
conn = netconn_new(NETCONN_UDP);
|
|
||||||
netconn_bind(conn, NULL, 7);
|
|
||||||
|
|
||||||
while(1) {
|
|
||||||
buf = netconn_recv(conn);
|
|
||||||
addr = netbuf_fromaddr(buf);
|
|
||||||
port = netbuf_fromport(buf);
|
|
||||||
netconn_connect(conn, addr, port);
|
|
||||||
netconn_send(conn, buf);
|
|
||||||
netbuf_copy(buf, buffer, sizeof(buffer));
|
|
||||||
printf("got %s\n", buffer);
|
|
||||||
netbuf_delete(buf);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
void
|
|
||||||
udpecho_init(void)
|
|
||||||
{
|
|
||||||
sys_thread_new(udpecho_thread, NULL);
|
|
||||||
}
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __UDPECHO_H__
|
|
||||||
#define __UDPECHO_H__
|
|
||||||
|
|
||||||
void udpecho_init(void);
|
|
||||||
|
|
||||||
#endif /* __UDPECHO_H__ */
|
|
||||||
@@ -1,175 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __LWIPOPTS_H__
|
|
||||||
#define __LWIPOPTS_H__
|
|
||||||
/* ---------- Memory options ---------- */
|
|
||||||
/* MEM_ALIGNMENT: should be set to the alignment of the CPU for which
|
|
||||||
lwIP is compiled. 4 byte alignment -> define MEM_ALIGNMENT to 4, 2
|
|
||||||
byte alignment -> define MEM_ALIGNMENT to 2. */
|
|
||||||
#define MEM_ALIGNMENT 1
|
|
||||||
|
|
||||||
/* MEM_SIZE: the size of the heap memory. If the application will send
|
|
||||||
a lot of data that needs to be copied, this should be set high. */
|
|
||||||
#define MEM_SIZE 1600
|
|
||||||
|
|
||||||
/* MEMP_NUM_PBUF: the number of memp struct pbufs. If the application
|
|
||||||
sends a lot of data out of ROM (or other static memory), this
|
|
||||||
should be set high. */
|
|
||||||
#define MEMP_NUM_PBUF 16
|
|
||||||
/* MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One
|
|
||||||
per active UDP "connection". */
|
|
||||||
#define MEMP_NUM_UDP_PCB 4
|
|
||||||
/* MEMP_NUM_TCP_PCB: the number of simulatenously active TCP
|
|
||||||
connections. */
|
|
||||||
#define MEMP_NUM_TCP_PCB 5
|
|
||||||
/* MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP
|
|
||||||
connections. */
|
|
||||||
#define MEMP_NUM_TCP_PCB_LISTEN 8
|
|
||||||
/* MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP
|
|
||||||
segments. */
|
|
||||||
#define MEMP_NUM_TCP_SEG 16
|
|
||||||
/* MEMP_NUM_SYS_TIMEOUT: the number of simulateously active
|
|
||||||
timeouts. */
|
|
||||||
#define MEMP_NUM_SYS_TIMEOUT 3
|
|
||||||
|
|
||||||
/* The following four are used only with the sequential API and can be
|
|
||||||
set to 0 if the application only will use the raw API. */
|
|
||||||
/* MEMP_NUM_NETBUF: the number of struct netbufs. */
|
|
||||||
#define MEMP_NUM_NETBUF 2
|
|
||||||
/* MEMP_NUM_NETCONN: the number of struct netconns. */
|
|
||||||
#define MEMP_NUM_NETCONN 4
|
|
||||||
/* MEMP_NUM_APIMSG: the number of struct api_msg, used for
|
|
||||||
communication between the TCP/IP stack and the sequential
|
|
||||||
programs. */
|
|
||||||
#define MEMP_NUM_API_MSG 8
|
|
||||||
/* MEMP_NUM_TCPIPMSG: the number of struct tcpip_msg, which is used
|
|
||||||
for sequential API communication and incoming packets. Used in
|
|
||||||
src/api/tcpip.c. */
|
|
||||||
#define MEMP_NUM_TCPIP_MSG 8
|
|
||||||
|
|
||||||
/* These two control is reclaimer functions should be compiled
|
|
||||||
in. Should always be turned on (1). */
|
|
||||||
#define MEM_RECLAIM 1
|
|
||||||
#define MEMP_RECLAIM 1
|
|
||||||
|
|
||||||
/* ---------- Pbuf options ---------- */
|
|
||||||
/* PBUF_POOL_SIZE: the number of buffers in the pbuf pool. */
|
|
||||||
#define PBUF_POOL_SIZE 100
|
|
||||||
|
|
||||||
/* PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. */
|
|
||||||
#define PBUF_POOL_BUFSIZE 128
|
|
||||||
|
|
||||||
/* PBUF_LINK_HLEN: the number of bytes that should be allocated for a
|
|
||||||
link level header. */
|
|
||||||
#define PBUF_LINK_HLEN 16
|
|
||||||
|
|
||||||
/* ---------- TCP options ---------- */
|
|
||||||
#define LWIP_TCP 1
|
|
||||||
#define TCP_TTL 255
|
|
||||||
|
|
||||||
/* Controls if TCP should queue segments that arrive out of
|
|
||||||
order. Define to 0 if your device is low on memory. */
|
|
||||||
#define TCP_QUEUE_OOSEQ 1
|
|
||||||
|
|
||||||
/* TCP Maximum segment size. */
|
|
||||||
#define TCP_MSS 128
|
|
||||||
|
|
||||||
/* TCP sender buffer space (bytes). */
|
|
||||||
#define TCP_SND_BUF 256
|
|
||||||
|
|
||||||
/* TCP sender buffer space (pbufs). This must be at least = 2 *
|
|
||||||
TCP_SND_BUF/TCP_MSS for things to work. */
|
|
||||||
#define TCP_SND_QUEUELEN 4 * TCP_SND_BUF/TCP_MSS
|
|
||||||
|
|
||||||
/* TCP receive window. */
|
|
||||||
#define TCP_WND 1024
|
|
||||||
|
|
||||||
/* Maximum number of retransmissions of data segments. */
|
|
||||||
#define TCP_MAXRTX 12
|
|
||||||
|
|
||||||
/* Maximum number of retransmissions of SYN segments. */
|
|
||||||
#define TCP_SYNMAXRTX 4
|
|
||||||
|
|
||||||
/* ---------- ARP options ---------- */
|
|
||||||
#define ARP_TABLE_SIZE 10
|
|
||||||
#define ARP_QUEUEING 1
|
|
||||||
|
|
||||||
|
|
||||||
/* ---------- IP options ---------- */
|
|
||||||
/* Define IP_FORWARD to 1 if you wish to have the ability to forward
|
|
||||||
IP packets across network interfaces. If you are going to run lwIP
|
|
||||||
on a device with only one network interface, define this to 0. */
|
|
||||||
#define IP_FORWARD 1
|
|
||||||
|
|
||||||
/* If defined to 1, IP options are allowed (but not parsed). If
|
|
||||||
defined to 0, all packets with IP options are dropped. */
|
|
||||||
#define IP_OPTIONS 1
|
|
||||||
|
|
||||||
/* IP reassembly and segmentation.These are orthogonal even
|
|
||||||
* if they both deal with IP fragments */
|
|
||||||
#define IP_REASSEMBLY 1
|
|
||||||
#define IP_FRAG 1
|
|
||||||
|
|
||||||
/* ---------- ICMP options ---------- */
|
|
||||||
#define ICMP_TTL 255
|
|
||||||
|
|
||||||
/* ---------- DHCP options ---------- */
|
|
||||||
/* Define LWIP_DHCP to 1 if you want DHCP configuration of
|
|
||||||
interfaces. DHCP is not implemented in lwIP 0.5.1, however, so
|
|
||||||
turning this on does currently not work. */
|
|
||||||
#define LWIP_DHCP 0
|
|
||||||
|
|
||||||
/* 1 if you want to do an ARP check on the offered address
|
|
||||||
(recommended). */
|
|
||||||
#define DHCP_DOES_ARP_CHECK 1
|
|
||||||
|
|
||||||
/* ---------- UDP options ---------- */
|
|
||||||
#define LWIP_UDP 1
|
|
||||||
#define UDP_TTL 255
|
|
||||||
|
|
||||||
|
|
||||||
/* ---------- Statistics options ---------- */
|
|
||||||
#define STATS
|
|
||||||
|
|
||||||
#ifdef STATS
|
|
||||||
#define LINK_STATS
|
|
||||||
#define IP_STATS
|
|
||||||
#define ICMP_STATS
|
|
||||||
#define UDP_STATS
|
|
||||||
#define TCP_STATS
|
|
||||||
#define MEM_STATS
|
|
||||||
#define MEMP_STATS
|
|
||||||
#define PBUF_STATS
|
|
||||||
#define SYS_STATS
|
|
||||||
#endif /* STATS */
|
|
||||||
|
|
||||||
#endif /* __LWIPOPTS_H__ */
|
|
||||||
@@ -1,189 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "lwip/debug.h"
|
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
|
|
||||||
#include "lwip/mem.h"
|
|
||||||
#include "lwip/memp.h"
|
|
||||||
#include "lwip/sys.h"
|
|
||||||
|
|
||||||
#include "lwip/stats.h"
|
|
||||||
|
|
||||||
|
|
||||||
#include "lwip/tcpip.h"
|
|
||||||
|
|
||||||
#include "netif/tapif.h"
|
|
||||||
#include "netif/tunif.h"
|
|
||||||
|
|
||||||
#include "netif/unixif.h"
|
|
||||||
#include "netif/dropif.h"
|
|
||||||
#include "netif/pcapif.h"
|
|
||||||
#include "netif/loopif.h"
|
|
||||||
|
|
||||||
#include "netif/tcpdump.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#include "lwip/ip_addr.h"
|
|
||||||
|
|
||||||
#include "arch/perf.h"
|
|
||||||
|
|
||||||
#include "httpd.h"
|
|
||||||
#include "udpecho.h"
|
|
||||||
#include "tcpecho.h"
|
|
||||||
#include "shell.h"
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static void
|
|
||||||
tcp_timeout(void *data)
|
|
||||||
{
|
|
||||||
#if TCP_DEBUG
|
|
||||||
tcp_debug_print_pcbs();
|
|
||||||
#endif /* TCP_DEBUG */
|
|
||||||
sys_timeout(5000, tcp_timeout, NULL);
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static void
|
|
||||||
tcpip_init_done(void *arg)
|
|
||||||
{
|
|
||||||
sys_sem_t *sem;
|
|
||||||
sem = arg;
|
|
||||||
sys_sem_signal(*sem);
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static void
|
|
||||||
main_thread(void *arg)
|
|
||||||
{
|
|
||||||
struct ip_addr ipaddr, netmask, gw;
|
|
||||||
sys_sem_t sem;
|
|
||||||
|
|
||||||
netif_init();
|
|
||||||
|
|
||||||
sem = sys_sem_new(0);
|
|
||||||
tcpip_init(tcpip_init_done, &sem);
|
|
||||||
sys_sem_wait(sem);
|
|
||||||
sys_sem_free(sem);
|
|
||||||
printf("TCP/IP initialized.\n");
|
|
||||||
|
|
||||||
#if LWIP_DHCP
|
|
||||||
{
|
|
||||||
struct netif *netif;
|
|
||||||
IP4_ADDR(&gw, 0,0,0,0);
|
|
||||||
IP4_ADDR(&ipaddr, 0,0,0,0);
|
|
||||||
IP4_ADDR(&netmask, 0,0,0,0);
|
|
||||||
|
|
||||||
netif = netif_add(&ipaddr, &netmask, &gw, tapif_init,
|
|
||||||
tcpip_input);
|
|
||||||
netif_set_default(netif);
|
|
||||||
dhcp_init();
|
|
||||||
dhcp_start(netif);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
IP4_ADDR(&gw, 192,168,0,1);
|
|
||||||
IP4_ADDR(&ipaddr, 192,168,0,2);
|
|
||||||
IP4_ADDR(&netmask, 255,255,255,0);
|
|
||||||
|
|
||||||
/* netif_set_default(netif_add(&ipaddr, &netmask, &gw, tapif_init,
|
|
||||||
tcpip_input));*/
|
|
||||||
netif_set_default(netif_add(&ipaddr, &netmask, &gw, tapif_init,
|
|
||||||
tcpip_input));
|
|
||||||
#endif
|
|
||||||
/* Only used for testing purposes: */
|
|
||||||
/* IP4_ADDR(&gw, 193,10,66,1);
|
|
||||||
IP4_ADDR(&ipaddr, 193,10,66,107);
|
|
||||||
IP4_ADDR(&netmask, 255,255,252,0);
|
|
||||||
|
|
||||||
netif_add(&ipaddr, &netmask, &gw, pcapif_init,
|
|
||||||
tcpip_input);*/
|
|
||||||
|
|
||||||
IP4_ADDR(&gw, 127,0,0,1);
|
|
||||||
IP4_ADDR(&ipaddr, 127,0,0,1);
|
|
||||||
IP4_ADDR(&netmask, 255,0,0,0);
|
|
||||||
|
|
||||||
netif_add(&ipaddr, &netmask, &gw, loopif_init,
|
|
||||||
tcpip_input);
|
|
||||||
|
|
||||||
tcpecho_init();
|
|
||||||
shell_init();
|
|
||||||
httpd_init();
|
|
||||||
udpecho_init();
|
|
||||||
|
|
||||||
printf("Applications started.\n");
|
|
||||||
|
|
||||||
/* sys_timeout(5000, tcp_timeout, NULL);*/
|
|
||||||
|
|
||||||
#ifdef MEM_PERF
|
|
||||||
mem_perf_init("/tmp/memstats.client");
|
|
||||||
#endif /* MEM_PERF */
|
|
||||||
|
|
||||||
/* Block for ever. */
|
|
||||||
sem = sys_sem_new(0);
|
|
||||||
sys_sem_wait(sem);
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
int
|
|
||||||
main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
#ifdef PERF
|
|
||||||
perf_init("/tmp/simhost.perf");
|
|
||||||
#endif /* PERF */
|
|
||||||
#ifdef STATS
|
|
||||||
stats_init();
|
|
||||||
#endif /* STATS */
|
|
||||||
sys_init();
|
|
||||||
mem_init();
|
|
||||||
memp_init();
|
|
||||||
pbuf_init();
|
|
||||||
|
|
||||||
tcpdump_init();
|
|
||||||
|
|
||||||
|
|
||||||
printf("System initialized.\n");
|
|
||||||
|
|
||||||
sys_thread_new((void *)(main_thread), NULL);
|
|
||||||
pause();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,154 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "lwip/debug.h"
|
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
|
|
||||||
#include "lwip/mem.h"
|
|
||||||
#include "lwip/memp.h"
|
|
||||||
#include "lwip/sys.h"
|
|
||||||
|
|
||||||
#include "lwip/stats.h"
|
|
||||||
|
|
||||||
|
|
||||||
#include "lwip/tcpip.h"
|
|
||||||
|
|
||||||
|
|
||||||
#include "netif/unixif.h"
|
|
||||||
#include "netif/dropif.h"
|
|
||||||
|
|
||||||
#include "netif/loopif.h"
|
|
||||||
|
|
||||||
#include "netif/tcpdump.h"
|
|
||||||
|
|
||||||
#include "lwip/ip_addr.h"
|
|
||||||
|
|
||||||
#include "arch/perf.h"
|
|
||||||
|
|
||||||
#include "httpd.h"
|
|
||||||
#include "udpecho.h"
|
|
||||||
#include "tcpecho.h"
|
|
||||||
#include "shell.h"
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static void
|
|
||||||
tcp_timeout(void *data)
|
|
||||||
{
|
|
||||||
#if TCP_DEBUG
|
|
||||||
tcp_debug_print_pcbs();
|
|
||||||
#endif /* TCP_DEBUG */
|
|
||||||
sys_timeout(5000, tcp_timeout, NULL);
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static void
|
|
||||||
tcpip_init_done(void *arg)
|
|
||||||
{
|
|
||||||
sys_sem_t *sem;
|
|
||||||
sem = arg;
|
|
||||||
sys_sem_signal(*sem);
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static void
|
|
||||||
main_thread(void *arg)
|
|
||||||
{
|
|
||||||
struct ip_addr ipaddr, netmask, gw;
|
|
||||||
sys_sem_t sem;
|
|
||||||
|
|
||||||
|
|
||||||
IP4_ADDR(&gw, 192,168,1,1);
|
|
||||||
IP4_ADDR(&ipaddr, 192,168,1,2);
|
|
||||||
IP4_ADDR(&netmask, 255,255,255,0);
|
|
||||||
|
|
||||||
netif_set_default(netif_add(&ipaddr, &netmask, &gw, unixif_init_client,
|
|
||||||
tcpip_input));
|
|
||||||
/* netif_set_default(netif_add(&ipaddr, &netmask, &gw, sioslipif_init1,
|
|
||||||
tcpip_input)); */
|
|
||||||
|
|
||||||
|
|
||||||
sem = sys_sem_new(0);
|
|
||||||
tcpip_init(tcpip_init_done, &sem);
|
|
||||||
sys_sem_wait(sem);
|
|
||||||
sys_sem_free(sem);
|
|
||||||
printf("TCP/IP initialized.\n");
|
|
||||||
|
|
||||||
tcpecho_init();
|
|
||||||
shell_init();
|
|
||||||
httpd_init();
|
|
||||||
udpecho_init();
|
|
||||||
|
|
||||||
printf("Applications started.\n");
|
|
||||||
|
|
||||||
sys_timeout(5000, tcp_timeout, NULL);
|
|
||||||
|
|
||||||
#ifdef MEM_PERF
|
|
||||||
mem_perf_init("/tmp/memstats.client");
|
|
||||||
#endif /* MEM_PERF */
|
|
||||||
|
|
||||||
sem = sys_sem_new(0);
|
|
||||||
sys_sem_wait(sem);
|
|
||||||
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
int
|
|
||||||
main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
#ifdef PERF
|
|
||||||
perf_init("/tmp/client.perf");
|
|
||||||
#endif /* PERF */
|
|
||||||
#ifdef STATS
|
|
||||||
stats_init();
|
|
||||||
#endif /* STATS */
|
|
||||||
sys_init();
|
|
||||||
mem_init();
|
|
||||||
memp_init();
|
|
||||||
pbuf_init();
|
|
||||||
|
|
||||||
tcpdump_init();
|
|
||||||
|
|
||||||
|
|
||||||
printf("System initialized.\n");
|
|
||||||
|
|
||||||
sys_thread_new((void *)(main_thread), NULL);
|
|
||||||
pause();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,165 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "lwip/debug.h"
|
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
|
|
||||||
#include "lwip/mem.h"
|
|
||||||
#include "lwip/memp.h"
|
|
||||||
#include "lwip/sys.h"
|
|
||||||
|
|
||||||
#include "lwip/stats.h"
|
|
||||||
|
|
||||||
|
|
||||||
#include "lwip/tcpip.h"
|
|
||||||
|
|
||||||
#include "netif/tapif.h"
|
|
||||||
|
|
||||||
#include "netif/unixif.h"
|
|
||||||
#include "netif/dropif.h"
|
|
||||||
|
|
||||||
#include "netif/loopif.h"
|
|
||||||
|
|
||||||
#include "netif/tcpdump.h"
|
|
||||||
|
|
||||||
|
|
||||||
#include "lwip/ip_addr.h"
|
|
||||||
|
|
||||||
#include "arch/perf.h"
|
|
||||||
|
|
||||||
#include "httpd.h"
|
|
||||||
#include "udpecho.h"
|
|
||||||
#include "tcpecho.h"
|
|
||||||
#include "shell.h"
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static void
|
|
||||||
tcp_timeout(void *data)
|
|
||||||
{
|
|
||||||
#if TCP_DEBUG
|
|
||||||
tcp_debug_print_pcbs();
|
|
||||||
#endif /* TCP_DEBUG */
|
|
||||||
sys_timeout(5000, tcp_timeout, NULL);
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static void
|
|
||||||
tcpip_init_done(void *arg)
|
|
||||||
{
|
|
||||||
sys_sem_t *sem;
|
|
||||||
sem = arg;
|
|
||||||
sys_sem_signal(*sem);
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static void
|
|
||||||
main_thread(void *arg)
|
|
||||||
{
|
|
||||||
struct ip_addr ipaddr, netmask, gw;
|
|
||||||
sys_sem_t sem;
|
|
||||||
|
|
||||||
|
|
||||||
IP4_ADDR(&gw, 192,168,0,1);
|
|
||||||
IP4_ADDR(&ipaddr, 192,168,0,2);
|
|
||||||
IP4_ADDR(&netmask, 255,255,255,0);
|
|
||||||
|
|
||||||
netif_set_default(netif_add(&ipaddr, &netmask, &gw, tapif_init,
|
|
||||||
tcpip_input));
|
|
||||||
|
|
||||||
IP4_ADDR(&gw, 192,168,1,1);
|
|
||||||
IP4_ADDR(&ipaddr, 192,168,1,1);
|
|
||||||
IP4_ADDR(&netmask, 255,255,255,0);
|
|
||||||
netif_set_default(netif_add(&ipaddr, &netmask, &gw, unixif_init_server,
|
|
||||||
tcpip_input));
|
|
||||||
|
|
||||||
system("route add 192.168.1.1 192.168.0.2");
|
|
||||||
system("route add 192.168.1.2 192.168.0.2");
|
|
||||||
|
|
||||||
|
|
||||||
/*netif_set_default(netif_add(&ipaddr, &netmask, &gw, sioslipif_init1,
|
|
||||||
tcpip_input)); */
|
|
||||||
|
|
||||||
|
|
||||||
sem = sys_sem_new(0);
|
|
||||||
tcpip_init(tcpip_init_done, &sem);
|
|
||||||
sys_sem_wait(sem);
|
|
||||||
sys_sem_free(sem);
|
|
||||||
printf("TCP/IP initialized.\n");
|
|
||||||
|
|
||||||
tcpecho_init();
|
|
||||||
shell_init();
|
|
||||||
httpd_init();
|
|
||||||
udpecho_init();
|
|
||||||
|
|
||||||
printf("Applications started.\n");
|
|
||||||
|
|
||||||
sys_timeout(5000, tcp_timeout, NULL);
|
|
||||||
|
|
||||||
#ifdef MEM_PERF
|
|
||||||
mem_perf_init("/tmp/memstats.client");
|
|
||||||
#endif /* MEM_PERF */
|
|
||||||
sem = sys_sem_new(0);
|
|
||||||
sys_sem_wait(sem);
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
int
|
|
||||||
main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
#ifdef PERF
|
|
||||||
perf_init("/tmp/client.perf");
|
|
||||||
#endif /* PERF */
|
|
||||||
#ifdef STATS
|
|
||||||
stats_init();
|
|
||||||
#endif /* STATS */
|
|
||||||
sys_init();
|
|
||||||
mem_init();
|
|
||||||
memp_init();
|
|
||||||
pbuf_init();
|
|
||||||
|
|
||||||
tcpdump_init();
|
|
||||||
|
|
||||||
|
|
||||||
printf("System initialized.\n");
|
|
||||||
|
|
||||||
sys_thread_new((void *)(main_thread), NULL);
|
|
||||||
pause();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
12
src/FILES
12
src/FILES
@@ -1,13 +1,13 @@
|
|||||||
api/ - The code for the API.
|
api/ - The code for the high-level wrapper API. Not needed if
|
||||||
|
you use the lowel-level call-back/raw API.
|
||||||
|
|
||||||
arch/ - Architectural specific files are kept here.
|
core/ - The core of the TPC/IP stack; protocol implementations,
|
||||||
|
memory and buffer management, and the low-level raw API.
|
||||||
|
|
||||||
core/ - The core files including protocol implementations, memory
|
|
||||||
and buffer management etc.
|
|
||||||
|
|
||||||
include/ - lwIP include files.
|
include/ - lwIP include files.
|
||||||
|
|
||||||
netif/ - Generic network interface device drivers are kept here.
|
netif/ - Generic network interface device drivers are kept here,
|
||||||
|
as well as the ARP module.
|
||||||
|
|
||||||
For more information on the various subdirectories, check the FILES
|
For more information on the various subdirectories, check the FILES
|
||||||
file in each directory.
|
file in each directory.
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
1351
src/api/api_msg.c
1351
src/api/api_msg.c
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,11 @@
|
|||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* Error Management module
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
@@ -34,26 +40,35 @@
|
|||||||
|
|
||||||
#ifdef LWIP_DEBUG
|
#ifdef LWIP_DEBUG
|
||||||
|
|
||||||
static char *err_strerr[] = {"Ok.",
|
static const char *err_strerr[] = {
|
||||||
"Out of memory error.",
|
"Ok.", /* ERR_OK 0 */
|
||||||
"Buffer error.",
|
"Out of memory error.", /* ERR_MEM -1 */
|
||||||
"Connection aborted.",
|
"Buffer error.", /* ERR_BUF -2 */
|
||||||
"Connection reset.",
|
"Routing problem.", /* ERR_RTE -3 */
|
||||||
"Connection closed.",
|
"Connection aborted.", /* ERR_ABRT -4 */
|
||||||
"Not connected.",
|
"Connection reset.", /* ERR_RST -5 */
|
||||||
"Illegal value.",
|
"Connection closed.", /* ERR_CLSD -6 */
|
||||||
"Illegal argument.",
|
"Not connected.", /* ERR_CONN -7 */
|
||||||
"Routing problem.",
|
"Illegal value.", /* ERR_VAL -8 */
|
||||||
"Address in use."
|
"Illegal argument.", /* ERR_ARG -9 */
|
||||||
|
"Address in use.", /* ERR_USE -10 */
|
||||||
|
"Low-level netif error.", /* ERR_IF -11 */
|
||||||
|
"Already connected.", /* ERR_ISCONN -12 */
|
||||||
|
"Timeout.", /* ERR_TIMEOUT -13 */
|
||||||
|
"Operation in progress." /* ERR_INPROGRESS -14 */
|
||||||
};
|
};
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
/**
|
||||||
char *
|
* Convert an lwip internal error to a string representation.
|
||||||
|
*
|
||||||
|
* @param err an lwip internal err_t
|
||||||
|
* @return a string representation for err
|
||||||
|
*/
|
||||||
|
const char *
|
||||||
lwip_strerr(err_t err)
|
lwip_strerr(err_t err)
|
||||||
{
|
{
|
||||||
return err_strerr[-err];
|
return err_strerr[-err];
|
||||||
|
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#endif /* LWIP_DEBUG */
|
#endif /* LWIP_DEBUG */
|
||||||
|
|||||||
235
src/api/netbuf.c
Normal file
235
src/api/netbuf.c
Normal file
@@ -0,0 +1,235 @@
|
|||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* Network buffer management
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* 2. 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.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
||||||
|
*
|
||||||
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
|
*
|
||||||
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
|
||||||
|
#if LWIP_NETCONN /* don't build if not configured for use in lwipopts.h */
|
||||||
|
|
||||||
|
#include "lwip/netbuf.h"
|
||||||
|
#include "lwip/memp.h"
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create (allocate) and initialize a new netbuf.
|
||||||
|
* The netbuf doesn't yet contain a packet buffer!
|
||||||
|
*
|
||||||
|
* @return a pointer to a new netbuf
|
||||||
|
* NULL on lack of memory
|
||||||
|
*/
|
||||||
|
struct
|
||||||
|
netbuf *netbuf_new(void)
|
||||||
|
{
|
||||||
|
struct netbuf *buf;
|
||||||
|
|
||||||
|
buf = memp_malloc(MEMP_NETBUF);
|
||||||
|
if (buf != NULL) {
|
||||||
|
buf->p = NULL;
|
||||||
|
buf->ptr = NULL;
|
||||||
|
buf->addr = NULL;
|
||||||
|
return buf;
|
||||||
|
} else {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deallocate a netbuf allocated by netbuf_new().
|
||||||
|
*
|
||||||
|
* @param buf pointer to a netbuf allocated by netbuf_new()
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
netbuf_delete(struct netbuf *buf)
|
||||||
|
{
|
||||||
|
if (buf != NULL) {
|
||||||
|
if (buf->p != NULL) {
|
||||||
|
pbuf_free(buf->p);
|
||||||
|
buf->p = buf->ptr = NULL;
|
||||||
|
}
|
||||||
|
memp_free(MEMP_NETBUF, buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocate memory for a packet buffer for a given netbuf.
|
||||||
|
*
|
||||||
|
* @param buf the netbuf for which to allocate a packet buffer
|
||||||
|
* @param size the size of the packet buffer to allocate
|
||||||
|
* @return pointer to the allocated memory
|
||||||
|
* NULL if no memory could be allocated
|
||||||
|
*/
|
||||||
|
void *
|
||||||
|
netbuf_alloc(struct netbuf *buf, u16_t size)
|
||||||
|
{
|
||||||
|
LWIP_ERROR("netbuf_alloc: invalid buf", (buf != NULL), return NULL;);
|
||||||
|
|
||||||
|
/* Deallocate any previously allocated memory. */
|
||||||
|
if (buf->p != NULL) {
|
||||||
|
pbuf_free(buf->p);
|
||||||
|
}
|
||||||
|
buf->p = pbuf_alloc(PBUF_TRANSPORT, size, PBUF_RAM);
|
||||||
|
if (buf->p == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
LWIP_ASSERT("check that first pbuf can hold size",
|
||||||
|
(buf->p->len >= size));
|
||||||
|
buf->ptr = buf->p;
|
||||||
|
return buf->p->payload;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Free the packet buffer included in a netbuf
|
||||||
|
*
|
||||||
|
* @param buf pointer to the netbuf which contains the packet buffer to free
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
netbuf_free(struct netbuf *buf)
|
||||||
|
{
|
||||||
|
LWIP_ERROR("netbuf_free: invalid buf", (buf != NULL), return;);
|
||||||
|
if (buf->p != NULL) {
|
||||||
|
pbuf_free(buf->p);
|
||||||
|
}
|
||||||
|
buf->p = buf->ptr = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Let a netbuf reference existing (non-volatile) data.
|
||||||
|
*
|
||||||
|
* @param buf netbuf which should reference the data
|
||||||
|
* @param dataptr pointer to the data to reference
|
||||||
|
* @param size size of the data
|
||||||
|
* @return ERR_OK if data is referenced
|
||||||
|
* ERR_MEM if data couldn't be referenced due to lack of memory
|
||||||
|
*/
|
||||||
|
err_t
|
||||||
|
netbuf_ref(struct netbuf *buf, const void *dataptr, u16_t size)
|
||||||
|
{
|
||||||
|
LWIP_ERROR("netbuf_ref: invalid buf", (buf != NULL), return ERR_ARG;);
|
||||||
|
if (buf->p != NULL) {
|
||||||
|
pbuf_free(buf->p);
|
||||||
|
}
|
||||||
|
buf->p = pbuf_alloc(PBUF_TRANSPORT, 0, PBUF_REF);
|
||||||
|
if (buf->p == NULL) {
|
||||||
|
buf->ptr = NULL;
|
||||||
|
return ERR_MEM;
|
||||||
|
}
|
||||||
|
buf->p->payload = (void*)dataptr;
|
||||||
|
buf->p->len = buf->p->tot_len = size;
|
||||||
|
buf->ptr = buf->p;
|
||||||
|
return ERR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Chain one netbuf to another (@see pbuf_chain)
|
||||||
|
*
|
||||||
|
* @param head the first netbuf
|
||||||
|
* @param tail netbuf to chain after head
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
netbuf_chain(struct netbuf *head, struct netbuf *tail)
|
||||||
|
{
|
||||||
|
LWIP_ERROR("netbuf_ref: invalid head", (head != NULL), return;);
|
||||||
|
LWIP_ERROR("netbuf_chain: invalid tail", (tail != NULL), return;);
|
||||||
|
pbuf_chain(head->p, tail->p);
|
||||||
|
head->ptr = head->p;
|
||||||
|
memp_free(MEMP_NETBUF, tail);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the data pointer and length of the data inside a netbuf.
|
||||||
|
*
|
||||||
|
* @param buf netbuf to get the data from
|
||||||
|
* @param dataptr pointer to a void pointer where to store the data pointer
|
||||||
|
* @param len pointer to an u16_t where the length of the data is stored
|
||||||
|
* @return ERR_OK if the information was retreived,
|
||||||
|
* ERR_BUF on error.
|
||||||
|
*/
|
||||||
|
err_t
|
||||||
|
netbuf_data(struct netbuf *buf, void **dataptr, u16_t *len)
|
||||||
|
{
|
||||||
|
LWIP_ERROR("netbuf_data: invalid buf", (buf != NULL), return ERR_ARG;);
|
||||||
|
LWIP_ERROR("netbuf_data: invalid dataptr", (dataptr != NULL), return ERR_ARG;);
|
||||||
|
LWIP_ERROR("netbuf_data: invalid len", (len != NULL), return ERR_ARG;);
|
||||||
|
|
||||||
|
if (buf->ptr == NULL) {
|
||||||
|
return ERR_BUF;
|
||||||
|
}
|
||||||
|
*dataptr = buf->ptr->payload;
|
||||||
|
*len = buf->ptr->len;
|
||||||
|
return ERR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Move the current data pointer of a packet buffer contained in a netbuf
|
||||||
|
* to the next part.
|
||||||
|
* The packet buffer itself is not modified.
|
||||||
|
*
|
||||||
|
* @param buf the netbuf to modify
|
||||||
|
* @return -1 if there is no next part
|
||||||
|
* 1 if moved to the next part but now there is no next part
|
||||||
|
* 0 if moved to the next part and there are still more parts
|
||||||
|
*/
|
||||||
|
s8_t
|
||||||
|
netbuf_next(struct netbuf *buf)
|
||||||
|
{
|
||||||
|
LWIP_ERROR("netbuf_free: invalid buf", (buf != NULL), return -1;);
|
||||||
|
if (buf->ptr->next == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
buf->ptr = buf->ptr->next;
|
||||||
|
if (buf->ptr->next == NULL) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Move the current data pointer of a packet buffer contained in a netbuf
|
||||||
|
* to the beginning of the packet.
|
||||||
|
* The packet buffer itself is not modified.
|
||||||
|
*
|
||||||
|
* @param buf the netbuf to modify
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
netbuf_first(struct netbuf *buf)
|
||||||
|
{
|
||||||
|
LWIP_ERROR("netbuf_free: invalid buf", (buf != NULL), return;);
|
||||||
|
buf->ptr = buf->p;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* LWIP_NETCONN */
|
||||||
352
src/api/netdb.c
Normal file
352
src/api/netdb.c
Normal file
@@ -0,0 +1,352 @@
|
|||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* API functions for name resolving
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* 2. 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.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
||||||
|
*
|
||||||
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
|
*
|
||||||
|
* Author: Simon Goldschmidt
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "lwip/netdb.h"
|
||||||
|
|
||||||
|
#if LWIP_DNS && LWIP_SOCKET
|
||||||
|
|
||||||
|
#include "lwip/err.h"
|
||||||
|
#include "lwip/mem.h"
|
||||||
|
#include "lwip/ip_addr.h"
|
||||||
|
#include "lwip/api.h"
|
||||||
|
|
||||||
|
/** helper struct for gethostbyname_r to access the char* buffer */
|
||||||
|
struct gethostbyname_r_helper {
|
||||||
|
struct ip_addr *addrs;
|
||||||
|
struct ip_addr addr;
|
||||||
|
char *aliases;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** h_errno is exported in netdb.h for access by applications. */
|
||||||
|
#if LWIP_DNS_API_DECLARE_H_ERRNO
|
||||||
|
int h_errno;
|
||||||
|
#endif /* LWIP_DNS_API_DECLARE_H_ERRNO */
|
||||||
|
|
||||||
|
/** define "hostent" variables storage: 0 if we use a static (but unprotected)
|
||||||
|
* set of variables for lwip_gethostbyname, 1 if we use a local storage */
|
||||||
|
#ifndef LWIP_DNS_API_HOSTENT_STORAGE
|
||||||
|
#define LWIP_DNS_API_HOSTENT_STORAGE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** define "hostent" variables storage */
|
||||||
|
#if LWIP_DNS_API_HOSTENT_STORAGE
|
||||||
|
#define HOSTENT_STORAGE
|
||||||
|
#else
|
||||||
|
#define HOSTENT_STORAGE static
|
||||||
|
#endif /* LWIP_DNS_API_STATIC_HOSTENT */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an entry containing addresses of address family AF_INET
|
||||||
|
* for the host with name name.
|
||||||
|
* Due to dns_gethostbyname limitations, only one address is returned.
|
||||||
|
*
|
||||||
|
* @param name the hostname to resolve
|
||||||
|
* @return an entry containing addresses of address family AF_INET
|
||||||
|
* for the host with name name
|
||||||
|
*/
|
||||||
|
struct hostent*
|
||||||
|
lwip_gethostbyname(const char *name)
|
||||||
|
{
|
||||||
|
err_t err;
|
||||||
|
struct ip_addr addr;
|
||||||
|
|
||||||
|
/* buffer variables for lwip_gethostbyname() */
|
||||||
|
HOSTENT_STORAGE struct hostent s_hostent;
|
||||||
|
HOSTENT_STORAGE char *s_aliases;
|
||||||
|
HOSTENT_STORAGE struct ip_addr s_hostent_addr;
|
||||||
|
HOSTENT_STORAGE struct ip_addr *s_phostent_addr;
|
||||||
|
|
||||||
|
/* query host IP address */
|
||||||
|
err = netconn_gethostbyname(name, &addr);
|
||||||
|
if (err != ERR_OK) {
|
||||||
|
LWIP_DEBUGF(DNS_DEBUG, ("lwip_gethostbyname(%s) failed, err=%d\n", name, err));
|
||||||
|
h_errno = HOST_NOT_FOUND;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* fill hostent */
|
||||||
|
s_hostent_addr = addr;
|
||||||
|
s_phostent_addr = &s_hostent_addr;
|
||||||
|
s_hostent.h_name = (char*)name;
|
||||||
|
s_hostent.h_aliases = &s_aliases;
|
||||||
|
s_hostent.h_addrtype = AF_INET;
|
||||||
|
s_hostent.h_length = sizeof(struct ip_addr);
|
||||||
|
s_hostent.h_addr_list = (char**)&s_phostent_addr;
|
||||||
|
|
||||||
|
#if DNS_DEBUG
|
||||||
|
/* dump hostent */
|
||||||
|
LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_name == %s\n", s_hostent.h_name));
|
||||||
|
LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_aliases == 0x%08lX\n",(u32_t)(s_hostent.h_aliases)));
|
||||||
|
if (s_hostent.h_aliases != NULL) {
|
||||||
|
u8_t idx;
|
||||||
|
for ( idx=0; s_hostent.h_aliases[idx]; idx++) {
|
||||||
|
LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_aliases[%i]-> == 0x%08lX\n", idx, s_hostent.h_aliases[idx]));
|
||||||
|
LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_aliases[%i]-> == %s\n", idx, s_hostent.h_aliases[idx]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_addrtype == %lu\n", (u32_t)(s_hostent.h_addrtype)));
|
||||||
|
LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_length == %lu\n", (u32_t)(s_hostent.h_length)));
|
||||||
|
LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_addr_list == 0x%08lX\n", s_hostent.h_addr_list));
|
||||||
|
if (s_hostent.h_addr_list != NULL) {
|
||||||
|
u8_t idx;
|
||||||
|
for ( idx=0; s_hostent.h_addr_list[idx]; idx++) {
|
||||||
|
LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_addr_list[%i] == 0x%08lX\n", idx, s_hostent.h_addr_list[idx]));
|
||||||
|
LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_addr_list[%i]-> == %s\n", idx, inet_ntoa(*((struct in_addr*)(s_hostent.h_addr_list[idx])))));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* DNS_DEBUG */
|
||||||
|
|
||||||
|
#if LWIP_DNS_API_HOSTENT_STORAGE
|
||||||
|
/* this function should return the "per-thread" hostent after copy from s_hostent */
|
||||||
|
return sys_thread_hostent(&s_hostent);
|
||||||
|
#else
|
||||||
|
return &s_hostent;
|
||||||
|
#endif /* LWIP_DNS_API_HOSTENT_STORAGE */
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Thread-safe variant of lwip_gethostbyname: instead of using a static
|
||||||
|
* buffer, this function takes buffer and errno pointers as arguments
|
||||||
|
* and uses these for the result.
|
||||||
|
*
|
||||||
|
* @param name the hostname to resolve
|
||||||
|
* @param ret pre-allocated struct where to store the result
|
||||||
|
* @param buf pre-allocated buffer where to store additional data
|
||||||
|
* @param buflen the size of buf
|
||||||
|
* @param result pointer to a hostent pointer that is set to ret on success
|
||||||
|
* and set to zero on error
|
||||||
|
* @param h_errnop pointer to an int where to store errors (instead of modifying
|
||||||
|
* the global h_errno)
|
||||||
|
* @return 0 on success, non-zero on error, additional error information
|
||||||
|
* is stored in *h_errnop instead of h_errno to be thread-safe
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
lwip_gethostbyname_r(const char *name, struct hostent *ret, char *buf,
|
||||||
|
size_t buflen, struct hostent **result, int *h_errnop)
|
||||||
|
{
|
||||||
|
err_t err;
|
||||||
|
struct gethostbyname_r_helper *h;
|
||||||
|
char *hostname;
|
||||||
|
size_t namelen;
|
||||||
|
int lh_errno;
|
||||||
|
|
||||||
|
if (h_errnop == NULL) {
|
||||||
|
/* ensure h_errnop is never NULL */
|
||||||
|
h_errnop = &lh_errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result == NULL) {
|
||||||
|
/* not all arguments given */
|
||||||
|
*h_errnop = EINVAL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
/* first thing to do: set *result to nothing */
|
||||||
|
*result = NULL;
|
||||||
|
if ((name == NULL) || (ret == NULL) || (buf == 0)) {
|
||||||
|
/* not all arguments given */
|
||||||
|
*h_errnop = EINVAL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
namelen = strlen(name);
|
||||||
|
if (buflen < (sizeof(struct gethostbyname_r_helper) + namelen + 1 + (MEM_ALIGNMENT - 1))) {
|
||||||
|
/* buf can't hold the data needed + a copy of name */
|
||||||
|
*h_errnop = ERANGE;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
h = (struct gethostbyname_r_helper*)LWIP_MEM_ALIGN(buf);
|
||||||
|
hostname = ((char*)h) + sizeof(struct gethostbyname_r_helper);
|
||||||
|
|
||||||
|
/* query host IP address */
|
||||||
|
err = netconn_gethostbyname(name, &(h->addr));
|
||||||
|
if (err != ERR_OK) {
|
||||||
|
LWIP_DEBUGF(DNS_DEBUG, ("lwip_gethostbyname(%s) failed, err=%d\n", name, err));
|
||||||
|
*h_errnop = ENSRNOTFOUND;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* copy the hostname into buf */
|
||||||
|
MEMCPY(hostname, name, namelen);
|
||||||
|
hostname[namelen] = 0;
|
||||||
|
|
||||||
|
/* fill hostent */
|
||||||
|
h->addrs = &(h->addr);
|
||||||
|
h->aliases = NULL;
|
||||||
|
ret->h_name = (char*)hostname;
|
||||||
|
ret->h_aliases = &(h->aliases);
|
||||||
|
ret->h_addrtype = AF_INET;
|
||||||
|
ret->h_length = sizeof(struct ip_addr);
|
||||||
|
ret->h_addr_list = (char**)&(h->addrs);
|
||||||
|
|
||||||
|
/* set result != NULL */
|
||||||
|
*result = ret;
|
||||||
|
|
||||||
|
/* return success */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Frees one or more addrinfo structures returned by getaddrinfo(), along with
|
||||||
|
* any additional storage associated with those structures. If the ai_next field
|
||||||
|
* of the structure is not null, the entire list of structures is freed.
|
||||||
|
*
|
||||||
|
* @param ai struct addrinfo to free
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
lwip_freeaddrinfo(struct addrinfo *ai)
|
||||||
|
{
|
||||||
|
struct addrinfo *next;
|
||||||
|
|
||||||
|
while (ai != NULL) {
|
||||||
|
if (ai->ai_addr != NULL) {
|
||||||
|
mem_free(ai->ai_addr);
|
||||||
|
}
|
||||||
|
if (ai->ai_canonname != NULL) {
|
||||||
|
mem_free(ai->ai_canonname);
|
||||||
|
}
|
||||||
|
next = ai->ai_next;
|
||||||
|
mem_free(ai);
|
||||||
|
ai = next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Translates the name of a service location (for example, a host name) and/or
|
||||||
|
* a service name and returns a set of socket addresses and associated
|
||||||
|
* information to be used in creating a socket with which to address the
|
||||||
|
* specified service.
|
||||||
|
* Memory for the result is allocated internally and must be freed by calling
|
||||||
|
* lwip_freeaddrinfo()!
|
||||||
|
*
|
||||||
|
* Due to a limitation in dns_gethostbyname, only the first address of a
|
||||||
|
* host is returned.
|
||||||
|
* Also, service names are not supported (only port numbers)!
|
||||||
|
*
|
||||||
|
* @param nodename descriptive name or address string of the host
|
||||||
|
* (may be NULL -> local address)
|
||||||
|
* @param servname port number as string of NULL
|
||||||
|
* @param hints structure containing input values that set socktype and protocol
|
||||||
|
* @param res pointer to a pointer where to store the result (set to NULL on failure)
|
||||||
|
* @return 0 on success, non-zero on failure
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
lwip_getaddrinfo(const char *nodename, const char *servname,
|
||||||
|
const struct addrinfo *hints, struct addrinfo **res)
|
||||||
|
{
|
||||||
|
err_t err;
|
||||||
|
struct ip_addr addr;
|
||||||
|
struct addrinfo *ai;
|
||||||
|
struct sockaddr_in *sa = NULL;
|
||||||
|
int port_nr = 0;
|
||||||
|
|
||||||
|
if (res == NULL) {
|
||||||
|
return EAI_FAIL;
|
||||||
|
}
|
||||||
|
*res = NULL;
|
||||||
|
if ((nodename == NULL) && (servname == NULL)) {
|
||||||
|
return EAI_NONAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (servname != NULL) {
|
||||||
|
/* service name specified: convert to port number
|
||||||
|
* @todo?: currently, only ASCII integers (port numbers) are supported! */
|
||||||
|
port_nr = atoi(servname);
|
||||||
|
if ((port_nr <= 0) || (port_nr > 0xffff)) {
|
||||||
|
return EAI_SERVICE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nodename != NULL) {
|
||||||
|
/* service location specified, try to resolve */
|
||||||
|
err = netconn_gethostbyname(nodename, &addr);
|
||||||
|
if (err != ERR_OK) {
|
||||||
|
return EAI_FAIL;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* service location specified, use loopback address */
|
||||||
|
addr.addr = INADDR_LOOPBACK;
|
||||||
|
}
|
||||||
|
|
||||||
|
ai = mem_malloc(sizeof(struct addrinfo));
|
||||||
|
if (ai == NULL) {
|
||||||
|
goto memerr;
|
||||||
|
}
|
||||||
|
memset(ai, 0, sizeof(struct addrinfo));
|
||||||
|
sa = mem_malloc(sizeof(struct sockaddr_in));
|
||||||
|
if (sa == NULL) {
|
||||||
|
goto memerr;
|
||||||
|
}
|
||||||
|
memset(sa, 0, sizeof(struct sockaddr_in));
|
||||||
|
/* set up sockaddr */
|
||||||
|
sa->sin_addr.s_addr = addr.addr;
|
||||||
|
sa->sin_family = AF_INET;
|
||||||
|
sa->sin_len = sizeof(struct sockaddr_in);
|
||||||
|
sa->sin_port = htons(port_nr);
|
||||||
|
|
||||||
|
/* set up addrinfo */
|
||||||
|
ai->ai_family = AF_INET;
|
||||||
|
if (hints != NULL) {
|
||||||
|
/* copy socktype & protocol from hints if specified */
|
||||||
|
ai->ai_socktype = hints->ai_socktype;
|
||||||
|
ai->ai_protocol = hints->ai_protocol;
|
||||||
|
}
|
||||||
|
if (nodename != NULL) {
|
||||||
|
/* copy nodename to canonname if specified */
|
||||||
|
size_t namelen = strlen(nodename);
|
||||||
|
ai->ai_canonname = mem_malloc(namelen + 1);
|
||||||
|
if (ai->ai_canonname == NULL) {
|
||||||
|
goto memerr;
|
||||||
|
}
|
||||||
|
MEMCPY(ai->ai_canonname, nodename, namelen);
|
||||||
|
ai->ai_canonname[namelen] = 0;
|
||||||
|
}
|
||||||
|
ai->ai_addrlen = sizeof(struct sockaddr_in);
|
||||||
|
ai->ai_addr = (struct sockaddr*)sa;
|
||||||
|
|
||||||
|
*res = ai;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
memerr:
|
||||||
|
if (ai != NULL) {
|
||||||
|
mem_free(ai);
|
||||||
|
}
|
||||||
|
if (sa != NULL) {
|
||||||
|
mem_free(sa);
|
||||||
|
}
|
||||||
|
return EAI_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* LWIP_DNS && LWIP_SOCKET */
|
||||||
126
src/api/netifapi.c
Normal file
126
src/api/netifapi.c
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* Network Interface Sequential API module
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* 2. 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.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
||||||
|
*
|
||||||
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "lwip/opt.h"
|
||||||
|
|
||||||
|
#if LWIP_NETIF_API /* don't build if not configured for use in lwipopts.h */
|
||||||
|
|
||||||
|
#include "lwip/netifapi.h"
|
||||||
|
#include "lwip/tcpip.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Call netif_add() inside the tcpip_thread context.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
do_netifapi_netif_add( struct netifapi_msg_msg *msg)
|
||||||
|
{
|
||||||
|
if (!netif_add( msg->netif,
|
||||||
|
msg->msg.add.ipaddr,
|
||||||
|
msg->msg.add.netmask,
|
||||||
|
msg->msg.add.gw,
|
||||||
|
msg->msg.add.state,
|
||||||
|
msg->msg.add.init,
|
||||||
|
msg->msg.add.input)) {
|
||||||
|
msg->err = ERR_IF;
|
||||||
|
} else {
|
||||||
|
msg->err = ERR_OK;
|
||||||
|
}
|
||||||
|
TCPIP_NETIFAPI_ACK(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Call the "errtfunc" (or the "voidfunc" if "errtfunc" is NULL) inside the
|
||||||
|
* tcpip_thread context.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
do_netifapi_netif_common( struct netifapi_msg_msg *msg)
|
||||||
|
{
|
||||||
|
if (msg->msg.common.errtfunc!=NULL) {
|
||||||
|
msg->err =
|
||||||
|
msg->msg.common.errtfunc(msg->netif);
|
||||||
|
} else {
|
||||||
|
msg->err = ERR_OK;
|
||||||
|
msg->msg.common.voidfunc(msg->netif);
|
||||||
|
}
|
||||||
|
TCPIP_NETIFAPI_ACK(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Call netif_add() in a thread-safe way by running that function inside the
|
||||||
|
* tcpip_thread context.
|
||||||
|
*
|
||||||
|
* @note for params @see netif_add()
|
||||||
|
*/
|
||||||
|
err_t
|
||||||
|
netifapi_netif_add(struct netif *netif,
|
||||||
|
struct ip_addr *ipaddr,
|
||||||
|
struct ip_addr *netmask,
|
||||||
|
struct ip_addr *gw,
|
||||||
|
void *state,
|
||||||
|
err_t (* init)(struct netif *netif),
|
||||||
|
err_t (* input)(struct pbuf *p, struct netif *netif))
|
||||||
|
{
|
||||||
|
struct netifapi_msg msg;
|
||||||
|
msg.function = do_netifapi_netif_add;
|
||||||
|
msg.msg.netif = netif;
|
||||||
|
msg.msg.msg.add.ipaddr = ipaddr;
|
||||||
|
msg.msg.msg.add.netmask = netmask;
|
||||||
|
msg.msg.msg.add.gw = gw;
|
||||||
|
msg.msg.msg.add.state = state;
|
||||||
|
msg.msg.msg.add.init = init;
|
||||||
|
msg.msg.msg.add.input = input;
|
||||||
|
TCPIP_NETIFAPI(&msg);
|
||||||
|
return msg.msg.err;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* call the "errtfunc" (or the "voidfunc" if "errtfunc" is NULL) in a thread-safe
|
||||||
|
* way by running that function inside the tcpip_thread context.
|
||||||
|
*
|
||||||
|
* @note use only for functions where there is only "netif" parameter.
|
||||||
|
*/
|
||||||
|
err_t
|
||||||
|
netifapi_netif_common( struct netif *netif,
|
||||||
|
void (* voidfunc)(struct netif *netif),
|
||||||
|
err_t (* errtfunc)(struct netif *netif) )
|
||||||
|
{
|
||||||
|
struct netifapi_msg msg;
|
||||||
|
msg.function = do_netifapi_netif_common;
|
||||||
|
msg.msg.netif = netif;
|
||||||
|
msg.msg.msg.common.voidfunc = voidfunc;
|
||||||
|
msg.msg.msg.common.errtfunc = errtfunc;
|
||||||
|
TCPIP_NETIFAPI(&msg);
|
||||||
|
return msg.msg.err;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* LWIP_NETIF_API */
|
||||||
1957
src/api/sockets.c
1957
src/api/sockets.c
File diff suppressed because it is too large
Load Diff
526
src/api/tcpip.c
526
src/api/tcpip.c
@@ -1,8 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* Sequential API Main thread module
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
* Copyright (c) 2001-2004 Swedish Institute of Computer Science.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
* are permitted provided that the following conditions are met:
|
* are permitted provided that the following conditions are met:
|
||||||
*
|
*
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
@@ -11,127 +17,505 @@
|
|||||||
* this list of conditions and the following disclaimer in the documentation
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
* and/or other materials provided with the distribution.
|
* and/or other materials provided with the distribution.
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
* derived from this software without specific prior written permission.
|
* derived from this software without specific prior written permission.
|
||||||
*
|
*
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||||
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
* 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
|
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||||
* OF SUCH DAMAGE.
|
* OF SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
* This file is part of the lwIP TCP/IP stack.
|
||||||
*
|
*
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "lwip/debug.h"
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
#include "lwip/opt.h"
|
||||||
|
|
||||||
#include "lwip/sys.h"
|
#if !NO_SYS /* don't build if not configured for use in lwipopts.h */
|
||||||
|
|
||||||
|
#include "lwip/sys.h"
|
||||||
#include "lwip/memp.h"
|
#include "lwip/memp.h"
|
||||||
#include "lwip/pbuf.h"
|
#include "lwip/pbuf.h"
|
||||||
|
#include "lwip/ip_frag.h"
|
||||||
#include "lwip/ip.h"
|
|
||||||
#include "lwip/udp.h"
|
|
||||||
#include "lwip/tcp.h"
|
#include "lwip/tcp.h"
|
||||||
|
#include "lwip/autoip.h"
|
||||||
|
#include "lwip/dhcp.h"
|
||||||
|
#include "lwip/igmp.h"
|
||||||
|
#include "lwip/dns.h"
|
||||||
#include "lwip/tcpip.h"
|
#include "lwip/tcpip.h"
|
||||||
|
#include "lwip/init.h"
|
||||||
|
#include "netif/etharp.h"
|
||||||
|
#include "netif/ppp_oe.h"
|
||||||
|
|
||||||
static void (* tcpip_init_done)(void *arg) = NULL;
|
/* global variables */
|
||||||
|
static void (* tcpip_init_done)(void *arg);
|
||||||
static void *tcpip_init_done_arg;
|
static void *tcpip_init_done_arg;
|
||||||
static sys_mbox_t mbox;
|
static sys_mbox_t mbox = SYS_MBOX_NULL;
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
#if LWIP_TCPIP_CORE_LOCKING
|
||||||
|
/** The global semaphore to lock the stack. */
|
||||||
|
sys_sem_t lock_tcpip_core;
|
||||||
|
#endif /* LWIP_TCPIP_CORE_LOCKING */
|
||||||
|
|
||||||
|
#if LWIP_TCP
|
||||||
|
/* global variable that shows if the tcp timer is currently scheduled or not */
|
||||||
|
static int tcpip_tcp_timer_active;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Timer callback function that calls tcp_tmr() and reschedules itself.
|
||||||
|
*
|
||||||
|
* @param arg unused argument
|
||||||
|
*/
|
||||||
static void
|
static void
|
||||||
tcpip_tcp_timer(void *arg)
|
tcpip_tcp_timer(void *arg)
|
||||||
{
|
{
|
||||||
tcp_tmr();
|
LWIP_UNUSED_ARG(arg);
|
||||||
sys_timeout(TCP_TMR_INTERVAL, (sys_timeout_handler)tcpip_tcp_timer, NULL);
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
/* call TCP timer handler */
|
||||||
|
tcp_tmr();
|
||||||
|
/* timer still needed? */
|
||||||
|
if (tcp_active_pcbs || tcp_tw_pcbs) {
|
||||||
|
/* restart timer */
|
||||||
|
sys_timeout(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL);
|
||||||
|
} else {
|
||||||
|
/* disable timer */
|
||||||
|
tcpip_tcp_timer_active = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if !NO_SYS
|
||||||
|
/**
|
||||||
|
* Called from TCP_REG when registering a new PCB:
|
||||||
|
* the reason is to have the TCP timer only running when
|
||||||
|
* there are active (or time-wait) PCBs.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
tcp_timer_needed(void)
|
||||||
|
{
|
||||||
|
/* timer is off but needed again? */
|
||||||
|
if (!tcpip_tcp_timer_active && (tcp_active_pcbs || tcp_tw_pcbs)) {
|
||||||
|
/* enable and start timer */
|
||||||
|
tcpip_tcp_timer_active = 1;
|
||||||
|
sys_timeout(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* !NO_SYS */
|
||||||
|
#endif /* LWIP_TCP */
|
||||||
|
|
||||||
|
#if IP_REASSEMBLY
|
||||||
|
/**
|
||||||
|
* Timer callback function that calls ip_reass_tmr() and reschedules itself.
|
||||||
|
*
|
||||||
|
* @param arg unused argument
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
ip_reass_timer(void *arg)
|
||||||
|
{
|
||||||
|
LWIP_UNUSED_ARG(arg);
|
||||||
|
LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip: ip_reass_tmr()\n"));
|
||||||
|
ip_reass_tmr();
|
||||||
|
sys_timeout(IP_TMR_INTERVAL, ip_reass_timer, NULL);
|
||||||
|
}
|
||||||
|
#endif /* IP_REASSEMBLY */
|
||||||
|
|
||||||
|
#if LWIP_ARP
|
||||||
|
/**
|
||||||
|
* Timer callback function that calls etharp_tmr() and reschedules itself.
|
||||||
|
*
|
||||||
|
* @param arg unused argument
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
arp_timer(void *arg)
|
||||||
|
{
|
||||||
|
LWIP_UNUSED_ARG(arg);
|
||||||
|
LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip: etharp_tmr()\n"));
|
||||||
|
etharp_tmr();
|
||||||
|
sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL);
|
||||||
|
}
|
||||||
|
#endif /* LWIP_ARP */
|
||||||
|
|
||||||
|
#if LWIP_DHCP
|
||||||
|
/**
|
||||||
|
* Timer callback function that calls dhcp_coarse_tmr() and reschedules itself.
|
||||||
|
*
|
||||||
|
* @param arg unused argument
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
dhcp_timer_coarse(void *arg)
|
||||||
|
{
|
||||||
|
LWIP_UNUSED_ARG(arg);
|
||||||
|
LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip: dhcp_coarse_tmr()\n"));
|
||||||
|
dhcp_coarse_tmr();
|
||||||
|
sys_timeout(DHCP_COARSE_TIMER_MSECS, dhcp_timer_coarse, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Timer callback function that calls dhcp_fine_tmr() and reschedules itself.
|
||||||
|
*
|
||||||
|
* @param arg unused argument
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
dhcp_timer_fine(void *arg)
|
||||||
|
{
|
||||||
|
LWIP_UNUSED_ARG(arg);
|
||||||
|
LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip: dhcp_fine_tmr()\n"));
|
||||||
|
dhcp_fine_tmr();
|
||||||
|
sys_timeout(DHCP_FINE_TIMER_MSECS, dhcp_timer_fine, NULL);
|
||||||
|
}
|
||||||
|
#endif /* LWIP_DHCP */
|
||||||
|
|
||||||
|
#if LWIP_AUTOIP
|
||||||
|
/**
|
||||||
|
* Timer callback function that calls autoip_tmr() and reschedules itself.
|
||||||
|
*
|
||||||
|
* @param arg unused argument
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
autoip_timer(void *arg)
|
||||||
|
{
|
||||||
|
LWIP_UNUSED_ARG(arg);
|
||||||
|
LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip: autoip_tmr()\n"));
|
||||||
|
autoip_tmr();
|
||||||
|
sys_timeout(AUTOIP_TMR_INTERVAL, autoip_timer, NULL);
|
||||||
|
}
|
||||||
|
#endif /* LWIP_AUTOIP */
|
||||||
|
|
||||||
|
#if LWIP_IGMP
|
||||||
|
/**
|
||||||
|
* Timer callback function that calls igmp_tmr() and reschedules itself.
|
||||||
|
*
|
||||||
|
* @param arg unused argument
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
igmp_timer(void *arg)
|
||||||
|
{
|
||||||
|
LWIP_UNUSED_ARG(arg);
|
||||||
|
LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip: igmp_tmr()\n"));
|
||||||
|
igmp_tmr();
|
||||||
|
sys_timeout(IGMP_TMR_INTERVAL, igmp_timer, NULL);
|
||||||
|
}
|
||||||
|
#endif /* LWIP_IGMP */
|
||||||
|
|
||||||
|
#if LWIP_DNS
|
||||||
|
/**
|
||||||
|
* Timer callback function that calls dns_tmr() and reschedules itself.
|
||||||
|
*
|
||||||
|
* @param arg unused argument
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
dns_timer(void *arg)
|
||||||
|
{
|
||||||
|
LWIP_UNUSED_ARG(arg);
|
||||||
|
LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip: dns_tmr()\n"));
|
||||||
|
dns_tmr();
|
||||||
|
sys_timeout(DNS_TMR_INTERVAL, dns_timer, NULL);
|
||||||
|
}
|
||||||
|
#endif /* LWIP_DNS */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The main lwIP thread. This thread has exclusive access to lwIP core functions
|
||||||
|
* (unless access to them is not locked). Other threads communicate with this
|
||||||
|
* thread using message boxes.
|
||||||
|
*
|
||||||
|
* It also starts all the timers to make sure they are running in the right
|
||||||
|
* thread context.
|
||||||
|
*
|
||||||
|
* @param arg unused argument
|
||||||
|
*/
|
||||||
static void
|
static void
|
||||||
tcpip_thread(void *arg)
|
tcpip_thread(void *arg)
|
||||||
{
|
{
|
||||||
struct tcpip_msg *msg;
|
struct tcpip_msg *msg;
|
||||||
|
LWIP_UNUSED_ARG(arg);
|
||||||
|
|
||||||
ip_init();
|
#if IP_REASSEMBLY
|
||||||
udp_init();
|
sys_timeout(IP_TMR_INTERVAL, ip_reass_timer, NULL);
|
||||||
tcp_init();
|
#endif /* IP_REASSEMBLY */
|
||||||
|
#if LWIP_ARP
|
||||||
|
sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL);
|
||||||
|
#endif /* LWIP_ARP */
|
||||||
|
#if LWIP_DHCP
|
||||||
|
sys_timeout(DHCP_COARSE_TIMER_MSECS, dhcp_timer_coarse, NULL);
|
||||||
|
sys_timeout(DHCP_FINE_TIMER_MSECS, dhcp_timer_fine, NULL);
|
||||||
|
#endif /* LWIP_DHCP */
|
||||||
|
#if LWIP_AUTOIP
|
||||||
|
sys_timeout(AUTOIP_TMR_INTERVAL, autoip_timer, NULL);
|
||||||
|
#endif /* LWIP_AUTOIP */
|
||||||
|
#if LWIP_IGMP
|
||||||
|
sys_timeout(IGMP_TMR_INTERVAL, igmp_timer, NULL);
|
||||||
|
#endif /* LWIP_IGMP */
|
||||||
|
#if LWIP_DNS
|
||||||
|
sys_timeout(DNS_TMR_INTERVAL, dns_timer, NULL);
|
||||||
|
#endif /* LWIP_DNS */
|
||||||
|
|
||||||
sys_timeout(TCP_TMR_INTERVAL, (sys_timeout_handler)tcpip_tcp_timer, NULL);
|
if (tcpip_init_done != NULL) {
|
||||||
|
|
||||||
if(tcpip_init_done != NULL) {
|
|
||||||
tcpip_init_done(tcpip_init_done_arg);
|
tcpip_init_done(tcpip_init_done_arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
while(1) { /* MAIN Loop */
|
LOCK_TCPIP_CORE();
|
||||||
|
while (1) { /* MAIN Loop */
|
||||||
sys_mbox_fetch(mbox, (void *)&msg);
|
sys_mbox_fetch(mbox, (void *)&msg);
|
||||||
switch(msg->type) {
|
switch (msg->type) {
|
||||||
|
#if LWIP_NETCONN
|
||||||
case TCPIP_MSG_API:
|
case TCPIP_MSG_API:
|
||||||
DEBUGF(TCPIP_DEBUG, ("tcpip_thread: API message %p\n", (void *)msg));
|
LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: API message %p\n", (void *)msg));
|
||||||
api_msg_input(msg->msg.apimsg);
|
msg->msg.apimsg->function(&(msg->msg.apimsg->msg));
|
||||||
break;
|
break;
|
||||||
case TCPIP_MSG_INPUT:
|
#endif /* LWIP_NETCONN */
|
||||||
DEBUGF(TCPIP_DEBUG, ("tcpip_thread: IP packet %p\n", (void *)msg));
|
|
||||||
ip_input(msg->msg.inp.p, msg->msg.inp.netif);
|
case TCPIP_MSG_INPKT:
|
||||||
|
LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: PACKET %p\n", (void *)msg));
|
||||||
|
#if LWIP_ARP
|
||||||
|
if (msg->msg.inp.netif->flags & NETIF_FLAG_ETHARP) {
|
||||||
|
ethernet_input(msg->msg.inp.p, msg->msg.inp.netif);
|
||||||
|
} else
|
||||||
|
#endif /* LWIP_ARP */
|
||||||
|
{ ip_input(msg->msg.inp.p, msg->msg.inp.netif);
|
||||||
|
}
|
||||||
|
memp_free(MEMP_TCPIP_MSG_INPKT, msg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
#if LWIP_NETIF_API
|
||||||
|
case TCPIP_MSG_NETIFAPI:
|
||||||
|
LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: Netif API message %p\n", (void *)msg));
|
||||||
|
msg->msg.netifapimsg->function(&(msg->msg.netifapimsg->msg));
|
||||||
|
break;
|
||||||
|
#endif /* LWIP_NETIF_API */
|
||||||
|
|
||||||
|
case TCPIP_MSG_CALLBACK:
|
||||||
|
LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: CALLBACK %p\n", (void *)msg));
|
||||||
|
msg->msg.cb.f(msg->msg.cb.ctx);
|
||||||
|
memp_free(MEMP_TCPIP_MSG_API, msg);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TCPIP_MSG_TIMEOUT:
|
||||||
|
LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: TIMEOUT %p\n", (void *)msg));
|
||||||
|
|
||||||
|
if(msg->msg.tmo.msecs != 0xffffffff)
|
||||||
|
sys_timeout (msg->msg.tmo.msecs, msg->msg.tmo.h, msg->msg.tmo.arg);
|
||||||
|
else
|
||||||
|
sys_untimeout (msg->msg.tmo.h, msg->msg.tmo.arg);
|
||||||
|
memp_free(MEMP_TCPIP_MSG_API, msg);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
memp_freep(MEMP_TCPIP_MSG, msg);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
|
/**
|
||||||
|
* Pass a received packet to tcpip_thread for input processing
|
||||||
|
*
|
||||||
|
* @param p the received packet, p->payload pointing to the Ethernet header or
|
||||||
|
* to an IP header (if netif doesn't got NETIF_FLAG_ETHARP flag)
|
||||||
|
* @param inp the network interface on which the packet was received
|
||||||
|
*/
|
||||||
err_t
|
err_t
|
||||||
tcpip_input(struct pbuf *p, struct netif *inp)
|
tcpip_input(struct pbuf *p, struct netif *inp)
|
||||||
{
|
{
|
||||||
struct tcpip_msg *msg;
|
struct tcpip_msg *msg;
|
||||||
|
|
||||||
msg = memp_mallocp(MEMP_TCPIP_MSG);
|
if (mbox != SYS_MBOX_NULL) {
|
||||||
if(msg == NULL) {
|
msg = memp_malloc(MEMP_TCPIP_MSG_INPKT);
|
||||||
pbuf_free(p);
|
if (msg == NULL) {
|
||||||
return ERR_MEM;
|
return ERR_MEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
msg->type = TCPIP_MSG_INPKT;
|
||||||
|
msg->msg.inp.p = p;
|
||||||
|
msg->msg.inp.netif = inp;
|
||||||
|
if (sys_mbox_trypost(mbox, msg) != ERR_OK) {
|
||||||
|
memp_free(MEMP_TCPIP_MSG_INPKT, msg);
|
||||||
|
return ERR_MEM;
|
||||||
|
}
|
||||||
|
return ERR_OK;
|
||||||
}
|
}
|
||||||
|
return ERR_VAL;
|
||||||
msg->type = TCPIP_MSG_INPUT;
|
|
||||||
msg->msg.inp.p = p;
|
|
||||||
msg->msg.inp.netif = inp;
|
|
||||||
sys_mbox_post(mbox, msg);
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
void
|
/**
|
||||||
tcpip_apimsg(struct api_msg *apimsg)
|
* Call a specific function in the thread context of
|
||||||
|
* tcpip_thread for easy access synchronization.
|
||||||
|
* A function called in that way may access lwIP core code
|
||||||
|
* without fearing concurrent access.
|
||||||
|
*
|
||||||
|
* @param f the function to call
|
||||||
|
* @param ctx parameter passed to f
|
||||||
|
* @param block 1 to block until the request is posted, 0 to non-blocking mode
|
||||||
|
* @return ERR_OK if the function was called, another err_t if not
|
||||||
|
*/
|
||||||
|
err_t
|
||||||
|
tcpip_callback_with_block(void (*f)(void *ctx), void *ctx, u8_t block)
|
||||||
{
|
{
|
||||||
struct tcpip_msg *msg;
|
struct tcpip_msg *msg;
|
||||||
msg = memp_mallocp(MEMP_TCPIP_MSG);
|
|
||||||
if(msg == NULL) {
|
if (mbox != SYS_MBOX_NULL) {
|
||||||
memp_free(MEMP_API_MSG, apimsg);
|
msg = memp_malloc(MEMP_TCPIP_MSG_API);
|
||||||
return;
|
if (msg == NULL) {
|
||||||
|
return ERR_MEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
msg->type = TCPIP_MSG_CALLBACK;
|
||||||
|
msg->msg.cb.f = f;
|
||||||
|
msg->msg.cb.ctx = ctx;
|
||||||
|
if (block) {
|
||||||
|
sys_mbox_post(mbox, msg);
|
||||||
|
} else {
|
||||||
|
if (sys_mbox_trypost(mbox, msg) != ERR_OK) {
|
||||||
|
memp_free(MEMP_TCPIP_MSG_API, msg);
|
||||||
|
return ERR_MEM;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ERR_OK;
|
||||||
}
|
}
|
||||||
msg->type = TCPIP_MSG_API;
|
return ERR_VAL;
|
||||||
msg->msg.apimsg = apimsg;
|
|
||||||
sys_mbox_post(mbox, msg);
|
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
|
err_t
|
||||||
|
tcpip_timeout(u32_t msecs, sys_timeout_handler h, void *arg)
|
||||||
|
{
|
||||||
|
struct tcpip_msg *msg;
|
||||||
|
|
||||||
|
if (mbox != SYS_MBOX_NULL) {
|
||||||
|
msg = memp_malloc(MEMP_TCPIP_MSG_API);
|
||||||
|
if (msg == NULL) {
|
||||||
|
return ERR_MEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
msg->type = TCPIP_MSG_TIMEOUT;
|
||||||
|
msg->msg.tmo.msecs = msecs;
|
||||||
|
msg->msg.tmo.h = h;
|
||||||
|
msg->msg.tmo.arg = arg;
|
||||||
|
sys_mbox_post(mbox, msg);
|
||||||
|
return ERR_OK;
|
||||||
|
}
|
||||||
|
return ERR_VAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if LWIP_NETCONN
|
||||||
|
/**
|
||||||
|
* Call the lower part of a netconn_* function
|
||||||
|
* This function is then running in the thread context
|
||||||
|
* of tcpip_thread and has exclusive access to lwIP core code.
|
||||||
|
*
|
||||||
|
* @param apimsg a struct containing the function to call and its parameters
|
||||||
|
* @return ERR_OK if the function was called, another err_t if not
|
||||||
|
*/
|
||||||
|
err_t
|
||||||
|
tcpip_apimsg(struct api_msg *apimsg)
|
||||||
|
{
|
||||||
|
struct tcpip_msg msg;
|
||||||
|
|
||||||
|
if (mbox != SYS_MBOX_NULL) {
|
||||||
|
msg.type = TCPIP_MSG_API;
|
||||||
|
msg.msg.apimsg = apimsg;
|
||||||
|
sys_mbox_post(mbox, &msg);
|
||||||
|
sys_arch_sem_wait(apimsg->msg.conn->op_completed, 0);
|
||||||
|
return ERR_OK;
|
||||||
|
}
|
||||||
|
return ERR_VAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if LWIP_TCPIP_CORE_LOCKING
|
||||||
|
/**
|
||||||
|
* Call the lower part of a netconn_* function
|
||||||
|
* This function has exclusive access to lwIP core code by locking it
|
||||||
|
* before the function is called.
|
||||||
|
*
|
||||||
|
* @param apimsg a struct containing the function to call and its parameters
|
||||||
|
* @return ERR_OK (only for compatibility fo tcpip_apimsg())
|
||||||
|
*/
|
||||||
|
err_t
|
||||||
|
tcpip_apimsg_lock(struct api_msg *apimsg)
|
||||||
|
{
|
||||||
|
LOCK_TCPIP_CORE();
|
||||||
|
apimsg->function(&(apimsg->msg));
|
||||||
|
UNLOCK_TCPIP_CORE();
|
||||||
|
return ERR_OK;
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif /* LWIP_TCPIP_CORE_LOCKING */
|
||||||
|
#endif /* LWIP_NETCONN */
|
||||||
|
|
||||||
|
#if LWIP_NETIF_API
|
||||||
|
#if !LWIP_TCPIP_CORE_LOCKING
|
||||||
|
/**
|
||||||
|
* Much like tcpip_apimsg, but calls the lower part of a netifapi_*
|
||||||
|
* function.
|
||||||
|
*
|
||||||
|
* @param netifapimsg a struct containing the function to call and its parameters
|
||||||
|
* @return error code given back by the function that was called
|
||||||
|
*/
|
||||||
|
err_t
|
||||||
|
tcpip_netifapi(struct netifapi_msg* netifapimsg)
|
||||||
|
{
|
||||||
|
struct tcpip_msg msg;
|
||||||
|
|
||||||
|
if (mbox != SYS_MBOX_NULL) {
|
||||||
|
netifapimsg->msg.sem = sys_sem_new(0);
|
||||||
|
if (netifapimsg->msg.sem == SYS_SEM_NULL) {
|
||||||
|
netifapimsg->msg.err = ERR_MEM;
|
||||||
|
return netifapimsg->msg.err;
|
||||||
|
}
|
||||||
|
|
||||||
|
msg.type = TCPIP_MSG_NETIFAPI;
|
||||||
|
msg.msg.netifapimsg = netifapimsg;
|
||||||
|
sys_mbox_post(mbox, &msg);
|
||||||
|
sys_sem_wait(netifapimsg->msg.sem);
|
||||||
|
sys_sem_free(netifapimsg->msg.sem);
|
||||||
|
return netifapimsg->msg.err;
|
||||||
|
}
|
||||||
|
return ERR_VAL;
|
||||||
|
}
|
||||||
|
#else /* !LWIP_TCPIP_CORE_LOCKING */
|
||||||
|
/**
|
||||||
|
* Call the lower part of a netifapi_* function
|
||||||
|
* This function has exclusive access to lwIP core code by locking it
|
||||||
|
* before the function is called.
|
||||||
|
*
|
||||||
|
* @param netifapimsg a struct containing the function to call and its parameters
|
||||||
|
* @return ERR_OK (only for compatibility fo tcpip_netifapi())
|
||||||
|
*/
|
||||||
|
err_t
|
||||||
|
tcpip_netifapi_lock(struct netifapi_msg* netifapimsg)
|
||||||
|
{
|
||||||
|
LOCK_TCPIP_CORE();
|
||||||
|
netifapimsg->function(&(netifapimsg->msg));
|
||||||
|
UNLOCK_TCPIP_CORE();
|
||||||
|
return netifapimsg->msg.err;
|
||||||
|
}
|
||||||
|
#endif /* !LWIP_TCPIP_CORE_LOCKING */
|
||||||
|
#endif /* LWIP_NETIF_API */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize this module:
|
||||||
|
* - initialize all sub modules
|
||||||
|
* - start the tcpip_thread
|
||||||
|
*
|
||||||
|
* @param initfunc a function to call when tcpip_thread is running and finished initializing
|
||||||
|
* @param arg argument to pass to initfunc
|
||||||
|
*/
|
||||||
void
|
void
|
||||||
tcpip_init(void (* initfunc)(void *), void *arg)
|
tcpip_init(void (* initfunc)(void *), void *arg)
|
||||||
{
|
{
|
||||||
|
lwip_init();
|
||||||
|
|
||||||
tcpip_init_done = initfunc;
|
tcpip_init_done = initfunc;
|
||||||
tcpip_init_done_arg = arg;
|
tcpip_init_done_arg = arg;
|
||||||
mbox = sys_mbox_new();
|
mbox = sys_mbox_new(TCPIP_MBOX_SIZE);
|
||||||
sys_thread_new((void *)tcpip_thread, NULL);
|
#if LWIP_TCPIP_CORE_LOCKING
|
||||||
|
lock_tcpip_core = sys_sem_new(1);
|
||||||
|
#endif /* LWIP_TCPIP_CORE_LOCKING */
|
||||||
|
|
||||||
|
sys_thread_new(TCPIP_THREAD_NAME, tcpip_thread, NULL, TCPIP_THREAD_STACKSIZE, TCPIP_THREAD_PRIO);
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* !NO_SYS */
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
The 6502 code is far from complete.
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __CC_H__
|
|
||||||
#define __CC_H__
|
|
||||||
|
|
||||||
typedef unsigned char u8_t;
|
|
||||||
typedef signed char s8_t;
|
|
||||||
typedef unsigned short u16_t;
|
|
||||||
typedef signed short s16_t;
|
|
||||||
typedef unsigned long u32_t;
|
|
||||||
typedef signed long s32_t;
|
|
||||||
|
|
||||||
#define PACK_STRUCT_BEGIN
|
|
||||||
#define PACK_STRUCT_STRUCT
|
|
||||||
#define PACK_STRUCT_END
|
|
||||||
#define PACK_STRUCT_FIELD(x) x
|
|
||||||
|
|
||||||
#endif /* __CC_H__ */
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __CPU_H__
|
|
||||||
#define __CPU_H__
|
|
||||||
|
|
||||||
#define BYTE_ORDER LITTLE_ENDIAN
|
|
||||||
|
|
||||||
#endif /* __CPU_H__ */
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __LIB_H__
|
|
||||||
#define __LIB_H__
|
|
||||||
|
|
||||||
int strlen(const char *str);
|
|
||||||
int strncmp(const char *str1, const char *str2, int len);
|
|
||||||
|
|
||||||
#endif /* __LIB_H__ */
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __PERF_H__
|
|
||||||
#define __PERF_H__
|
|
||||||
|
|
||||||
#define PERF_START /* null definition */
|
|
||||||
#define PERF_STOP(x) /* null definition */
|
|
||||||
|
|
||||||
#endif /* __PERF_H__ */
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __SYS_C64_H__
|
|
||||||
#define __SYS_C64_H__
|
|
||||||
|
|
||||||
#define SYS_MBOX_NULL 0
|
|
||||||
|
|
||||||
typedef int sys_sem_t;
|
|
||||||
typedef int sys_mbox_t;
|
|
||||||
typedef int sys_thread_t;
|
|
||||||
|
|
||||||
#endif /* __SYS_C64_H__ */
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* These are generic implementations of various library functions used
|
|
||||||
* throughout the lwIP code. When porting, those should be optimized
|
|
||||||
* for the particular processor architecture, preferably coded in
|
|
||||||
* assembler.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,120 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <c64.h>
|
|
||||||
#include <time.h>
|
|
||||||
|
|
||||||
#include "lwip/sys.h"
|
|
||||||
#include "lwip/def.h"
|
|
||||||
|
|
||||||
struct sys_timeouts timeouts;
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
void
|
|
||||||
sys_arch_block(u16_t time)
|
|
||||||
{
|
|
||||||
u16_t ticks;
|
|
||||||
|
|
||||||
ticks = time * (CLK_TCK / 1000) + clock();
|
|
||||||
printf("ticks %d\n", ticks);
|
|
||||||
|
|
||||||
while(clock() != ticks);
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
sys_mbox_t
|
|
||||||
sys_mbox_new(void)
|
|
||||||
{
|
|
||||||
return SYS_MBOX_NULL;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
void
|
|
||||||
sys_mbox_free(sys_mbox_t mbox)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
void
|
|
||||||
sys_mbox_post(sys_mbox_t mbox, void *data)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
u16_t
|
|
||||||
sys_arch_mbox_fetch(sys_mbox_t mbox, void **data, u16_t timeout)
|
|
||||||
{
|
|
||||||
sys_arch_block(timeout);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
sys_sem_t
|
|
||||||
sys_sem_new(u8_t count)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
u16_t
|
|
||||||
sys_arch_sem_wait(sys_sem_t sem, u16_t timeout)
|
|
||||||
{
|
|
||||||
sys_arch_block(timeout);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
void
|
|
||||||
sys_sem_signal(sys_sem_t sem)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
void
|
|
||||||
sys_sem_free(sys_sem_t sem)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
void
|
|
||||||
sys_init(void)
|
|
||||||
{
|
|
||||||
timeouts.next = NULL;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
struct sys_timeouts *
|
|
||||||
sys_arch_timeouts(void)
|
|
||||||
{
|
|
||||||
return &timeouts;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
void
|
|
||||||
sys_thread_new(void (* function)(void *arg), void *arg)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
6502/ - Architectural files for the 6502 CPU.
|
|
||||||
|
|
||||||
c16x/ - Architectural files for the C16x/ST10 uC.
|
|
||||||
Supports lwIP Raw API only.
|
|
||||||
CS8900a Ethernet driver for 16-bit mode.
|
|
||||||
|
|
||||||
msvc6/ - Architectural files for Microsoft Visual C++ 6.0.
|
|
||||||
|
|
||||||
rtxc/ - Architectural files for the RTXC operating system.
|
|
||||||
|
|
||||||
unix/ - Architectural files for testing on unix-like systems
|
|
||||||
(assuming gcc and pthreads).
|
|
||||||
|
|
||||||
v2pro/ - Architectural files for the Xilinx Virtex-II PRO device with
|
|
||||||
embedded PowerPC 405 Processor. Supports lwIP Raw API only.
|
|
||||||
(requires V2PDK - http://www.xilinx.com/ise/vii_pro/kit.htm)
|
|
||||||
|
|
||||||
|
|
||||||
Each subdirectory (may) also include:
|
|
||||||
|
|
||||||
perf.c - Optional file that should be implemented when running
|
|
||||||
performance tests of lwIP.
|
|
||||||
|
|
||||||
sys.c - Implementation of the operating system emulation layer.
|
|
||||||
|
|
||||||
include/ - Architectural specific header files.
|
|
||||||
|
|
||||||
netif/ - Architectural specific network interfaces.
|
|
||||||
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
This directory contains architecture and compiler specific stuff for porting lwIP
|
|
||||||
to the C16x and ST10 microcontrollers. The compiler specifics are for Tasking EDE
|
|
||||||
v7.5r2.
|
|
||||||
|
|
||||||
The sequential API has not been ported; it's function are empties. If someone is
|
|
||||||
interested in adding a sequential API, please contact the author (see below).
|
|
||||||
|
|
||||||
Besides this, a Cirrus (formerly Crystal Semiconductors) CS8900a Ethernet driver
|
|
||||||
is included, which assumes a 16-bit data bus configuration. When porting this
|
|
||||||
driver, note that the CS8900a does not support interrupts in 8-bit mode.
|
|
||||||
|
|
||||||
Leon Woestenberg
|
|
||||||
<leon.woestenberg@axon.tv>
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
#ifndef __CC_H__
|
|
||||||
#define __CC_H__
|
|
||||||
|
|
||||||
typedef unsigned char u8_t;
|
|
||||||
typedef signed char s8_t;
|
|
||||||
typedef unsigned short u16_t;
|
|
||||||
typedef signed short s16_t;
|
|
||||||
typedef unsigned long u32_t;
|
|
||||||
typedef signed long s32_t;
|
|
||||||
|
|
||||||
typedef u32_t mem_ptr_t;
|
|
||||||
|
|
||||||
// LW: Supported in at least >=v7.5 r2, but lwIP worked without the "_packed" attribute already
|
|
||||||
#define PACK_STRUCT_BEGIN _packed
|
|
||||||
#define PACK_STRUCT_STRUCT
|
|
||||||
#define PACK_STRUCT_END
|
|
||||||
#define PACK_STRUCT_FIELD(x) x
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* __CC_H__ */
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
#ifndef __CPU_H__
|
|
||||||
#define __CPU_H__
|
|
||||||
|
|
||||||
#define BYTE_ORDER LITTLE_ENDIAN
|
|
||||||
|
|
||||||
#endif /* __CPU_H__ */
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001, Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
* $Id: lib.h,v 1.2 2002/12/19 10:37:08 jani Exp $
|
|
||||||
*/
|
|
||||||
#ifndef __LIB_H__
|
|
||||||
#define __LIB_H__
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* __LIB_H__ */
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001, Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
* $Id: perf.h,v 1.1 2002/11/29 11:03:34 likewise Exp $
|
|
||||||
*/
|
|
||||||
#ifndef __PERF_H__
|
|
||||||
#define __PERF_H__
|
|
||||||
|
|
||||||
#define PERF_START /* null definition */
|
|
||||||
#define PERF_STOP(x) /* null definition */
|
|
||||||
|
|
||||||
#endif /* __PERF_H__ */
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
#ifndef __SYS_ARCH_H__
|
|
||||||
#define __SYS_ARCH_H__
|
|
||||||
|
|
||||||
#define SEMA int
|
|
||||||
#define QUEUE int
|
|
||||||
#define TASK int
|
|
||||||
|
|
||||||
#define SYS_MBOX_NULL (QUEUE)0
|
|
||||||
#define SYS_SEM_NULL (SEMA)0
|
|
||||||
|
|
||||||
typedef SEMA sys_sem_t;
|
|
||||||
typedef QUEUE sys_mbox_t;
|
|
||||||
typedef TASK sys_thread_t;
|
|
||||||
|
|
||||||
#endif /* __SYS_ARCH_H__ */
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Leon Woestenberg <leon.woestenberg@axon.tv>
|
|
||||||
* Copyright (c) 2001-2003 Axon Digital Design B.V., The Netherlands.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Leon Woestenberg <leon.woestenberg@axon.tv>
|
|
||||||
*
|
|
||||||
* This is a device driver for the Crystal Semiconductor CS8900
|
|
||||||
* chip in combination with the lwIP stack.
|
|
||||||
*
|
|
||||||
* This is work under development. Please coordinate changes
|
|
||||||
* and requests with Leon Woestenberg <leon.woestenberg@axon.tv>
|
|
||||||
*
|
|
||||||
* The Swedish Institute of Computer Science and Adam Dunkels
|
|
||||||
* are specifically granted permission to redistribute this
|
|
||||||
* source code under any conditions they seem fit.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __NETIF_CS8900IF_H__
|
|
||||||
#define __NETIF_CS8900IF_H__
|
|
||||||
|
|
||||||
#include "lwip/netif.h"
|
|
||||||
|
|
||||||
/* interface statistics gathering
|
|
||||||
* such as collisions, dropped packets, missed packets
|
|
||||||
* 0 = no statistics, minimal memory requirements, no overhead
|
|
||||||
* 1 = statistics on, but some have large granularity (0x200), very low overhead
|
|
||||||
* 2 = statistics on, updated on every call to cs8900_service(), low overhead
|
|
||||||
*/
|
|
||||||
#define CS8900_STATS 2
|
|
||||||
|
|
||||||
struct cs8900if
|
|
||||||
{
|
|
||||||
//struct eth_addr *ethaddr;
|
|
||||||
u8_t needs_service;
|
|
||||||
u8_t use_polling;
|
|
||||||
#if (CS8900_STATS > 0)
|
|
||||||
u32_t interrupts; // #interrupt requests of cs8900
|
|
||||||
u32_t missed; // #packets on medium that could not enter cs8900a chip due to buffer shortage
|
|
||||||
u32_t dropped; // #packets dropped after they have been received in chip buffer
|
|
||||||
u32_t collisions; // #collisions on medium when transmitting packets
|
|
||||||
u32_t sentpackets; // #number of sent packets
|
|
||||||
u32_t sentbytes; // #number of sent bytes
|
|
||||||
#endif
|
|
||||||
/* Add whatever per-interface state that is needed here. */
|
|
||||||
};
|
|
||||||
|
|
||||||
void cs8900if_init(struct netif *);
|
|
||||||
void cs8900if_service(struct netif *);
|
|
||||||
void cs8900if_input(struct netif *netif);
|
|
||||||
err_t cs8900if_output(struct netif *netif, struct pbuf *p, struct ip_addr *ipaddr);
|
|
||||||
|
|
||||||
void cs8900_send_debug(unsigned char *p, unsigned int len);
|
|
||||||
|
|
||||||
#endif /* __NETIF_CS8900IF_H__ */
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001, Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
* $Id: lib.c,v 1.2 2002/12/19 10:37:07 jani Exp $
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* These are generic implementations of various library functions used
|
|
||||||
* throughout the lwIP code. When porting, those should be optimized
|
|
||||||
* for the particular processor architecture, preferably coded in
|
|
||||||
* assembler.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "lwip/arch.h"
|
|
||||||
|
|
||||||
#if BYTE_ORDER == LITTLE_ENDIAN
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
u16_t
|
|
||||||
htons(u16_t n)
|
|
||||||
{
|
|
||||||
return ((n & 0xff) << 8) | ((n & 0xff00) >> 8);
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
u16_t
|
|
||||||
ntohs(u16_t n)
|
|
||||||
{
|
|
||||||
return htons(n);
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
u32_t
|
|
||||||
htonl(u32_t n)
|
|
||||||
{
|
|
||||||
return ((n & 0xff) << 24) |
|
|
||||||
((n & 0xff00) << 8) |
|
|
||||||
((n & 0xff0000) >> 8) |
|
|
||||||
((n & 0xff000000) >> 24);
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
u32_t
|
|
||||||
ntohl(u32_t n)
|
|
||||||
{
|
|
||||||
return htonl(n);
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
#endif /* BYTE_ORDER == LITTLE_ENDIAN */
|
|
||||||
@@ -1,844 +0,0 @@
|
|||||||
/** @file
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2001, 2002 Leon Woestenberg <leon.woestenberg@axon.tv>
|
|
||||||
* Copyright (c) 2001, 2002 Axon Digital Design B.V., The Netherlands.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Leon Woestenberg <leon.woestenberg@axon.tv>
|
|
||||||
*
|
|
||||||
* This is a device driver for the Crystal Semiconductor CS8900
|
|
||||||
* chip in combination with the lwIP stack.
|
|
||||||
*
|
|
||||||
* This is work under development. Please coordinate changes
|
|
||||||
* and requests with Leon Woestenberg <leon.woestenberg@axon.tv>
|
|
||||||
*
|
|
||||||
* The Swedish Institute of Computer Science and Adam Dunkels
|
|
||||||
* are specifically granted permission to redistribute this
|
|
||||||
* source code under any conditions they seem fit.
|
|
||||||
*
|
|
||||||
* A quick function roadmap:
|
|
||||||
*
|
|
||||||
* cs8900_*() are low level, cs8900 hardware specific functions.
|
|
||||||
* These are declared static in the device driver source and
|
|
||||||
* SHOULD NOT need to be called from outside this source.
|
|
||||||
*
|
|
||||||
* cs8900if_*() are the lwIP network interface functions.
|
|
||||||
*
|
|
||||||
* cs8900_interrupt() is an early interrupt service routine (ISR).
|
|
||||||
* It merely sets a flag to indicate the cs8900 needs servicing.
|
|
||||||
* (This function MAY be tied to an interrupt vector, IF present).
|
|
||||||
*
|
|
||||||
* cs8900_service() is the actual interrupt event service routine.
|
|
||||||
* It must be called whenever the cs8900 needs servicing. It MAY
|
|
||||||
* be polled safely (so, you do NOT NEED interrupt support.)
|
|
||||||
*
|
|
||||||
* cs8900_init() sets up the cs8900, using its register set. When
|
|
||||||
* using the driver on your particular hardware platform, make sure
|
|
||||||
* the register setups match.
|
|
||||||
* Function is called from cs8900if_init().
|
|
||||||
*
|
|
||||||
* cs8900_input() transfers a received packet from the chip.
|
|
||||||
* Function is called from cs8900if_input().
|
|
||||||
*
|
|
||||||
* cs8900_output() transfers a packet to the chip for transmission.
|
|
||||||
* Function is called from cs8900if_output().
|
|
||||||
*
|
|
||||||
* cs8900if_init() initializes the lwIP network interface, and
|
|
||||||
* calls cs8900_init() to initialize the hardware.
|
|
||||||
* Function is called from lwIP.
|
|
||||||
*
|
|
||||||
* cs8900if_service() is the service routine, which must be called
|
|
||||||
* upon the need for service, or on a regular basis, in order to
|
|
||||||
* service the Ethernet chip.
|
|
||||||
*
|
|
||||||
* cs8900if_input() calls cs8900_input() to get a received packet
|
|
||||||
* and then forwards the packet to protocol(s) handler(s).
|
|
||||||
* Function is called from cs8900_service().
|
|
||||||
*
|
|
||||||
* cs8900if_output() resolves the hardware address, then
|
|
||||||
* calls cs8900_output() to transfer the packet.
|
|
||||||
* Function is called from lwIP.
|
|
||||||
*
|
|
||||||
* Future development:
|
|
||||||
*
|
|
||||||
* Split the generic Ethernet functionality (a lot of the
|
|
||||||
* cs8900if_*() functions) and the actual cs8900a dependencies.
|
|
||||||
*
|
|
||||||
* Enhance the interrupt handler to service the Ethernet
|
|
||||||
* chip (to decrease latency); support early packet
|
|
||||||
* inspection (during reception) to early drop unwanted
|
|
||||||
* packets, minimize chip buffer use and maximize throughput.
|
|
||||||
*
|
|
||||||
* Statistics gathering, currently under development.
|
|
||||||
* SNMP support, currently under development.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "lwip/debug.h"
|
|
||||||
|
|
||||||
#include "lwip/opt.h"
|
|
||||||
#include "lwip/def.h"
|
|
||||||
#include "lwip/mem.h"
|
|
||||||
#include "lwip/pbuf.h"
|
|
||||||
#include "lwip/stats.h"
|
|
||||||
#include "lwip/sys.h"
|
|
||||||
#include "netif/etharp.h"
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
// include some debugging help
|
|
||||||
# define DBG_LEVEL 1
|
|
||||||
# include "leds.h"
|
|
||||||
# include "display.h"
|
|
||||||
//# include "page.h"
|
|
||||||
# define LED_NEED_SERVICE LED_FP1
|
|
||||||
#else
|
|
||||||
// no debugging
|
|
||||||
# define leds_on()
|
|
||||||
# define leds_off()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "cs8900if.h"
|
|
||||||
#if LWIP_SNMP > 0
|
|
||||||
# include "snmp.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Define those to better describe your network interface
|
|
||||||
#define IFNAME0 'e'
|
|
||||||
#define IFNAME1 'n'
|
|
||||||
|
|
||||||
static const struct eth_addr ethbroadcast = {{0xffU,0xffU,0xffU,0xffU,0xffU,0xffU}};
|
|
||||||
|
|
||||||
// Forward declarations
|
|
||||||
static err_t cs8900_output(struct netif *netif, struct pbuf *p);
|
|
||||||
static struct pbuf *cs8900_input(struct netif *netif);
|
|
||||||
static void cs8900_service(struct netif *netif);
|
|
||||||
static u32_t cs8900_chksum(void *dataptr, int len);
|
|
||||||
|
|
||||||
// Define these to match your hardware setup
|
|
||||||
#define MEM_BASE 0x00E000
|
|
||||||
#define IO_BASE 0x800
|
|
||||||
#define INT_NR 0x00
|
|
||||||
|
|
||||||
#define RXTXREG *((volatile u16_t *)(MEM_BASE + IO_BASE))
|
|
||||||
#define TXCMD *((volatile u16_t *)(MEM_BASE + IO_BASE + 0x04))
|
|
||||||
#define TXLENGTH *((volatile u16_t *)(MEM_BASE + IO_BASE + 0x06))
|
|
||||||
#define ISQ *((volatile u16_t *)(MEM_BASE + IO_BASE + 0x08))
|
|
||||||
#define PACKETPP *((volatile u16_t *)(MEM_BASE + IO_BASE + 0x0A))
|
|
||||||
#define PPDATA *((volatile u16_t *)(MEM_BASE + IO_BASE + 0x0C))
|
|
||||||
|
|
||||||
// CS8900 PacketPage register offsets
|
|
||||||
#define CS_PP_EISA 0x0000 // EISA Registration number of CS8900
|
|
||||||
#define CS_PP_PRODID 0x0002 // Product ID Number
|
|
||||||
#define CS_PP_IOBASE 0x0020 // I/O Base Address
|
|
||||||
#define CS_PP_INTNUM 0x0022 // Interrupt number (0,1,2, or 3)
|
|
||||||
#define CS_PP_RXCFG 0x0102 // Receiver Configuration
|
|
||||||
#define CS_PP_RXCTL 0x0104 // Receiver Control
|
|
||||||
#define CS_PP_TXCFG 0x0106 // Transmit Configuration
|
|
||||||
#define CS_PP_BUFCFG 0x010A // Buffer Configuration
|
|
||||||
#define CS_PP_LINECTL 0x0112 // Line Control Register offset
|
|
||||||
#define CS_PP_SELFCTL 0x0114 // Self Control
|
|
||||||
#define CS_PP_BUSCTL 0x0116 // Bus Control
|
|
||||||
#define CS_PP_TESTCTL 0x0118 // Test Control
|
|
||||||
#define CS_PP_ISQ 0x0120 // Interrupt status queue
|
|
||||||
#define CS_PP_RXEVENT 0x0124 // Receiver Event
|
|
||||||
#define CS_PP_TX_EVENT 0x0128 // Transmitter Event
|
|
||||||
#define CS_PP_BUF_EVENT 0x012C // Buffer Event
|
|
||||||
#define CS_PP_RXMISS 0x0130 // Receiver Miss Counter
|
|
||||||
#define CS_PP_TXCOL 0x0132 // Transmit Collision Counter
|
|
||||||
#define CS_PP_LINESTATUS 0x0134 // Line Status
|
|
||||||
#define CS_PP_SELFTEST 0x0136 // Self Status
|
|
||||||
#define CS_PP_BUSSTATUS 0x0138 // Bus Status
|
|
||||||
#define CS_PP_TXCMD 0x0144 // Transmit Command Request
|
|
||||||
#define CS_PP_TXLEN 0x0146 // Transmit Length
|
|
||||||
#define CS_PP_IA1 0x0158 // Individual Address (IA)
|
|
||||||
#define CS_PP_IA2 0x015A // Individual Address (IA)
|
|
||||||
#define CS_PP_IA3 0x015C // Individual Address (IA)
|
|
||||||
|
|
||||||
#define CS_PP_RXSTATUS 0x0400 // Receive Status
|
|
||||||
#define CS_PP_RXLEN 0x0402 // Receive Length
|
|
||||||
#define CS_PP_RXFRAME 0x0404 // Receive Frame Location
|
|
||||||
#define CS_PP_TXFRAME 0x0A00 // Transmit Frame Location
|
|
||||||
|
|
||||||
|
|
||||||
// removed interrupt from library
|
|
||||||
#if 0
|
|
||||||
// hardware interrupt vector handler
|
|
||||||
_interrupt(0x18) void cs8900_interrupt(void)
|
|
||||||
{
|
|
||||||
struct cs8900if *cs8900if = cs8900if_netif->state;
|
|
||||||
// network interface is configured?
|
|
||||||
if (cs8900if != NULL)
|
|
||||||
{
|
|
||||||
// chip needs service
|
|
||||||
cs8900if->needs_service = 1;
|
|
||||||
#if (CS8900_STATS > 0)
|
|
||||||
cs8900if->interrupts++;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#ifdef LED_NEED_SERVICE
|
|
||||||
leds_on(LED_NEED_SERVICE);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// cs8900_init()
|
|
||||||
//
|
|
||||||
// initializes the CS8900A chip
|
|
||||||
//
|
|
||||||
static void cs8900_init(struct netif *netif)
|
|
||||||
{
|
|
||||||
#ifdef LED_NEED_SERVICE
|
|
||||||
leds_off(LED_NEED_SERVICE);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// set RESET bit
|
|
||||||
PACKETPP = CS_PP_SELFCTL;
|
|
||||||
PPDATA = 0x0055U;
|
|
||||||
|
|
||||||
// { the RESET bit will be cleared by the cs8900a
|
|
||||||
// as a result of the reset }
|
|
||||||
// RESET bit cleared?
|
|
||||||
while((PPDATA & 0x0040U) != 0); // TODO: add timeout
|
|
||||||
|
|
||||||
// { after full initialization of the cs8900a
|
|
||||||
// the INITD bit will be set }
|
|
||||||
|
|
||||||
PACKETPP = CS_PP_SELFTEST;
|
|
||||||
// INITD bit still clear?
|
|
||||||
while ((PPDATA & 0x0080U) == 0); // TODO: add timeout
|
|
||||||
// { INITD bit is set }
|
|
||||||
|
|
||||||
// SIBUSY bit still set?
|
|
||||||
while ((PPDATA & 0x0100U) == 0x0100); // TODO: add timeout
|
|
||||||
// { SIBUSY bit clear }
|
|
||||||
|
|
||||||
#if 1
|
|
||||||
{
|
|
||||||
u16_t dummy;
|
|
||||||
// datasheet section 3.3.3
|
|
||||||
dummy = *(u16_t *)(MEM_BASE + IO_BASE + 0x0D);
|
|
||||||
// Dummy read, put chip in 16-bit mode
|
|
||||||
dummy = *(u16_t *)(MEM_BASE + IO_BASE + 0x0D);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Set MAC address
|
|
||||||
PACKETPP = CS_PP_IA1;
|
|
||||||
PPDATA = (u16_t)(netif->hwaddr[0]) | (u16_t)(netif->hwaddr[1] << 8U);
|
|
||||||
PACKETPP = CS_PP_IA2;
|
|
||||||
PPDATA = (u16_t)(netif->hwaddr[2]) | (u16_t)(netif->hwaddr[3] << 8U);
|
|
||||||
PACKETPP = CS_PP_IA3;
|
|
||||||
PPDATA = (u16_t)(netif->hwaddr[4]) | (u16_t)(netif->hwaddr[5] << 8U);
|
|
||||||
|
|
||||||
// accept valid unicast or broadcast frames
|
|
||||||
PACKETPP = CS_PP_RXCTL;
|
|
||||||
PPDATA = (0x0005U | 0x0800U/*broadcast*/ | 0x0400U/*individual*/ | 0x0100U/*RxOK*/);
|
|
||||||
|
|
||||||
// enable receive interrupt
|
|
||||||
PACKETPP = CS_PP_RXCFG;
|
|
||||||
PPDATA = (0x0003U | 0x0100U/*RXIRQ*/);
|
|
||||||
|
|
||||||
// disable transmit interrupt (is default)
|
|
||||||
PACKETPP = CS_PP_TXCFG;
|
|
||||||
PPDATA = (0x0007U | 0);
|
|
||||||
|
|
||||||
// use interrupt number 0
|
|
||||||
PACKETPP = CS_PP_INTNUM;
|
|
||||||
PPDATA = (0x0000U);
|
|
||||||
|
|
||||||
// generate interrupt event on:
|
|
||||||
// - the RxMISS counter reaches 0x200, or
|
|
||||||
// - a received frame is lost
|
|
||||||
PACKETPP = CS_PP_BUFCFG;
|
|
||||||
PPDATA = (0x000bU |
|
|
||||||
#if (CS8900_STATS > 0) // interrupt before counter overflow
|
|
||||||
(0x2000U/*MissOvfloiE*/ | 0x1000U/*TxColOvfloiE*/) |
|
|
||||||
#endif
|
|
||||||
#if (CS8900_STATS > 1) // interrupt on counter increment
|
|
||||||
(0x0400U/*RxMissiE*/) |
|
|
||||||
#endif
|
|
||||||
0x0000);
|
|
||||||
|
|
||||||
// enable interrupt generation
|
|
||||||
PACKETPP = CS_PP_BUSCTL;
|
|
||||||
PPDATA = (0x0017U | 0x8000U/*EnableIRQ*/);
|
|
||||||
|
|
||||||
// enable:
|
|
||||||
// - receiver
|
|
||||||
// - transmitter
|
|
||||||
PACKETPP = CS_PP_LINECTL;
|
|
||||||
PPDATA = (0x0013U | 0x0080U/*SerTxOn*/ | 0x0040U/*SerRxOn*/);
|
|
||||||
}
|
|
||||||
|
|
||||||
static err_t cs8900_output(struct netif *netif, struct pbuf *p)
|
|
||||||
{
|
|
||||||
int tries = 0;
|
|
||||||
|
|
||||||
// exit if link has failed
|
|
||||||
PACKETPP = CS_PP_LINESTATUS;
|
|
||||||
if ((PPDATA & 0x0080U/*LinkOK*/) == 0) return ERR_CONN; // no Ethernet link
|
|
||||||
|
|
||||||
/* issue 'transmit' command to CS8900 */
|
|
||||||
TXCMD = 0x00C9U;
|
|
||||||
/* send length (in bytes) of packet to send */
|
|
||||||
TXLENGTH = p->tot_len;
|
|
||||||
|
|
||||||
PACKETPP = CS_PP_BUSSTATUS;
|
|
||||||
// not ready for transmission and still within 100 retries?
|
|
||||||
while(((PPDATA & 0x0100U/*Rdy4TxNOW*/) == 0) && (tries++ < 100))
|
|
||||||
{
|
|
||||||
// throw away the last committed received frame
|
|
||||||
PACKETPP = CS_PP_RXCFG;
|
|
||||||
PPDATA = (0x0003U | 0x0040U/*Skip_1*/ | 0x0100U/*RxOKiE*/);
|
|
||||||
PACKETPP = CS_PP_BUSSTATUS;
|
|
||||||
/* cs8900if->dropped++; // CHECK: we do not know if we actually will drop a frame here */
|
|
||||||
}
|
|
||||||
// ready to transmit?
|
|
||||||
if((PPDATA & 0x0100U/*Rdy4TxNOW*/) != 0)
|
|
||||||
{
|
|
||||||
// q traverses through linked list of pbuf's
|
|
||||||
struct pbuf *q;
|
|
||||||
for(q = p; q != NULL; q = q->next)
|
|
||||||
{
|
|
||||||
u16_t i;
|
|
||||||
u16_t *ptr = (u16_t *)q->payload;
|
|
||||||
// Send the data from the pbuf to the interface, one pbuf at a
|
|
||||||
// time. The size of the data in each pbuf is kept in the ->len
|
|
||||||
// variable.
|
|
||||||
for(i = 0; i < q->len; i += 2)
|
|
||||||
{
|
|
||||||
RXTXREG = *ptr++;
|
|
||||||
}
|
|
||||||
#if (CS8900_STATS > 0)
|
|
||||||
((struct cs8900if *)netif->state)->sentbytes += q->len;
|
|
||||||
#endif
|
|
||||||
#if LWIP_SNMP > 0
|
|
||||||
snmp_add_ifoutoctets(p->tot_len);
|
|
||||||
#endif
|
|
||||||
#if (CS8900_STATS > 0)
|
|
||||||
((struct cs8900if *)netif->state)->sentpackets++;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// { not ready to transmit!? }
|
|
||||||
#if LWIP_SNMP > 0
|
|
||||||
snmp_inc_ifoutdiscards();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Move a received packet from the cs8900 into a new pbuf.
|
|
||||||
*
|
|
||||||
* Must be called after reading an ISQ event containing the
|
|
||||||
* "Receiver Event" register, before reading new ISQ events.
|
|
||||||
*
|
|
||||||
* This function copies a frame from the CS8900A.
|
|
||||||
* It is designed failsafe:
|
|
||||||
* - It does not assume a frame is actually present.
|
|
||||||
* - It checks for non-zero length
|
|
||||||
* - It does not overflow the frame buffer
|
|
||||||
*/
|
|
||||||
static struct pbuf *cs8900_input(struct netif *netif)
|
|
||||||
{
|
|
||||||
struct pbuf *p = NULL, *q = NULL;
|
|
||||||
u16_t len = 0;
|
|
||||||
u16_t event_type;
|
|
||||||
u16_t i;
|
|
||||||
u16_t *ptr = NULL;
|
|
||||||
|
|
||||||
// read RxStatus
|
|
||||||
event_type = RXTXREG;
|
|
||||||
|
|
||||||
// correctly received frame, either broadcast or individual address?
|
|
||||||
// TODO: maybe defer these conditions to cs8900_input()
|
|
||||||
if ((event_type & 0x0100U/*RxOK*/) && (event_type & 0x0c00U/*Broadcast | Individual*/))
|
|
||||||
{
|
|
||||||
#if LWIP_SNMP > 0
|
|
||||||
// update number of received MAC-unicast and non-MAC-unicast packets
|
|
||||||
if (event_type & 0x0400U/*Individual*/)
|
|
||||||
{
|
|
||||||
snmp_inc_ifinucastpkts();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
snmp_inc_ifinnucastpkts();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
event_type = 0;
|
|
||||||
// read RxLength
|
|
||||||
len = RXTXREG;
|
|
||||||
DEBUGF(NETIF_DEBUG, ("cs8900_input: packet len %u\n", len));
|
|
||||||
#if LWIP_SNMP > 0
|
|
||||||
snmp_add_ifinoctets(len);
|
|
||||||
#endif
|
|
||||||
// positive length?
|
|
||||||
if (len > 0)
|
|
||||||
{
|
|
||||||
// allocate a pbuf chain with total length 'len'
|
|
||||||
p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
|
|
||||||
if (p != 0)
|
|
||||||
{
|
|
||||||
for (q = p; q != 0; q = q->next)
|
|
||||||
{
|
|
||||||
DEBUGF(NETIF_DEBUG, ("cs8900_input: pbuf @%p len %u\n", q, q->len));
|
|
||||||
ptr = q->payload;
|
|
||||||
// TODO: CHECK: what if q->len is odd? we don't use the last byte?
|
|
||||||
for (i = 0; i < (q->len + 1) / 2; i++)
|
|
||||||
{
|
|
||||||
*ptr = RXTXREG;
|
|
||||||
ptr++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// could not allocate a pbuf
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// skip received frame
|
|
||||||
// TODO: maybe do not skip the frame at this point in time?
|
|
||||||
PACKETPP = CS_PP_RXCFG;
|
|
||||||
PPDATA = (0x0003U | 0x0100U/*RxOKiE*/ | 0x0040U/*Skip_1*/);
|
|
||||||
#if (CS8900_STATS > 0)
|
|
||||||
((struct cs8900if *)netif->state)->dropped++;
|
|
||||||
#endif
|
|
||||||
#if LWIP_SNMP > 0
|
|
||||||
snmp_inc_ifindiscards();
|
|
||||||
#endif
|
|
||||||
len = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// length was zero
|
|
||||||
else
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* To be called when the cs8900a needs service. Does
|
|
||||||
* not assume the cs8900a needs service. Does test the
|
|
||||||
* cs8900a whether it needs service.
|
|
||||||
*
|
|
||||||
* As such, may be used robustly called as a deferred
|
|
||||||
* (or "late") interrupt handler, or may be called in
|
|
||||||
* a loop to implement polling, or both.
|
|
||||||
*
|
|
||||||
* Use cs8900if_service() from your application instead
|
|
||||||
* of this function.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static void cs8900_service(struct netif *netif)
|
|
||||||
{
|
|
||||||
// amount of ISQ's to handle (> 0) in one cs8900_service() call
|
|
||||||
unsigned char events2service = 1;
|
|
||||||
// NOTES:
|
|
||||||
// static, so only initialized to zero at program start.
|
|
||||||
// irq_status will always hold the last ISQ event register that
|
|
||||||
// still needs service. As such, we may leave this function if
|
|
||||||
// we encounter an event we cannot service yet, and return later
|
|
||||||
// to try to service it.
|
|
||||||
static u16_t irq_status = 0x0000U;
|
|
||||||
|
|
||||||
// The "cs8900_needs_service" flag indicates whether any events
|
|
||||||
// still need to be serviced.
|
|
||||||
// clear flag here.
|
|
||||||
// a receive interrupt can, *concurrently with this function*,
|
|
||||||
// set this flag on new ISQ event occurences.
|
|
||||||
// we will re-evaluate the correct setting of this flag at
|
|
||||||
// function exit (below).
|
|
||||||
((struct cs8900if *)netif->state)->needs_service = 0;
|
|
||||||
#ifdef LED_NEED_SERVICE
|
|
||||||
leds_off(LED_NEED_SERVICE);
|
|
||||||
#endif
|
|
||||||
// no unhandled irq_status left?
|
|
||||||
if (irq_status == 0x0000U)
|
|
||||||
{
|
|
||||||
// read ISQ register
|
|
||||||
irq_status = ISQ;
|
|
||||||
}
|
|
||||||
// ISQ interrupt event, and allowed to service in this loop?
|
|
||||||
while ((irq_status != 0x0000U) && (events2service-- > 0))
|
|
||||||
{
|
|
||||||
// investigate event
|
|
||||||
if ((irq_status & 0x003fU) == 0x0004U/*Receiver Event*/)
|
|
||||||
{
|
|
||||||
// correctly received frame, either broadcast or individual address
|
|
||||||
// TODO: think where these checks should appear: here or in cs8900_input()
|
|
||||||
if ((irq_status & 0x0100U/*RxOK*/) && (irq_status & 0x0c00U/*Broadcast | Individual*/))
|
|
||||||
{
|
|
||||||
// read the frame from the cs8900a
|
|
||||||
cs8900if_input(netif);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// skip this frame
|
|
||||||
PACKETPP = CS_PP_RXCFG;
|
|
||||||
PPDATA |= 0x0040U/*Skip_1*/;
|
|
||||||
#if (CS8900_STATS > 0)
|
|
||||||
((struct cs8900if *)netif->state)->dropped++;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#if (CS8900_STATS > 0)
|
|
||||||
else if ((irq_status & 0x003fU) == 0x0010U/*RxMISS Event*/)
|
|
||||||
{
|
|
||||||
((struct cs8900if *)netif->state)->missed += (irq_status >> 6);
|
|
||||||
}
|
|
||||||
else if ((irq_status & 0x003fU) == 0x0012U/*TxCOL Event*/)
|
|
||||||
{
|
|
||||||
((struct cs8900if *)netif->state)->collisions += (irq_status >> 6);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
// read ISQ register
|
|
||||||
irq_status = ISQ;
|
|
||||||
}
|
|
||||||
|
|
||||||
// we did not deplete the ISQ?
|
|
||||||
if (irq_status != 0x0000U)
|
|
||||||
{
|
|
||||||
// the cs8900a still needs service
|
|
||||||
((struct cs8900if *)netif->state)->needs_service = 1;
|
|
||||||
#ifdef LED_NEED_SERVICE
|
|
||||||
leds_on(LED_NEED_SERVICE);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#if (CS8900_STATS > 1)
|
|
||||||
// read RxMiss Counter (zeroes itself upon read)
|
|
||||||
PACKETPP = CS_PP_RXMISS;
|
|
||||||
((struct cs8900if *)netif->state)->missed += (PPDATA >> 6);
|
|
||||||
// read RxCol Counter (zeroes itself upon read)
|
|
||||||
PACKETPP = CS_PP_TXCOL;
|
|
||||||
((struct cs8900if *)netif->state)->collisions += (PPDATA >> 6);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Service the CS8900.
|
|
||||||
*
|
|
||||||
* Can be called in a polling manner, or only after the CS8900 has raised
|
|
||||||
* an interrupt request.
|
|
||||||
*
|
|
||||||
* @param netif The lwIP network interface data structure belonging to this device.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void cs8900if_service(struct netif *netif)
|
|
||||||
{
|
|
||||||
// is there a reason to call the service routine?
|
|
||||||
if ((((struct cs8900if *)netif->state)->needs_service) ||
|
|
||||||
(((struct cs8900if *)netif->state)->use_polling))
|
|
||||||
{
|
|
||||||
cs8900_service(netif);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Writing an IP packet (to be transmitted) to the CS8900.
|
|
||||||
*
|
|
||||||
* Before writing a frame to the CS8900, the ARP module is asked to resolve the
|
|
||||||
* Ethernet MAC address. The ARP module might undertake actions to resolve the
|
|
||||||
* address first, and queue this packet for later transmission.
|
|
||||||
*
|
|
||||||
* @param netif The lwIP network interface data structure belonging to this device.
|
|
||||||
* @param p pbuf to be transmitted (or the first pbuf of a chained list of pbufs).
|
|
||||||
* @param ipaddr destination IP address.
|
|
||||||
*
|
|
||||||
* @internal It uses the function cs8900_input() that should handle the actual
|
|
||||||
* reception of bytes from the network interface.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
err_t cs8900if_output(struct netif *netif, struct pbuf *p, struct ip_addr *ipaddr)
|
|
||||||
{
|
|
||||||
struct cs8900if *cs8900if = netif->state;
|
|
||||||
p = etharp_output(netif, ipaddr, p);
|
|
||||||
/* network hardware address obtained? */
|
|
||||||
if (p != NULL)
|
|
||||||
{
|
|
||||||
/* send out the packet */
|
|
||||||
cs8900_output(netif, p);
|
|
||||||
p = NULL;
|
|
||||||
}
|
|
||||||
// { p == NULL }
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* we cannot tell if the packet was sent, the packet could have been queued */
|
|
||||||
/* on an ARP entry that was already pending. */
|
|
||||||
}
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Read a received packet from the CS8900.
|
|
||||||
*
|
|
||||||
* This function should be called when a packet is received by the CS8900
|
|
||||||
* and is fully available to read. It moves the received packet to a pbuf
|
|
||||||
* which is forwarded to the IP network layer or ARP module. It transmits
|
|
||||||
* a resulting ARP reply or queued packet.
|
|
||||||
*
|
|
||||||
* @param netif The lwIP network interface to read from.
|
|
||||||
*
|
|
||||||
* @internal Uses cs8900_input() to move the packet from the CS8900 to a
|
|
||||||
* newly allocated pbuf.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void cs8900if_input(struct netif *netif)
|
|
||||||
{
|
|
||||||
struct cs8900if *cs8900if = netif->state;
|
|
||||||
struct eth_hdr *ethhdr = NULL;
|
|
||||||
struct pbuf *p = NULL, *q = NULL;
|
|
||||||
|
|
||||||
/* move received packet into a new pbuf */
|
|
||||||
p = cs8900_input(netif);
|
|
||||||
/* no packet could be read */
|
|
||||||
if (p == NULL) {
|
|
||||||
/* silently ignore this */
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
/* points to packet payload, which starts with an Ethernet header */
|
|
||||||
ethhdr = p->payload;
|
|
||||||
|
|
||||||
q = NULL;
|
|
||||||
switch(htons(ethhdr->type)) {
|
|
||||||
/* IP packet? */
|
|
||||||
case ETHTYPE_IP:
|
|
||||||
/* update ARP table, obtain first queued packet */
|
|
||||||
q = etharp_ip_input(netif, p);
|
|
||||||
/* skip Ethernet header */
|
|
||||||
pbuf_header(p, -14);
|
|
||||||
/* pass to network layer */
|
|
||||||
netif->input(p, netif);
|
|
||||||
break;
|
|
||||||
/* ARP packet? */
|
|
||||||
case ETHTYPE_ARP:
|
|
||||||
/* pass p to ARP module, get ARP reply or ARP queued packet */
|
|
||||||
q = etharp_arp_input(netif, (struct eth_addr *)&netif->hwaddr, p);
|
|
||||||
break;
|
|
||||||
/* unsupported Ethernet packet type */
|
|
||||||
default:
|
|
||||||
/* free pbuf */
|
|
||||||
pbuf_free(p);
|
|
||||||
p = NULL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* send out the ARP reply or ARP queued packet */
|
|
||||||
if (q != NULL) {
|
|
||||||
/* q pbuf has been succesfully sent? */
|
|
||||||
if (cs8900_output(netif, q) == ERR_OK)
|
|
||||||
{
|
|
||||||
pbuf_free(q);
|
|
||||||
q = NULL;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* TODO: re-queue packet in the ARP cache here (?) */
|
|
||||||
pbuf_free(q);
|
|
||||||
q = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Initialize the CS8900 Ethernet MAC/PHY device driver.
|
|
||||||
*
|
|
||||||
* @param netif The lwIP network interface data structure belonging to this device.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void cs8900if_init(struct netif *netif)
|
|
||||||
{
|
|
||||||
struct cs8900if *cs8900if;
|
|
||||||
|
|
||||||
cs8900if = mem_malloc(sizeof(struct cs8900if));
|
|
||||||
if(cs8900if == NULL) return;
|
|
||||||
|
|
||||||
// initialize lwip network interface
|
|
||||||
netif->name[0] = IFNAME0;
|
|
||||||
netif->name[1] = IFNAME1;
|
|
||||||
netif->output = cs8900if_output;
|
|
||||||
netif->linkoutput = cs8900_output;
|
|
||||||
|
|
||||||
// initialize cs8900 specific interface structure
|
|
||||||
netif->state = cs8900if;
|
|
||||||
|
|
||||||
// initially assume no ISQ event
|
|
||||||
cs8900if->needs_service = 0;
|
|
||||||
// set to 1 if polling method is used
|
|
||||||
cs8900if->use_polling = 0;
|
|
||||||
|
|
||||||
#if (CS8900_STATS > 0)
|
|
||||||
// number of interrupt service routine calls
|
|
||||||
cs8900if->interrupts = 0;
|
|
||||||
cs8900if->missed = 0;
|
|
||||||
cs8900if->dropped = 0;
|
|
||||||
cs8900if->sentpackets = 0;
|
|
||||||
cs8900if->sentbytes = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// intialize the cs8900a chip
|
|
||||||
cs8900_init(netif);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 1
|
|
||||||
/**
|
|
||||||
* Dump an array of bytes inside a UDP message's data field.
|
|
||||||
*
|
|
||||||
* It is a self-contained function, independent of higher protocol layers or other
|
|
||||||
* functions, so it allows you to debug these higher layers, such as lwIP.
|
|
||||||
*
|
|
||||||
* @param p pointer to an array of bytes, at least with length 'len'
|
|
||||||
* @param len number of bytes available at the address pointed to by 'p'
|
|
||||||
*/
|
|
||||||
void cs8900_send_debug(unsigned char *p, unsigned int len)
|
|
||||||
{
|
|
||||||
int tries = 0, i;
|
|
||||||
|
|
||||||
// network interface state
|
|
||||||
extern struct netif *ethif;
|
|
||||||
|
|
||||||
// exit if link has failed
|
|
||||||
PACKETPP = CS_PP_LINESTATUS;
|
|
||||||
if ((PPDATA & 0x0080U/*LinkOK*/) == 0) return; // TODO: find a correct error code
|
|
||||||
|
|
||||||
// transmit command
|
|
||||||
TXCMD = 0x00C9U;
|
|
||||||
// send at least 60 bytes
|
|
||||||
TXLENGTH = (14 + 20 + 8 + len < 60) ? 60 : (14 + 20 + 8 + len);
|
|
||||||
|
|
||||||
PACKETPP = CS_PP_BUSSTATUS;
|
|
||||||
// not ready for transmission and still within 100 retries?
|
|
||||||
while (((PPDATA & 0x0100U/*Rdy4TxNOW*/) == 0) && (tries++ < 100))
|
|
||||||
{
|
|
||||||
// throw away the last committed received frame
|
|
||||||
PACKETPP = CS_PP_RXCFG;
|
|
||||||
PPDATA = (0x0003U | 0x0040U/*Skip_1*/ | 0x0100U/*RxOKiE*/);
|
|
||||||
PACKETPP = CS_PP_BUSSTATUS;
|
|
||||||
/* cs8900if->dropped++; CHECK: we do not know if we actually will drop a frame here, do we? */
|
|
||||||
}
|
|
||||||
// ready to transmit?
|
|
||||||
if((PPDATA & 0x0100U/*Rdy4TxNOW*/) != 0)
|
|
||||||
{
|
|
||||||
u16_t data, checksum = 0;
|
|
||||||
u32_t udp_checksum = 0;
|
|
||||||
|
|
||||||
// destination Ethernet address
|
|
||||||
RXTXREG = 0xa000U;
|
|
||||||
RXTXREG = 0xc524U;
|
|
||||||
RXTXREG = 0x6d72U;
|
|
||||||
// source Ethernet address
|
|
||||||
RXTXREG = htons(((u16_t)ethif->hwaddr[0] << 8U) | (u16_t)ethif->hwaddr[1]);
|
|
||||||
RXTXREG = htons(((u16_t)ethif->hwaddr[2] << 8U) | (u16_t)ethif->hwaddr[3]);
|
|
||||||
RXTXREG = htons(((u16_t)ethif->hwaddr[4] << 8U) | (u16_t)ethif->hwaddr[5]);
|
|
||||||
// frame type
|
|
||||||
RXTXREG = htons(0x0800);
|
|
||||||
// TOS, version
|
|
||||||
RXTXREG = htons(data = ((0x40 | 0x05) << 8) | 0x00);
|
|
||||||
checksum += data;
|
|
||||||
// length
|
|
||||||
RXTXREG = htons(data = 20 + 8 + len);
|
|
||||||
checksum += data;
|
|
||||||
// identifier
|
|
||||||
RXTXREG = htons(data = 0);
|
|
||||||
checksum += data;
|
|
||||||
// fragment offset
|
|
||||||
RXTXREG = htons(data = 0);
|
|
||||||
checksum += data;
|
|
||||||
// TTL, UDP protocol
|
|
||||||
RXTXREG = htons(data = (255U << 8) | 17U);
|
|
||||||
checksum += data;
|
|
||||||
|
|
||||||
checksum += (htonl(ethif->ip_addr.addr) & 0xffff0000U) >> 16;
|
|
||||||
checksum += (htonl(ethif->ip_addr.addr) & 0x0000ffffU);
|
|
||||||
checksum += 0xc0a8U;
|
|
||||||
checksum += 0x0001U;
|
|
||||||
checksum += 6; // LW: kludge/hack: checksum calculation seems to be wrong somehow
|
|
||||||
// LW: this seems (?) to fix it
|
|
||||||
// checksum
|
|
||||||
RXTXREG = htons(~checksum);
|
|
||||||
|
|
||||||
// source IP
|
|
||||||
RXTXREG = htons((htonl(ethif->ip_addr.addr) & 0xffff0000U) >> 16);
|
|
||||||
// source IP
|
|
||||||
RXTXREG = htons( htonl(ethif->ip_addr.addr) & 0x0000ffffU);
|
|
||||||
// destination IP
|
|
||||||
RXTXREG = htons(0xc0a8U);
|
|
||||||
// destination IP
|
|
||||||
RXTXREG = htons(0x0001U);
|
|
||||||
// source port 3000
|
|
||||||
RXTXREG = htons(3000U);
|
|
||||||
// destination port 3000
|
|
||||||
RXTXREG = htons(3000U);
|
|
||||||
// UDP length
|
|
||||||
RXTXREG = htons(len);
|
|
||||||
// UDP checksum (not present)
|
|
||||||
|
|
||||||
udp_checksum = (htonl(ethif->ip_addr.addr) & 0xffff0000U) >> 16;
|
|
||||||
udp_checksum += (htonl(ethif->ip_addr.addr) & 0x0000ffffU);
|
|
||||||
udp_checksum += 0xc0a8U;
|
|
||||||
udp_checksum += 0x0001U;
|
|
||||||
udp_checksum += 0x0011U;
|
|
||||||
udp_checksum += (8 + len);
|
|
||||||
udp_checksum += 3000;
|
|
||||||
udp_checksum += 3000;
|
|
||||||
udp_checksum += (8 + len);
|
|
||||||
udp_checksum += cs8900_chksum(p, len);
|
|
||||||
while(udp_checksum >> 16) {
|
|
||||||
udp_checksum = (udp_checksum & 0xffffUL) + (udp_checksum >> 16);
|
|
||||||
}
|
|
||||||
|
|
||||||
RXTXREG = htons(~(udp_checksum & 0xffff));
|
|
||||||
// UDP data
|
|
||||||
for (i = 0; i < len; i += 2)
|
|
||||||
{
|
|
||||||
RXTXREG = htons((p[i] << 8) | p[i + 1]);
|
|
||||||
}
|
|
||||||
// pad to 60 bytes
|
|
||||||
while (i < 60)
|
|
||||||
{
|
|
||||||
RXTXREG = 0;
|
|
||||||
i += 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static u32_t cs8900_chksum(void *dataptr, int len)
|
|
||||||
{
|
|
||||||
u32_t acc = 0;
|
|
||||||
u16_t *ptr = (u16_t *)dataptr;
|
|
||||||
|
|
||||||
for(acc = 0; len > 1; len -= 2) {
|
|
||||||
acc += *ptr;
|
|
||||||
ptr++;
|
|
||||||
}
|
|
||||||
/* add up any odd byte */
|
|
||||||
if(len == 1) {
|
|
||||||
acc += htons((u16_t)((*(u8_t *)ptr) & 0xffU) << 8);
|
|
||||||
}
|
|
||||||
return acc;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001, Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
* $Id: perf.c,v 1.1 2002/11/29 11:03:34 likewise Exp $
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "arch/perf.h"
|
|
||||||
|
|
||||||
void
|
|
||||||
perf_init(char *fname)
|
|
||||||
{
|
|
||||||
if (fname); // LEON: prevent warning
|
|
||||||
}
|
|
||||||
@@ -1,137 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001, Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
* $Id: sys_arch.c,v 1.1 2002/11/29 11:03:34 likewise Exp $
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "lwip/def.h"
|
|
||||||
#include "lwip/sys.h"
|
|
||||||
#include "lwip/mem.h"
|
|
||||||
|
|
||||||
//#include "timers.h"
|
|
||||||
|
|
||||||
static struct sys_timeouts timeouts;
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
sys_mbox_t
|
|
||||||
sys_mbox_new(void)
|
|
||||||
{
|
|
||||||
return SYS_MBOX_NULL;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
void
|
|
||||||
sys_mbox_free(sys_mbox_t mbox)
|
|
||||||
{
|
|
||||||
if (mbox); // LEON: prevent warning
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
void
|
|
||||||
sys_mbox_post(sys_mbox_t mbox, void *data)
|
|
||||||
{
|
|
||||||
if (mbox); // LEON: prevent warning
|
|
||||||
if (data); // LEON: prevent warning
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
u16_t
|
|
||||||
sys_arch_mbox_fetch(sys_mbox_t mbox, void **msg, u16_t timeout)
|
|
||||||
{
|
|
||||||
if (mbox); // LEON: prevent warning
|
|
||||||
if (msg); // LEON: prevent warning
|
|
||||||
if (timeout); // LEON: prevent warning
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
sys_sem_t
|
|
||||||
sys_sem_new(u8_t count)
|
|
||||||
{
|
|
||||||
if (count);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
u16_t
|
|
||||||
sys_arch_sem_wait(sys_sem_t sem, u16_t timeout)
|
|
||||||
{
|
|
||||||
if (sem);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
void
|
|
||||||
sys_sem_signal(sys_sem_t sem)
|
|
||||||
{
|
|
||||||
if (sem);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
void
|
|
||||||
sys_sem_free(sys_sem_t sem)
|
|
||||||
{
|
|
||||||
if (sem);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
sys_init(void)
|
|
||||||
{
|
|
||||||
timeouts.next = NULL;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct sys_timeouts *
|
|
||||||
sys_arch_timeouts(void)
|
|
||||||
{
|
|
||||||
return &timeouts;
|
|
||||||
}
|
|
||||||
|
|
||||||
u8_t
|
|
||||||
sys_timeout_u32_t(u32_t msecs, sys_timeout_handler h, void *data) // LEON: arg 1 was unsigned int
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
// WAS: return timer_obtain(msecs, h, data);
|
|
||||||
// RE-ENABLE IF DHCP_TIMER_CALLBACKS
|
|
||||||
#if DHCP_TIMER_CALLBACKS
|
|
||||||
#error DHCP_TIMER_CALLBACKS not supported!
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
sys_thread_new(void (* function)(void *arg), void *arg)
|
|
||||||
{
|
|
||||||
if (arg); // LW
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
void
|
|
||||||
sys_main(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
#pragma pack(push,1)
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __ARCH_CC_H__
|
|
||||||
#define __ARCH_CC_H__
|
|
||||||
|
|
||||||
typedef unsigned char u8_t;
|
|
||||||
typedef signed char s8_t;
|
|
||||||
/*typedef unsigned short u8_t;
|
|
||||||
typedef signed short s8_t; */
|
|
||||||
typedef unsigned short u16_t;
|
|
||||||
typedef signed short s16_t;
|
|
||||||
typedef unsigned long u32_t;
|
|
||||||
typedef signed long s32_t;
|
|
||||||
|
|
||||||
typedef u32_t mem_ptr_t;
|
|
||||||
|
|
||||||
#define PACK_STRUCT_FIELD(x) x
|
|
||||||
#define PACK_STRUCT_STRUCT
|
|
||||||
#pragma warning(disable: 4103)
|
|
||||||
|
|
||||||
#endif /* __ARCH_CC_H__ */
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __ARCH_CPU_H__
|
|
||||||
#define __ARCH_CPU_H__
|
|
||||||
|
|
||||||
#ifndef BYTE_ORDER
|
|
||||||
#define BYTE_ORDER LITTLE_ENDIAN
|
|
||||||
#endif /* BYTE_ORDER */
|
|
||||||
|
|
||||||
#endif /* __ARCH_CPU_H__ */
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
#pragma pack(pop)
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __ARCH_LIB_H__
|
|
||||||
#define __ARCH_LIB_H__
|
|
||||||
|
|
||||||
#ifndef _STRING_H_
|
|
||||||
#ifndef _STRING_H
|
|
||||||
int strlen(const char *str);
|
|
||||||
int strncmp(const char *str1, const char *str2, int len);
|
|
||||||
#endif /* _STRING_H */
|
|
||||||
#endif /* _STRING_H_ */
|
|
||||||
|
|
||||||
#endif /* __ARCH_LIB_H__ */
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __ARCH_PERF_H__
|
|
||||||
#define __ARCH_PERF_H__
|
|
||||||
|
|
||||||
#ifdef PERF
|
|
||||||
#define PERF_START
|
|
||||||
#define PERF_STOP(x)
|
|
||||||
|
|
||||||
/*#define PERF_START do { \
|
|
||||||
struct tms __perf_start, __perf_end; \
|
|
||||||
times(&__perf_start)
|
|
||||||
#define PERF_STOP(x) times(&__perf_end); \
|
|
||||||
perf_print_times(&__perf_start, &__perf_end, x);\
|
|
||||||
} while(0)*/
|
|
||||||
#else /* PERF */
|
|
||||||
#define PERF_START /* null definition */
|
|
||||||
#define PERF_STOP(x) /* null definition */
|
|
||||||
#endif /* PERF */
|
|
||||||
|
|
||||||
void perf_print(unsigned long c1l, unsigned long c1h,
|
|
||||||
unsigned long c2l, unsigned long c2h,
|
|
||||||
char *key);
|
|
||||||
|
|
||||||
void perf_print_times(struct tms *start, struct tms *end, char *key);
|
|
||||||
|
|
||||||
void perf_init(char *fname);
|
|
||||||
|
|
||||||
#endif /* __ARCH_PERF_H__ */
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __ARCH_SYS_ARCH_H__
|
|
||||||
#define __ARCH_SYS_ARCH_H__
|
|
||||||
|
|
||||||
#define SYS_MBOX_NULL NULL
|
|
||||||
#define SYS_SEM_NULL NULL
|
|
||||||
|
|
||||||
struct sys_sem;
|
|
||||||
typedef struct sys_sem * sys_sem_t;
|
|
||||||
|
|
||||||
struct sys_mbox;
|
|
||||||
typedef struct sys_mbox *sys_mbox_t;
|
|
||||||
|
|
||||||
struct sys_thread;
|
|
||||||
typedef struct sys_thread * sys_thread_t;
|
|
||||||
|
|
||||||
#endif /* __ARCH_SYS_ARCH_H__ */
|
|
||||||
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __CC_H__
|
|
||||||
#define __CC_H__
|
|
||||||
|
|
||||||
typedef unsigned char u8_t;
|
|
||||||
typedef signed char s8_t;
|
|
||||||
typedef unsigned short u16_t;
|
|
||||||
typedef signed short s16_t;
|
|
||||||
typedef unsigned long u32_t;
|
|
||||||
typedef signed long s32_t;
|
|
||||||
|
|
||||||
#define PACK_STRUCT_BEGIN
|
|
||||||
#define PACK_STRUCT_STRUCT
|
|
||||||
#define PACK_STRUCT_END
|
|
||||||
#define PACK_STRUCT_FIELD(x) x
|
|
||||||
|
|
||||||
#endif /* __CC_H__ */
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __CPU_H__
|
|
||||||
#define __CPU_H__
|
|
||||||
|
|
||||||
#define BYTE_ORDER LITTLE_ENDIAN
|
|
||||||
|
|
||||||
#endif /* __CPU_H__ */
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __ARCH_INIT_H__
|
|
||||||
#define __ARCH_INIT_H__
|
|
||||||
|
|
||||||
#define TCPIP_INIT_DONE(arg) tcpip_init_done(arg)
|
|
||||||
|
|
||||||
void tcpip_init_done(void *);
|
|
||||||
int wait_for_tcpip_init(void);
|
|
||||||
|
|
||||||
#endif /* __ARCH_INIT_H__ */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __LIB_H__
|
|
||||||
#define __LIB_H__
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* __LIB_H__ */
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __PERF_H__
|
|
||||||
#define __PERF_H__
|
|
||||||
|
|
||||||
#define PERF_START /* null definition */
|
|
||||||
#define PERF_STOP(x) /* null definition */
|
|
||||||
|
|
||||||
#endif /* __PERF_H__ */
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __SYS_RTXC_H__
|
|
||||||
#define __SYS_RTXC_H__
|
|
||||||
|
|
||||||
#include "rtxcapi.h"
|
|
||||||
|
|
||||||
#define SYS_MBOX_NULL (QUEUE)0
|
|
||||||
#define SYS_SEM_NULL (SEMA)0
|
|
||||||
|
|
||||||
typedef SEMA sys_sem_t;
|
|
||||||
typedef QUEUE sys_mbox_t;
|
|
||||||
typedef TASK sys_thread_t;
|
|
||||||
|
|
||||||
#endif /* __SYS_RTXC_H__ */
|
|
||||||
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __NETIF_CS8900IF_H__
|
|
||||||
#define __NETIF_CS8900IF_H__
|
|
||||||
|
|
||||||
#include "lwip/netif.h"
|
|
||||||
|
|
||||||
void cs8900if_init(struct netif *);
|
|
||||||
u8_t cs8900if_poll(struct netif *);
|
|
||||||
void cs8900if_input(struct netif *);
|
|
||||||
|
|
||||||
#endif /* __NETIF_CS8900IF_H__ */
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __NETIF_SIOSLIPIF_H__
|
|
||||||
#define __NETIF_SIOSLIPIF_H__
|
|
||||||
|
|
||||||
#include "lwip/netif.h"
|
|
||||||
|
|
||||||
void sioslipif_init(struct netif *);
|
|
||||||
|
|
||||||
#endif /* __NETIF_SIOSLIPIF_H__ */
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* These are generic implementations of various library functions used
|
|
||||||
* throughout the lwIP code. When porting, those should be optimized
|
|
||||||
* for the particular processor architecture, preferably coded in
|
|
||||||
* assembler.
|
|
||||||
*/
|
|
||||||
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
sioslipif.c - Implementation of the SLIP protocol on top of a serial line.
|
|
||||||
@@ -1,170 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "lwip/debug.h"
|
|
||||||
#include "lwip/def.h"
|
|
||||||
#include "netif/sioslipif.h"
|
|
||||||
#include "lwip/pbuf.h"
|
|
||||||
#include "lwip/sys.h"
|
|
||||||
|
|
||||||
#define SLIP_END 0300
|
|
||||||
#define SLIP_ESC 0333
|
|
||||||
#define SLIP_ESC_END 0334
|
|
||||||
#define SLIP_ESC_ESC 0335
|
|
||||||
|
|
||||||
/* This variable is used for passing the netif pointer between the
|
|
||||||
threads. */
|
|
||||||
static struct netif *netif_pass;
|
|
||||||
|
|
||||||
static int infd, outfd;
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static void
|
|
||||||
sio_send(u8_t c)
|
|
||||||
{
|
|
||||||
write(outfd, &c, 1);
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static u8_t
|
|
||||||
sio_recv(void)
|
|
||||||
{
|
|
||||||
u8_t c;
|
|
||||||
read(infd, &c, 1);
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static int
|
|
||||||
sioslipif_output(struct netif *netif, struct pbuf *p, struct ip_addr *ipaddr)
|
|
||||||
{
|
|
||||||
struct pbuf *q;
|
|
||||||
int i;
|
|
||||||
u8_t c;
|
|
||||||
|
|
||||||
/* Send pbuf out on the serial I/O device. */
|
|
||||||
sio_send(SLIP_END);
|
|
||||||
|
|
||||||
for(q = p; q != NULL; q = q->next) {
|
|
||||||
for(i = 0; i < q->len; i++) {
|
|
||||||
c = ((u8_t *)q->payload)[i];
|
|
||||||
switch(c) {
|
|
||||||
case SLIP_END:
|
|
||||||
sio_send(SLIP_ESC);
|
|
||||||
sio_send(SLIP_ESC_END);
|
|
||||||
break;
|
|
||||||
case SLIP_ESC:
|
|
||||||
sio_send(SLIP_ESC);
|
|
||||||
sio_send(SLIP_ESC_ESC);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
sio_send(c);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sio_send(SLIP_END);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static struct pbuf *
|
|
||||||
sioslipif_input(void)
|
|
||||||
{
|
|
||||||
u8_t c;
|
|
||||||
struct pbuf *p, *q;
|
|
||||||
int recved;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
p = pbuf_alloc(PBUF_LINK, PBUF_MAX_SIZE, PBUF_POOL);
|
|
||||||
q = p;
|
|
||||||
recved = i = 0;
|
|
||||||
|
|
||||||
while(1) {
|
|
||||||
c = sio_recv();
|
|
||||||
switch(c) {
|
|
||||||
case SLIP_END:
|
|
||||||
if(recved > 0) {
|
|
||||||
/* Received whole packet. */
|
|
||||||
pbuf_realloc(p, recved);
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case SLIP_ESC:
|
|
||||||
c = sio_recv();
|
|
||||||
switch(c) {
|
|
||||||
case SLIP_ESC_END:
|
|
||||||
c = SLIP_END;
|
|
||||||
break;
|
|
||||||
case SLIP_ESC_ESC:
|
|
||||||
c = SLIP_ESC;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* FALLTHROUGH */
|
|
||||||
default:
|
|
||||||
if(recved < p->tot_len && q != NULL) {
|
|
||||||
((u8_t *)q->payload)[i] = c;
|
|
||||||
recved++;
|
|
||||||
i++;
|
|
||||||
if(i >= q->len) {
|
|
||||||
i = 0;
|
|
||||||
q = q->next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static void
|
|
||||||
sioslipif_loop(void)
|
|
||||||
{
|
|
||||||
struct pbuf *p;
|
|
||||||
struct netif *netif;
|
|
||||||
|
|
||||||
netif = netif_pass;
|
|
||||||
while(1) {
|
|
||||||
p = sioslipif_input();
|
|
||||||
netif->input(p, netif);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
void
|
|
||||||
sioslipif_init(struct netif *netif)
|
|
||||||
{
|
|
||||||
netif->state = NULL;
|
|
||||||
netif->name[0] = 's';
|
|
||||||
netif->name[1] = 'l';
|
|
||||||
netif->output = sioslipif_output;
|
|
||||||
|
|
||||||
netif_pass = netif;
|
|
||||||
sys_thread_new((void *)sioslipif_loop, NULL);
|
|
||||||
/* Do some magic to make it possible to receive data from the serial I/O device. */
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "arch/perf.h"
|
|
||||||
|
|
||||||
void
|
|
||||||
perf_init(char *fname)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
@@ -1,271 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "lwip/debug.h"
|
|
||||||
|
|
||||||
#include "lwip/def.h"
|
|
||||||
#include "lwip/sys.h"
|
|
||||||
#include "lwip/mem.h"
|
|
||||||
|
|
||||||
#include "rtxcapi.h"
|
|
||||||
#include "csema.h"
|
|
||||||
#include "cclock.h"
|
|
||||||
#include "cqueue.h"
|
|
||||||
#include "cres.h"
|
|
||||||
#include "cpart.h"
|
|
||||||
#include "ctask.h"
|
|
||||||
|
|
||||||
struct timeoutlist {
|
|
||||||
struct sys_timeouts timeouts;
|
|
||||||
TASK pid;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define SYS_THREAD_MAX 2
|
|
||||||
|
|
||||||
static struct timeoutlist timeoutlist[SYS_THREAD_MAX];
|
|
||||||
static u16_t nextthread = 0;
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
sys_mbox_t
|
|
||||||
sys_mbox_new(void)
|
|
||||||
{
|
|
||||||
QUEUE mbox;
|
|
||||||
KS_dequeuew(IP_MBOXQ, &mbox);
|
|
||||||
KS_purgequeue(mbox);
|
|
||||||
return mbox;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
void
|
|
||||||
sys_mbox_free(sys_mbox_t mbox)
|
|
||||||
{
|
|
||||||
KS_enqueue(IP_MBOXQ, &mbox);
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
void
|
|
||||||
sys_mbox_post(sys_mbox_t mbox, void *data)
|
|
||||||
{
|
|
||||||
if(KS_enqueue(mbox, &data) != RC_GOOD) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
u16_t
|
|
||||||
sys_arch_mbox_fetch(sys_mbox_t mbox, void **data, u16_t timeout)
|
|
||||||
{
|
|
||||||
KSRC ret;
|
|
||||||
u16_t wtime = 1;
|
|
||||||
|
|
||||||
if(timeout == 0) {
|
|
||||||
DEBUGF(SYS_DEBUG, ("PID: %d sys_mbox_fetch: without timeouts\n",KS_inqtask()));
|
|
||||||
KS_dequeuew(mbox, data);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
ret = KS_dequeuet(mbox, data, (TICKS)timeout/CLKTICK);
|
|
||||||
if(ret == RC_TIMEOUT) {
|
|
||||||
/* The call timed out, so we return 0. */
|
|
||||||
wtime = 0;
|
|
||||||
} else {
|
|
||||||
/* Calculate time we waited for the message to arrive. */
|
|
||||||
|
|
||||||
/* XXX: we cheat and just pretend that we waited for half the timeout value! */
|
|
||||||
wtime = timeout / 2;
|
|
||||||
|
|
||||||
/* Make sure we don't return 0 here. */
|
|
||||||
if(wtime == 0) {
|
|
||||||
wtime = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return wtime;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
sys_sem_t
|
|
||||||
sys_sem_new(u8_t count)
|
|
||||||
{
|
|
||||||
SEMA sem;
|
|
||||||
KS_dequeuew(IP_SEMQ, &sem);
|
|
||||||
KS_pend(sem);
|
|
||||||
if(count > 0) {
|
|
||||||
KS_signal(sem);
|
|
||||||
}
|
|
||||||
return sem;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
u16_t
|
|
||||||
sys_arch_sem_wait(sys_sem_t sem, u16_t timeout)
|
|
||||||
{
|
|
||||||
KSRC ret;
|
|
||||||
u16_t wtime = 1;
|
|
||||||
|
|
||||||
if(timeout == 0) {
|
|
||||||
DEBUGF(SYS_DEBUG, ("PID: %d sys_mbox_fetch: without timeouts\n",KS_inqtask()));
|
|
||||||
KS_wait(sem);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
ret = KS_waitt(sem, (TICKS)timeout/CLKTICK);
|
|
||||||
if(ret == RC_TIMEOUT) {
|
|
||||||
/* The call timed out, so we return 0. */
|
|
||||||
wtime = 0;
|
|
||||||
} else {
|
|
||||||
/* Calculate time we waited for the message to arrive. */
|
|
||||||
|
|
||||||
/* XXX: we cheat and just pretend that we waited for half the timeout value! */
|
|
||||||
wtime = timeout / 2;
|
|
||||||
|
|
||||||
/* Make sure we don't return 0 here. */
|
|
||||||
if(wtime == 0) {
|
|
||||||
wtime = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return wtime;
|
|
||||||
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
void
|
|
||||||
sys_sem_signal(sys_sem_t sem)
|
|
||||||
{
|
|
||||||
KS_signal(sem);
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
void
|
|
||||||
sys_sem_free(sys_sem_t sem)
|
|
||||||
{
|
|
||||||
KS_enqueue(IP_SEMQ, &sem);
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
void
|
|
||||||
sys_init(void)
|
|
||||||
{
|
|
||||||
/* posta in alla semaforer i IP_SEMQ, posta in alla mboxar i
|
|
||||||
IP_MBOXQ */
|
|
||||||
QUEUE mbox;
|
|
||||||
SEMA sem;
|
|
||||||
|
|
||||||
mbox = IP_Q_01; KS_enqueue(IP_MBOXQ, &mbox);
|
|
||||||
mbox = IP_Q_02; KS_enqueue(IP_MBOXQ, &mbox);
|
|
||||||
mbox = IP_Q_03; KS_enqueue(IP_MBOXQ, &mbox);
|
|
||||||
mbox = IP_Q_04; KS_enqueue(IP_MBOXQ, &mbox);
|
|
||||||
mbox = IP_Q_05; KS_enqueue(IP_MBOXQ, &mbox);
|
|
||||||
mbox = IP_Q_06; KS_enqueue(IP_MBOXQ, &mbox);
|
|
||||||
mbox = IP_Q_07; KS_enqueue(IP_MBOXQ, &mbox);
|
|
||||||
mbox = IP_Q_08; KS_enqueue(IP_MBOXQ, &mbox);
|
|
||||||
mbox = IP_Q_09; KS_enqueue(IP_MBOXQ, &mbox);
|
|
||||||
mbox = IP_Q_10; KS_enqueue(IP_MBOXQ, &mbox);
|
|
||||||
mbox = IP_Q_11; KS_enqueue(IP_MBOXQ, &mbox);
|
|
||||||
mbox = IP_Q_12; KS_enqueue(IP_MBOXQ, &mbox);
|
|
||||||
mbox = IP_Q_13; KS_enqueue(IP_MBOXQ, &mbox);
|
|
||||||
mbox = IP_Q_14; KS_enqueue(IP_MBOXQ, &mbox);
|
|
||||||
mbox = IP_Q_15; KS_enqueue(IP_MBOXQ, &mbox);
|
|
||||||
sem = IP_S_01; KS_enqueue(IP_SEMQ, &sem);
|
|
||||||
sem = IP_S_02; KS_enqueue(IP_SEMQ, &sem);
|
|
||||||
sem = IP_S_03; KS_enqueue(IP_SEMQ, &sem);
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
struct sys_timeouts *
|
|
||||||
sys_arch_timeouts(void)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
TASK pid;
|
|
||||||
struct timeoutlist *tl;
|
|
||||||
|
|
||||||
DEBUGF(SYS_DEBUG, ("PID: %d sys_mbox_fetch: timeoutlist not empty\n",KS_inqtask()));
|
|
||||||
pid = KS_inqtask();
|
|
||||||
for(i = 0; i < nextthread; i++) {
|
|
||||||
tl = &timeoutlist[i];
|
|
||||||
if(tl->pid == pid) {
|
|
||||||
DEBUGF(SYS_DEBUG, ("PID: %d sys_mbox_fetch: corresponding pid found!\n",KS_inqtask()));
|
|
||||||
return &(tl->timeouts);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Error! */
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
struct sys_thread_arg {
|
|
||||||
void (* thread)(void *);
|
|
||||||
void *threadarg;
|
|
||||||
SEMA sem;
|
|
||||||
};
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
static void
|
|
||||||
sys_thread(void)
|
|
||||||
{
|
|
||||||
struct sys_thread_arg *arg;
|
|
||||||
void (* thread)(void *);
|
|
||||||
void *threadarg;
|
|
||||||
|
|
||||||
arg = KS_inqtask_arg(0);
|
|
||||||
if(arg != NULL) {
|
|
||||||
|
|
||||||
timeoutlist[nextthread].timeouts.next = NULL;
|
|
||||||
timeoutlist[nextthread].pid = KS_inqtask();
|
|
||||||
|
|
||||||
++nextthread;
|
|
||||||
|
|
||||||
thread = arg->thread;
|
|
||||||
threadarg = arg->threadarg;
|
|
||||||
KS_signal(arg->sem);
|
|
||||||
thread(threadarg);
|
|
||||||
}
|
|
||||||
KS_terminate(0);
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
void
|
|
||||||
sys_thread_new(void (* function)(void *arg), void *arg)
|
|
||||||
{
|
|
||||||
TASK newtask;
|
|
||||||
PRIORITY pri = 2; /* This may have to be changed. */
|
|
||||||
char *stack;
|
|
||||||
int stacksize = 512; /* This may have to be changed. */
|
|
||||||
struct sys_thread_arg threadarg;
|
|
||||||
|
|
||||||
|
|
||||||
newtask = KS_alloc_task();
|
|
||||||
stack = KS_allocw(MAP512);
|
|
||||||
|
|
||||||
KS_deftask(newtask, pri, (char ks_stk *)stack, (size_t)stacksize, (void (*)(void))sys_thread);
|
|
||||||
|
|
||||||
threadarg.thread = function;
|
|
||||||
threadarg.threadarg = arg;
|
|
||||||
threadarg.sem = THRDSYNC;
|
|
||||||
KS_deftask_arg(newtask, &threadarg);
|
|
||||||
KS_execute(newtask);
|
|
||||||
KS_wait(THRDSYNC);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. 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.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
||||||
*
|
|
||||||
* This file is part of the lwIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef __ARCH_CC_H__
|
|
||||||
#define __ARCH_CC_H__
|
|
||||||
|
|
||||||
typedef unsigned char u8_t;
|
|
||||||
typedef signed char s8_t;
|
|
||||||
/*typedef unsigned short u8_t;
|
|
||||||
typedef signed short s8_t; */
|
|
||||||
typedef unsigned short u16_t;
|
|
||||||
typedef signed short s16_t;
|
|
||||||
typedef unsigned long u32_t;
|
|
||||||
typedef signed long s32_t;
|
|
||||||
|
|
||||||
typedef u32_t mem_ptr_t;
|
|
||||||
|
|
||||||
#define PACK_STRUCT_FIELD(x) x __attribute__((packed))
|
|
||||||
#define PACK_STRUCT_STRUCT __attribute__((packed))
|
|
||||||
#define PACK_STRUCT_BEGIN
|
|
||||||
#define PACK_STRUCT_END
|
|
||||||
|
|
||||||
#endif /* __ARCH_CC_H__ */
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user