home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume40 / ipp / part05 < prev    next >
Text File  |  1993-11-24  |  68KB  |  1,990 lines

  1. Newsgroups: comp.sources.misc
  2. From: db15@ukc.ac.uk (Damiano Bolla)
  3. Subject: v40i163:  ipp - IPP Routing Architecture Toolkit, Part05/06
  4. Message-ID: <1993Nov24.193907.7780@sparky.sterling.com>
  5. X-Md4-Signature: f70a9464e656ee9ee424f9568c63f71e
  6. Sender: kent@sparky.sterling.com (Kent Landfield)
  7. Organization: Computing Lab, University of Kent at Canterbury, UK.
  8. Date: Wed, 24 Nov 1993 19:39:07 GMT
  9. Approved: kent@sparky.sterling.com
  10.  
  11. Submitted-by: db15@ukc.ac.uk (Damiano Bolla)
  12. Posting-number: Volume 40, Issue 163
  13. Archive-name: ipp/part05
  14. Environment: INET
  15.  
  16. #! /bin/sh
  17. # This is a shell archive.  Remove anything before this line, then feed it
  18. # into a shell via "sh file" or similar.  To overwrite existing files,
  19. # type "sh file -c".
  20. # Contents:  IPP/README IPP/config/ex1/1.1config
  21. #   IPP/config/ex1/1.20config IPP/config/ex1/1.30config
  22. #   IPP/config/ex1/15config IPP/config/ex1/2config IPP/config/ex1/run
  23. #   IPP/config/ex2/4config IPP/ethernet/EthParseCall.c
  24. #   IPP/ethernet/NewAddress.c IPP/ethernet/ProcessPacket.c
  25. #   IPP/host/ReceivePacket.c IPP/host/host.c IPP/include/defs.h
  26. #   IPP/include/ethernet.h IPP/include/func_defs.h IPP/include/host.h
  27. #   IPP/lib/route/AddressMatch.c IPP/lib/route/FindHostRoute.c
  28. #   IPP/lib/route/ShowInterface.c IPP/lib/route/WhatIsIt.c
  29. #   IPP/lib/utils/Accept.c IPP/lib/utils/GetAddress.c
  30. #   IPP/lib/utils/Listen.c IPP/lib/utils/ReadConfig.c
  31. #   IPP/lib/utils/SafeRead.c IPP/lib/utils/WatchDog.c
  32. #   IPP/monitor/Send.c
  33. # Wrapped by kent@sparky on Wed Nov 24 11:51:05 1993
  34. PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
  35. echo If this archive is complete, you will see the following message:
  36. echo '          "shar: End of archive 5 (of 6)."'
  37. if test -f 'IPP/README' -a "${1}" != "-c" ; then 
  38.   echo shar: Will not clobber existing file \"'IPP/README'\"
  39. else
  40.   echo shar: Extracting \"'IPP/README'\" \(1561 characters\)
  41.   sed "s/^X//" >'IPP/README' <<'END_OF_FILE'
  42. XAuthor Damiano Bolla, 1993
  43. XAll parts of this Toolkit are under the GNU Copyright.
  44. X
  45. XThis is a toolkit that allow you to play with IPP addresses and
  46. Xnetwork topology. 
  47. X
  48. XTo compile the programs you should just type make at this level.
  49. XThe resulting programs will then be in the various subdirectory. What 
  50. Xfollows is a description of what each subdirectory contains.
  51. XFor further reading just have a look at the README in the subdirs.
  52. X
  53. Xconfig
  54. X    Contains the config files to set up the two topology examples
  55. X    described in the postscript notes.
  56. X
  57. Xdocs
  58. X
  59. Xethernet
  60. X    A program that simulates the ethernet behaviour. It is 
  61. X    working but not used at the moment. 
  62. X
  63. Xhost
  64. X    This simulate a host. It requires a config file in stdin
  65. X    and will operate accordingly.
  66. X
  67. Xlogd
  68. X    This is the daemon that display error messages from the 
  69. X    various daemons. Always start this first in a separate window
  70. X
  71. Xmonitor
  72. X    This is a simple console type host. It allows you to connect
  73. X    to one router and then be part of the network. I.e. you can 
  74. X    ask routers for information or set up things.
  75. X
  76. Xrouter
  77. X    An example of IPP router using SOCKETS as medium for packets.
  78. X    It requires a config file given in stdin and will route packets
  79. X    according to the routing table.
  80. X    It also understant data packets directed to him and act
  81. X    accordingly.
  82. X
  83. XThis software is ready to be compiled with Solaris 2.2, just define
  84. XSOCKLIB="-lsocket -lnsl";    export SOCKLIB
  85. X
  86. XIf you compile it on Linux do not define the above. 
  87. XIf you compile it on SunOS do not define the above and look at the 
  88. XREADME in the lib directory.
  89. X
  90. XDamiano
  91. END_OF_FILE
  92.   if test 1561 -ne `wc -c <'IPP/README'`; then
  93.     echo shar: \"'IPP/README'\" unpacked with wrong size!
  94.   fi
  95.   # end of 'IPP/README'
  96. fi
  97. if test -f 'IPP/config/ex1/1.1config' -a "${1}" != "-c" ; then 
  98.   echo shar: Will not clobber existing file \"'IPP/config/ex1/1.1config'\"
  99. else
  100.   echo shar: Extracting \"'IPP/config/ex1/1.1config'\" \(2038 characters\)
  101.   sed "s/^X//" >'IPP/config/ex1/1.1config' <<'END_OF_FILE'
  102. X# The config file is quite strict in terms of layout, Comments MUST start with a #
  103. X# You cannot place comments anywhere you want...
  104. X# You are allowed blank lines...
  105. X# ONLY spaces are allowed as separators...
  106. X# The FIRST thing you have to write is the address of the router.,
  107. X
  108. XAddress 1.1
  109. X
  110. X# The n you have to write the interface specification.. the thing begins with
  111. X# a special keyword... otherwise it is too complicated.
  112. X# The other thing is tha all parameters fit in one line... in the following order
  113. X# Number LinkType Listen Parameters
  114. X
  115. XInterface 1 sock no localhost 1039
  116. X
  117. X#Interface 1 sock yes
  118. XInterface 2 sock yes
  119. XInterface 3 sock yes
  120. XInterface 4 sock yes
  121. X
  122. X# Routing gets more complicated....
  123. X# If a routing entry overwrite another one a WARNING message will follow !
  124. X# Note how a routing entry does not know about interface technology
  125. X#
  126. X# The routing entry is more complicated... follows a list of explanation
  127. X# 1) below/here/above    This indicate if the route is for this level. down up 
  128. X# 2) number        Indicate the hash table entry this route is for
  129. X# 4) number        Indicate the IPP address of next hop 1-254
  130. X# 5) number        Indicate the interface 0==none    1-n
  131. X# 6) number         Indicate the cost of a route 1-254
  132. X
  133. X# Ex: the following entry says that the route for host 11 in this level
  134. X# is trought the host 11 itself and uses interface 1 with cost 1
  135. XRoute Host 4 30 2 1
  136. XRoute Host 5 30 2 1
  137. XRoute Host 20 30 2 1
  138. X
  139. X# this syas that route to subnet 10 can be done trough router 11 that is not
  140. X# directly connected with a cost of 1
  141. X# The fact that router 11 is not directly connected means that it is on 
  142. X# this same network.
  143. X#Route Net 10 11 0 1
  144. X
  145. X# this says that a route to subnet 10 can be done via host 12 that is directly 
  146. X# connected but with a cost of 2
  147. X# Being directly connected means that the next hop is subnet.router
  148. X#Route Net 10 12 1 2
  149. X#Route Net 1 1 1 2
  150. X
  151. X# A route to the parent network, the dummy entry is used to somplify
  152. X# the parsing algorithms.
  153. X#Route Parent dummy 12 1 2 
  154. XRoute Parent dummy 2 1 1 
  155. XRoute Parent dummy 20 0 2 
  156. END_OF_FILE
  157.   if test 2038 -ne `wc -c <'IPP/config/ex1/1.1config'`; then
  158.     echo shar: \"'IPP/config/ex1/1.1config'\" unpacked with wrong size!
  159.   fi
  160.   # end of 'IPP/config/ex1/1.1config'
  161. fi
  162. if test -f 'IPP/config/ex1/1.20config' -a "${1}" != "-c" ; then 
  163.   echo shar: Will not clobber existing file \"'IPP/config/ex1/1.20config'\"
  164. else
  165.   echo shar: Extracting \"'IPP/config/ex1/1.20config'\" \(2152 characters\)
  166.   sed "s/^X//" >'IPP/config/ex1/1.20config' <<'END_OF_FILE'
  167. X# The config file is quite strict in terms of layout, Comments MUST start with a #
  168. X# You cannot place comments anywhere you want...
  169. X# You are allowed blank lines...
  170. X# ONLY spaces are allowed as separators...
  171. X# The FIRST thing you have to write is the address of the router.,
  172. X
  173. XAddress 1.20
  174. X
  175. X# The n you have to write the interface specification.. the thing begins with
  176. X# a special keyword... otherwise it is too complicated.
  177. X# The other thing is tha all parameters fit in one line... in the following order
  178. X# Number LinkType Listen Parameters
  179. X
  180. XInterface 1 sock no localhost 1036
  181. XInterface 2 sock no localhost 1043
  182. X
  183. X#Interface 1 sock yes
  184. X#Interface 2 sock yes
  185. XInterface 3 sock yes
  186. XInterface 4 sock yes
  187. X
  188. X# Routing gets more complicated....
  189. X# If a routing entry overwrite another one a WARNING message will follow !
  190. X# Note how a routing entry does not know about interface technology
  191. X#
  192. X# The routing entry is more complicated... follows a list of explanation
  193. X# 1) host/net/parent    This indicate if the route is for this level. down up 
  194. X# 2) number        Indicate the hash table entry this route is for
  195. X# 4) number        Indicate the IPP address of next hop 1-254
  196. X# 5) number        Indicate the interface 0==none    1-n
  197. X# 6) number         Indicate the cost of a route 1-254
  198. X
  199. X# Ex: the following entry says that the route for host 11 in this level
  200. X# is trought the host 11 itself and uses interface 1 with cost 1
  201. XRoute Host 1 30 2 1
  202. XRoute Host 3 30 2 1
  203. XRoute Host 4 30 2 1
  204. X#Route Host 5 5 4 1
  205. XRoute Host 30 30 2 1
  206. X
  207. X# this syas that route to subnet 10 can be done trough router 11 that is not
  208. X# directly connected with a cost of 1
  209. X# The fact that router 11 is not directly connected means that it is on 
  210. X# this same network.
  211. X#Route Net 10 11 0 1
  212. X
  213. X# this says that a route to subnet 10 can be done via host 12 that is directly 
  214. X# connected but with a cost of 2
  215. X# Being directly connected means that the next hop is subnet.router
  216. X#Route Net 10 12 1 2
  217. X
  218. X# A route to the parent network, the dummy entry is used to somplify
  219. X# the parsing algorithms.
  220. X# The fields are as follows, routing host, interface, cost
  221. X#Route Parent dummy 1 2 1
  222. XRoute Parent dummy 16 1 1 
  223. XRoute Parent dummy 1 0 2 
  224. END_OF_FILE
  225.   if test 2152 -ne `wc -c <'IPP/config/ex1/1.20config'`; then
  226.     echo shar: \"'IPP/config/ex1/1.20config'\" unpacked with wrong size!
  227.   fi
  228.   # end of 'IPP/config/ex1/1.20config'
  229. fi
  230. if test -f 'IPP/config/ex1/1.30config' -a "${1}" != "-c" ; then 
  231.   echo shar: Will not clobber existing file \"'IPP/config/ex1/1.30config'\"
  232. else
  233.   echo shar: Extracting \"'IPP/config/ex1/1.30config'\" \(2079 characters\)
  234.   sed "s/^X//" >'IPP/config/ex1/1.30config' <<'END_OF_FILE'
  235. X# The config file is quite strict in terms of layout, Comments MUST start with a #
  236. X# You cannot place comments anywhere you want...
  237. X# You are allowed blank lines...
  238. X# ONLY spaces are allowed as separators...
  239. X# The FIRST thing you have to write is the address of the router.,
  240. X
  241. XAddress 1.30
  242. X
  243. X# The n you have to write the interface specification.. the thing begins with
  244. X# a special keyword... otherwise it is too complicated.
  245. X# The other thing is tha all parameters fit in one line... in the following order
  246. X# Number LinkType Listen Parameters
  247. X
  248. XInterface 1 sock no localhost 1039
  249. X
  250. X#Interface 1 sock yes
  251. XInterface 2 sock yes
  252. XInterface 3 sock yes
  253. XInterface 4 sock yes
  254. X
  255. X# Routing gets more complicated....
  256. X# If a routing entry overwrite another one a WARNING message will follow !
  257. X# Note how a routing entry does not know about interface technology
  258. X#
  259. X# The routing entry is more complicated... follows a list of explanation
  260. X# 1) below/here/above    This indicate if the route is for this level. down up 
  261. X# 2) number        Indicate the hash table entry this route is for
  262. X# 4) number        Indicate the IPP address of next hop 1-254
  263. X# 5) number        Indicate the interface 0==none    1-n
  264. X# 6) number         Indicate the cost of a route 1-254
  265. X
  266. X# Ex: the following entry says that the route for host 11 in this level
  267. X# is trought the host 11 itself and uses interface 1 with cost 1
  268. XRoute Host 1 1 1 1
  269. XRoute Host 3 1 1 1
  270. X#Route Host 4 4 4 1
  271. XRoute Host 5 20 2 1
  272. X#Route Host 20 20 2 1
  273. X
  274. X# this syas that route to subnet 10 can be done trough router 11 that is not
  275. X# directly connected with a cost of 1
  276. X# The fact that router 11 is not directly connected means that it is on 
  277. X# this same network.
  278. X#Route Net 10 11 0 1
  279. X
  280. X# this says that a route to subnet 10 can be done via host 12 that is directly 
  281. X# connected but with a cost of 2
  282. X# Being directly connected means that the next hop is subnet.router
  283. X#Route Net 10 12 1 2
  284. X#Route Net 1 1 1 2
  285. X
  286. X# A route to the parent network, the dummy entry is used to somplify
  287. X# the parsing algorithms.
  288. X#Route Parent dummy 12 1 2 
  289. XRoute Parent dummy 1 0 1 
  290. XRoute Parent dummy 20 0    1 
  291. X
  292. END_OF_FILE
  293.   if test 2079 -ne `wc -c <'IPP/config/ex1/1.30config'`; then
  294.     echo shar: \"'IPP/config/ex1/1.30config'\" unpacked with wrong size!
  295.   fi
  296.   # end of 'IPP/config/ex1/1.30config'
  297. fi
  298. if test -f 'IPP/config/ex1/15config' -a "${1}" != "-c" ; then 
  299.   echo shar: Will not clobber existing file \"'IPP/config/ex1/15config'\"
  300. else
  301.   echo shar: Extracting \"'IPP/config/ex1/15config'\" \(2088 characters\)
  302.   sed "s/^X//" >'IPP/config/ex1/15config' <<'END_OF_FILE'
  303. X# The config file is quite strict in terms of layout, Comments MUST start with a #
  304. X# You cannot place comments anywhere you want...
  305. X# You are allowed blank lines...
  306. X# ONLY spaces are allowed as separators...
  307. X# The FIRST thing you have to write is the address of the router.,
  308. X
  309. XAddress 15
  310. X
  311. X# The n you have to write the interface specification.. the thing begins with
  312. X# a special keyword... otherwise it is too complicated.
  313. X# The other thing is tha all parameters fit in one line... in the following order
  314. X# Number LinkType Listen Parameters
  315. X
  316. XInterface 1 sock no localhost 1026
  317. X
  318. X#Interface 1 sock yes
  319. XInterface 2 sock yes
  320. XInterface 3 sock yes
  321. XInterface 4 sock yes
  322. X
  323. X# Routing gets more complicated....
  324. X# If a routing entry overwrite another one a WARNING message will follow !
  325. X# Note how a routing entry does not know about interface technology
  326. X#
  327. X# The routing entry is more complicated... follows a list of explanation
  328. X# 1) below/here/above    This indicate if the route is for this level. down up 
  329. X# 2) number        Indicate the hash table entry this route is for
  330. X# 4) number        Indicate the IPP address of next hop 1-254
  331. X# 5) number        Indicate the interface 0==none    1-n
  332. X# 6) number         Indicate the cost of a route 1-254
  333. X
  334. X# Ex: the following entry says that the route for host 11 in this level
  335. X# is trought the host 11 itself and uses interface 1 with cost 1
  336. X# NOTE: Next hop MUST be directly connected
  337. XRoute Host 2 2 1 1
  338. X#Route Host 5 5 4 1
  339. XRoute Host 10 2 1 1
  340. XRoute Host 11 16 2 1
  341. X#Route Host 16 16 2 1
  342. X
  343. X# this syas that route to subnet 10 can be done trough router 11 that is not
  344. X# directly connected with a cost of 1
  345. X# The fact that router 11 is not directly connected means that it is on 
  346. X# this same network.
  347. X#Route Net 10 11 0 1
  348. X
  349. X# this says that a route to subnet 10 can be done via host 12 that is directly 
  350. X# connected but with a cost of 2
  351. X# Being directly connected means that the next hop is subnet.router
  352. X#Route Net 10 12 1 2
  353. XRoute Net 1 2 0 1
  354. XRoute Net 1 16 0 1
  355. X
  356. X# A route to the parent network, the dummy entry is used to somplify
  357. X# the parsing algorithms.
  358. X#Route Parent dummy 12 1 2 
  359. X
  360. END_OF_FILE
  361.   if test 2088 -ne `wc -c <'IPP/config/ex1/15config'`; then
  362.     echo shar: \"'IPP/config/ex1/15config'\" unpacked with wrong size!
  363.   fi
  364.   # end of 'IPP/config/ex1/15config'
  365. fi
  366. if test -f 'IPP/config/ex1/2config' -a "${1}" != "-c" ; then 
  367.   echo shar: Will not clobber existing file \"'IPP/config/ex1/2config'\"
  368. else
  369.   echo shar: Extracting \"'IPP/config/ex1/2config'\" \(2181 characters\)
  370.   sed "s/^X//" >'IPP/config/ex1/2config' <<'END_OF_FILE'
  371. X# The config file is quite strict in terms of layout, Comments MUST start with a #
  372. X# You cannot place comments anywhere you want...
  373. X# You are allowed blank lines...
  374. X# ONLY spaces are allowed as separators...
  375. X# The FIRST thing you have to write is the address of the router.,
  376. X
  377. XAddress 2
  378. X
  379. X# The n you have to write the interface specification.. the thing begins with
  380. X# a special keyword... otherwise it is too complicated.
  381. X# The other thing is tha all parameters fit in one line... in the following order
  382. X# Number LinkType Listen Parameters
  383. X
  384. X#Interface 1 sock no localhost 4326
  385. X#Interface 2 sock no localhost 4366
  386. X
  387. XInterface 1 sock yes
  388. XInterface 2 sock yes
  389. XInterface 3 sock yes
  390. XInterface 4 sock yes
  391. X
  392. X# Routing gets more complicated....
  393. X# If a routing entry overwrite another one a WARNING message will follow !
  394. X# Note how a routing entry does not know about interface technology
  395. X#
  396. X# The routing entry is more complicated... follows a list of explanation
  397. X# 1) below/here/above    This indicate if the route is for this level. down up 
  398. X# 2) number        Indicate the hash table entry this route is for
  399. X# 4) number        Indicate the IPP address of next hop 1-254
  400. X# 5) number        Indicate the interface 0==none    1-n
  401. X# 6) number         Indicate the cost of a route 1-254
  402. X
  403. X# Ex: the following entry says that the route for host 11 in this level
  404. X# is trought the host 11 itself and uses interface 1 with cost 1
  405. X# NOTE: ALL next hop of a host must be directly connected
  406. X# NOTE: You should NOT setup a route for a calling host.
  407. XRoute Host 5 15 1 1
  408. X# Route Host 10 10 2 1
  409. XRoute Host 11 15 1 1
  410. X#Route Host 15 15 1 1
  411. XRoute Host 16 15 1 1
  412. X
  413. X# this says that route to subnet 10 can be done trough router 11 that is not
  414. X# directly connected with a cost of 1
  415. X# The fact that router 11 is not directly connected means that it is on 
  416. X# this same network.
  417. X#Route Net 10 11 0 1
  418. X
  419. X# this says that a route to subnet 10 can be done via host 12 that is directly 
  420. X# connected but with a cost of 2
  421. X# Being directly connected means that the next hop is subnet.router
  422. X#Route Net 10 12 1 2
  423. XRoute Net 1 16 0 2
  424. X
  425. X# A route to the parent network, the dummy entry is used to somplify
  426. X# the parsing algorithms.
  427. X#Route Parent dummy 12 1 2 
  428. X
  429. END_OF_FILE
  430.   if test 2181 -ne `wc -c <'IPP/config/ex1/2config'`; then
  431.     echo shar: \"'IPP/config/ex1/2config'\" unpacked with wrong size!
  432.   fi
  433.   # end of 'IPP/config/ex1/2config'
  434. fi
  435. if test -f 'IPP/config/ex1/run' -a "${1}" != "-c" ; then 
  436.   echo shar: Will not clobber existing file \"'IPP/config/ex1/run'\"
  437. else
  438.   echo shar: Extracting \"'IPP/config/ex1/run'\" \(1858 characters\)
  439.   sed "s/^X//" >'IPP/config/ex1/run' <<'END_OF_FILE'
  440. X#!/bin/sh
  441. X
  442. XPATH=.:$PATH; export PATH
  443. X
  444. X# ------------------------------------------------------------------------
  445. Xrouter <2config >2links &
  446. Xecho "Router 2 started"
  447. Xsleep 2
  448. X
  449. X# ---------------------------------------------------------------------------
  450. X>script
  451. Xdoscript 2 1 1
  452. Xsed -f script <15config | router >15links &
  453. Xecho "Router 15 started"
  454. Xsleep 2
  455. X
  456. X# ---------------------------------------------------------------------------
  457. X>script
  458. Xdoscript 15 2 1
  459. Xsed -f script <16config    | router >16links &
  460. Xecho "Router 16 started"
  461. Xsleep 2
  462. X
  463. X
  464. X# ---------------------------------------------------------------------------
  465. X>script 
  466. Xdoscript 2 4 1
  467. Xsed -f script <1.1config | router >1.1links &
  468. Xecho "Router 1.1 started"
  469. Xsleep 2
  470. X
  471. X# ---------------------------------------------------------------------------
  472. X>script 
  473. Xdoscript 1.1 2 1
  474. Xsed -f script <1.30config | router >1.30links &
  475. Xecho "Router 1.30 started"
  476. Xsleep 2
  477. X
  478. X# ---------------------------------------------------------------------------
  479. X>script 
  480. Xdoscript 1.30 2 2
  481. Xdoscript 16 3 1
  482. Xsed -f script <1.20config | router >1.20links &
  483. Xecho "Router 1.20 started"
  484. Xsleep 2
  485. X
  486. X# ---------------------------------------------------------------------------
  487. X# The runhost requires three parameters
  488. X# 1) The router to be connected to , just the IPP number, ex: 1.1
  489. X# 2) The interface to use of thet router, ex: 2
  490. X# 3) The address of this host , just the IPP nbumber, ex: 1.3
  491. X
  492. Xxterm -geometry 26x55+1378+0 -e runhost 2 2 10 &
  493. Xecho "Host 10 started"
  494. X
  495. Xxterm -geometry 27x55+1833+0 -e runhost 15 4 5 &
  496. Xecho "Host 5 started"
  497. X
  498. Xxterm -geometry 26x55+1605+0 -e runhost 16 4 11 &
  499. Xecho "Host 11 started"
  500. X
  501. Xxterm -geometry 28x55+2066+0 -e runhost 1.1 3 1.3  &
  502. Xecho "Host 1.3 started"
  503. X
  504. Xxterm -geometry 28x55+2066+0 -e runhost 1.30 4 1.4  &
  505. Xecho "Host 1.4 started"
  506. X
  507. Xxterm -geometry 28x55+2066+0 -e runhost 1.20 4 1.5  &
  508. Xecho "Host 1.5 started"
  509. X
  510. END_OF_FILE
  511.   if test 1858 -ne `wc -c <'IPP/config/ex1/run'`; then
  512.     echo shar: \"'IPP/config/ex1/run'\" unpacked with wrong size!
  513.   fi
  514.   chmod +x 'IPP/config/ex1/run'
  515.   # end of 'IPP/config/ex1/run'
  516. fi
  517. if test -f 'IPP/config/ex2/4config' -a "${1}" != "-c" ; then 
  518.   echo shar: Will not clobber existing file \"'IPP/config/ex2/4config'\"
  519. else
  520.   echo shar: Extracting \"'IPP/config/ex2/4config'\" \(2201 characters\)
  521.   sed "s/^X//" >'IPP/config/ex2/4config' <<'END_OF_FILE'
  522. X# The config file is quite strict in terms of layout, Comments MUST start with a #
  523. X# You cannot place comments anywhere you want...
  524. X# You are allowed blank lines...
  525. X# ONLY spaces are allowed as separators...
  526. X# The FIRST thing you have to write is the address of the router.,
  527. X
  528. XAddress 4
  529. X
  530. X# The n you have to write the interface specification.. the thing begins with
  531. X# a special keyword... otherwise it is too complicated.
  532. X# The other thing is tha all parameters fit in one line... in the following order
  533. X# Number LinkType Listen Parameters
  534. X
  535. X#Interface 1 sock no localhost 4326
  536. X
  537. XInterface 1 sock yes
  538. XInterface 2 sock yes
  539. XInterface 3 sock no localhost 4366
  540. XInterface 4 sock no localhost 4366
  541. XInterface 5 sock yes
  542. X
  543. X# Routing gets more complicated....
  544. X# If a routing entry overwrite another one a WARNING message will follow !
  545. X# Note how a routing entry does not know about interface technology
  546. X#
  547. X# The routing entry is more complicated... follows a list of explanation
  548. X# 1) below/here/above    This indicate if the route is for this level. down up 
  549. X# 2) number        Indicate the hash table entry this route is for
  550. X# 4) number        Indicate the IPP address of next hop 1-254
  551. X# 5) number        Indicate the interface 0==none    1-n
  552. X# 6) number         Indicate the cost of a route 1-254
  553. X
  554. X# Ex: the following entry says that the route for host 11 in this level
  555. X# is trought the host 11 itself and uses interface 1 with cost 1
  556. X# NOTE: ALL next hop of a host must be directly connected
  557. X# NOTE: You should NOT setup a route for a calling host.
  558. XRoute Host 1 2 3 1
  559. XRoute Host 2 2 3 1
  560. XRoute Host 3 3 4 1
  561. XRoute Host 6 2 3 1
  562. XRoute Host 7 3 4 1
  563. XRoute Host 9 5 2 1
  564. X
  565. X# this syas that route to subnet 10 can be done trough router 11 that is not
  566. X# directly connected with a cost of 1
  567. X# The fact that router 11 is not directly connected means that it is on 
  568. X# this same network.
  569. X#Route Net 10 11 0 1
  570. X
  571. X# this says that a route to subnet 10 can be done via host 12 that is directly 
  572. X# connected but with a cost of 2
  573. X# Being directly connected means that the next hop is subnet.router
  574. X#Route Net 10 12 1 2
  575. X#Route Net 1 1 1 2
  576. X
  577. X# A route to the parent network, the dummy entry is used to somplify
  578. X# the parsing algorithms.
  579. X#Route Parent dummy 12 1 2 
  580. X
  581. END_OF_FILE
  582.   if test 2201 -ne `wc -c <'IPP/config/ex2/4config'`; then
  583.     echo shar: \"'IPP/config/ex2/4config'\" unpacked with wrong size!
  584.   fi
  585.   # end of 'IPP/config/ex2/4config'
  586. fi
  587. if test -f 'IPP/ethernet/EthParseCall.c' -a "${1}" != "-c" ; then 
  588.   echo shar: Will not clobber existing file \"'IPP/ethernet/EthParseCall.c'\"
  589. else
  590.   echo shar: Extracting \"'IPP/ethernet/EthParseCall.c'\" \(2207 characters\)
  591.   sed "s/^X//" >'IPP/ethernet/EthParseCall.c' <<'END_OF_FILE'
  592. X/* --------------------------------------------------------------------------
  593. X * Ident: EthParseCall.c
  594. X * Author: Damiano Bolla 1993
  595. X * All this project is covered by the GNU Copyright.
  596. X */
  597. X
  598. X#include <stdio.h>
  599. X#include <unistd.h>
  600. X#include <string.h>
  601. X#include <sys/types.h>
  602. X#include <sys/socket.h>
  603. X#include <sys/time.h>
  604. X#include <netinet/in.h>
  605. X#include "defs.h"
  606. X#include "commands.h"
  607. X#include "debug.h"
  608. X#include "ethernet.h"
  609. X#include "func_defs.h"
  610. X
  611. Xextern struct Debug dbg;
  612. X
  613. X/* This function is in charge of deciding what to do of a new connection
  614. X * It has all the data it needs and will do whatewer is needed to do it.
  615. X * It will close the new socket if needed...
  616. X */     
  617. Xint EthParseCall ( struct Ethernet *eth, int newsocket, char *buff )
  618. X   {
  619. X   char *Command;
  620. X   char *Argument;
  621. X   char Null[2]={0};
  622. X
  623. X   /* Note the strtok breaking string, it is quite complex in a way        */
  624. X   if ((Command=strtok(buff, CMD_SEP)) ==NULL) Command=Null;
  625. X   if ((Argument=strtok(NULL, CMD_SEP))==NULL) Argument=Null;
  626. X
  627. X   sprintf (dbg.msg,"EthParseCall: Command='%s' Argument='%s'",Command,Argument);
  628. X   DebugCall ( ERR_MSG, DEBUG_TEXT );
  629. X
  630. X   if ( strcasecmp (Command,CMD_STAT) == 0 )
  631. X      {
  632. X      /* Good we should be sending back some statistics...            */
  633. X      EthStats ( eth, newsocket );
  634. X      close (newsocket);
  635. X      return (DONE);
  636. X      }
  637. X
  638. X   if ( strcasecmp (Command,CMD_ADDR) == 0 )
  639. X      {
  640. X      /* Good we have a new host on the ethernet, let's add it to the array    */
  641. X      /* If it fails I close the socket ....                    */
  642. X      if ( NewAddress ( eth, newsocket, Argument ) ) close (newsocket);
  643. X      /* Mhhh, maybe this should be different... ???    Damiano            */
  644. X      return (DONE);
  645. X      }
  646. X
  647. X   if ( strcasecmp (Command,CMD_DEBUG) == 0 )
  648. X      {
  649. X      dbg.current_level = ipp_atoi (Argument);
  650. X      close (newsocket);
  651. X      return (DONE);
  652. X      }
  653. X
  654. X   /* mhhh, it does not look like that we have a command he ?            */
  655. X   /* Better signal it then,,..                            */
  656. X   sprintf (dbg.msg,"EthParseCall: A command was expected, got '%s'",Command);
  657. X   DebugCall ( ERR_NOCOMM, DEBUG_NOTICE );
  658. X
  659. X   /* we need to close the socket in any case.                    */
  660. X   close (newsocket);
  661. X   return (DONE);    /* No need to make a fuss out of it            */
  662. X   }
  663. END_OF_FILE
  664.   if test 2207 -ne `wc -c <'IPP/ethernet/EthParseCall.c'`; then
  665.     echo shar: \"'IPP/ethernet/EthParseCall.c'\" unpacked with wrong size!
  666.   fi
  667.   # end of 'IPP/ethernet/EthParseCall.c'
  668. fi
  669. if test -f 'IPP/ethernet/NewAddress.c' -a "${1}" != "-c" ; then 
  670.   echo shar: Will not clobber existing file \"'IPP/ethernet/NewAddress.c'\"
  671. else
  672.   echo shar: Extracting \"'IPP/ethernet/NewAddress.c'\" \(1703 characters\)
  673.   sed "s/^X//" >'IPP/ethernet/NewAddress.c' <<'END_OF_FILE'
  674. X/* ---------------------------------------------------------------------------
  675. X * Ident: NewAddress.c
  676. X * Author: Damiano Bolla 1993
  677. X * All this project is covered by the GNU Copyright.
  678. X */
  679. X
  680. X#include <stdio.h>
  681. X#include <unistd.h>
  682. X#include <string.h>
  683. X#include <sys/types.h>
  684. X#include <sys/socket.h>
  685. X#include <sys/time.h>
  686. X#include <netinet/in.h>
  687. X#include "defs.h"
  688. X#include "commands.h"
  689. X#include "debug.h"
  690. X#include "ethernet.h"
  691. X#include "packet.h"
  692. X#include "func_defs.h"
  693. X
  694. Xextern struct Debug dbg;
  695. X
  696. Xint NewAddress ( struct Ethernet *eth, int newsocket, char *Argument)
  697. X   {
  698. X   struct IPPaddr *NetAddr;
  699. X   int    addr;
  700. X   NetAddr = ipp_aton(Argument);
  701. X   if ( NetAddr == NULL )
  702. X      {
  703. X      sprintf (dbg.msg,"NewAddress: Cannot convert %s ",Argument);
  704. X      DebugCall ( ERR_BADADDR, DEBUG_ALERT );
  705. X      return (NOT_DONE);
  706. X      }
  707. X
  708. X   if ( NetAddr->Al > 0 ) addr = NetAddr->Addr[NetAddr->Al-1];
  709. X   else addr = 0;
  710. X
  711. X   if ( (addr <=0) || (addr>(ADDR_NUM-2)) )
  712. X      {
  713. X      /* I got a problem here... this address is out of range !            */
  714. X      sprintf (dbg.msg,"NewAddress: Out of range address %d ",addr);
  715. X      DebugCall ( ERR_BADADDR, DEBUG_ALERT );
  716. X      return (NOT_DONE);
  717. X      }
  718. X
  719. X   /* Ok, the address is ok, let's ad it to the host table            */
  720. X   if ( eth->IoFd[addr] && ExistFd ( eth->IoFd[addr], SOCK_TECH) )    
  721. X      {
  722. X      sprintf (dbg.msg,"NewAddress: requested port already in use %d ",addr);
  723. X      DebugCall ( ERR_BADADDR, DEBUG_ALERT );
  724. X      return (NOT_DONE);
  725. X      }
  726. X
  727. X   /* Ok, nobody is using the entry, I can add it...                */
  728. X   /* WARNING: Closing channel ZERO is REALLY BAD !!!!                */
  729. X   if ( eth->IoFd[addr] ) close (eth->IoFd[addr] );
  730. X   eth->IoFd[addr]=newsocket;
  731. X   return (DONE);
  732. X   }
  733. X
  734. X
  735. END_OF_FILE
  736.   if test 1703 -ne `wc -c <'IPP/ethernet/NewAddress.c'`; then
  737.     echo shar: \"'IPP/ethernet/NewAddress.c'\" unpacked with wrong size!
  738.   fi
  739.   # end of 'IPP/ethernet/NewAddress.c'
  740. fi
  741. if test -f 'IPP/ethernet/ProcessPacket.c' -a "${1}" != "-c" ; then 
  742.   echo shar: Will not clobber existing file \"'IPP/ethernet/ProcessPacket.c'\"
  743. else
  744.   echo shar: Extracting \"'IPP/ethernet/ProcessPacket.c'\" \(1958 characters\)
  745.   sed "s/^X//" >'IPP/ethernet/ProcessPacket.c' <<'END_OF_FILE'
  746. X/* -------------------------------------------------------------------------
  747. X * Ident: ProcessPacket.c
  748. X * Author Damiano Bolla 1993
  749. X * All this project is covered by the GNU Copyright.
  750. X */
  751. X
  752. X#include <stdio.h>
  753. X#include <unistd.h>
  754. X#include <string.h>
  755. X#include <sys/types.h>
  756. X#include <sys/socket.h>
  757. X#include <sys/time.h>
  758. X#include <netinet/in.h>
  759. X#include "defs.h"
  760. X#include "debug.h"
  761. X#include "ethernet.h"
  762. X#include "packet.h"
  763. X#include "func_defs.h"
  764. X
  765. Xextern struct Debug dbg;
  766. X     
  767. Xint ProcessPacket ( struct Ethernet *eth, int  chan)    
  768. X   {
  769. X   struct IPP ipp;
  770. X   int    Eof;        /* A flag to know if I have an EOF            */
  771. X   int    Dest;        /* The destination for this packet            */
  772. X
  773. X   Eof = FALSE;
  774. X
  775. X   if ( RcvPack ( &ipp, eth->IoFd[chan], &Eof ) )
  776. X      {
  777. X      /* I had an error, reported by the error system..                */
  778. X      /* I may have gad just and EOF... let's seee....                */
  779. X      if ( Eof ) { close (eth->IoFd[chan]); eth->IoFd[chan]=0; }
  780. X      /* I can't be bothered with reporting it..                */
  781. X      eth->BadPack++;
  782. X      return (NOT_DONE);
  783. X      }
  784. X
  785. X   /* Good we have a nice clean packet here..                     */
  786. X   /* I have to look what is the destination of this                */
  787. X   Dest = ipp.NextHop;
  788. X
  789. X   /* now.. let me see, do I have a host on that address ???            */
  790. X   if ( eth->IoFd[Dest] == 0 )
  791. X      {
  792. X      /* Too bad... nobody is listning there !                    */
  793. X      eth->LostPack++;
  794. X      sprintf (dbg.msg,"ProcessPacket: Given address is %d ",Dest);
  795. X      DebugCall ( ERR_BADADDR, DEBUG_ALERT );
  796. X      return (NOT_DONE);
  797. X      }
  798. X
  799. X   /* Good somebody is listning there, let's send the packet as it is        */
  800. X   Eof = FALSE;
  801. X   if ( SndPack ( &ipp, eth->IoFd[Dest], &Eof ) )
  802. X      {
  803. X      /* Well, nothing very good tiday... this thing is a bit brokenn...    */
  804. X      /* Let me see... Did I have an EOF there ????                */
  805. X      if ( Eof ) { close (eth->IoFd[Dest]); eth->IoFd[Dest]=0; }
  806. X      /* Can't be bthered to report it..                    */
  807. X      return (NOT_DONE);
  808. X      }
  809. X
  810. X   return (DONE);
  811. X   }
  812. END_OF_FILE
  813.   if test 1958 -ne `wc -c <'IPP/ethernet/ProcessPacket.c'`; then
  814.     echo shar: \"'IPP/ethernet/ProcessPacket.c'\" unpacked with wrong size!
  815.   fi
  816.   # end of 'IPP/ethernet/ProcessPacket.c'
  817. fi
  818. if test -f 'IPP/host/ReceivePacket.c' -a "${1}" != "-c" ; then 
  819.   echo shar: Will not clobber existing file \"'IPP/host/ReceivePacket.c'\"
  820. else
  821.   echo shar: Extracting \"'IPP/host/ReceivePacket.c'\" \(1469 characters\)
  822.   sed "s/^X//" >'IPP/host/ReceivePacket.c' <<'END_OF_FILE'
  823. X/* ------------------------------------------------------------------------------
  824. X * Ident: ReceivePacket.d
  825. X * Author: Damiano Bolla 1993
  826. X * All this project is covered by the GNU Copyright.
  827. X */
  828. X
  829. X#include <stdio.h>
  830. X#include <string.h>
  831. X#include <sys/types.h>
  832. X#include <sys/socket.h>
  833. X#include <netdb.h>
  834. X#include <sys/time.h>
  835. X#include <netinet/in.h>
  836. X#include "defs.h"
  837. X#include "debug.h"
  838. X#include "packet.h"
  839. X#include "router.h"
  840. X#include "host.h"
  841. X#include "func_defs.h"
  842. X
  843. Xextern struct Debug dbg;
  844. X
  845. Xint ReceivePacket ( struct Host *hostdata )
  846. X   {
  847. X   int Eof;
  848. X   struct IPP     ippR;
  849. X   struct IPPaddr addr;
  850. X
  851. X   Eof = FALSE;
  852. X   RcvPack( &ippR, hostdata->NetFd, &Eof);
  853. X   if ( Eof ) return (NOT_DONE);
  854. X
  855. X   ipp_StoA (&ippR,&addr);
  856. X
  857. X   if ( ippR.Type == PTYPE_DATA )
  858. X      {
  859. X      printf ("Data from %s ===== ",ipp_ntoa (&addr));
  860. X      printf ("I am  %s \n",ipp_ntoa (&hostdata->Myaddr));
  861. X      ippR.Data[ippR.DataLen] = 0;
  862. X      printf ("%s \n",ippR.Data);
  863. X      return (DONE);
  864. X      }
  865. X   
  866. X   if ( ippR.Type == PTYPE_RR )
  867. X      {
  868. X      printf ("RR from %s ===== ",ipp_ntoa (&addr));
  869. X      printf ("I am  %s \n",ipp_ntoa (&hostdata->Myaddr));
  870. X      ippR.Data[ippR.DataLen] = 0;
  871. X      printf ("%s \n",ippR.Data);
  872. X      return (DONE);
  873. X      }
  874. X
  875. X   if ( ippR.Type == PTYPE_PING )
  876. X      {
  877. X      printf ("Received PING packet from %s \n",ipp_ntoa(&addr));
  878. X      return (DONE);
  879. X      }
  880. X
  881. X   printf ("Unknown packet type %d from %s \n",ippR.Type, ipp_ntoa(&addr));
  882. X   return (DONE);
  883. X   }
  884. END_OF_FILE
  885.   if test 1469 -ne `wc -c <'IPP/host/ReceivePacket.c'`; then
  886.     echo shar: \"'IPP/host/ReceivePacket.c'\" unpacked with wrong size!
  887.   fi
  888.   # end of 'IPP/host/ReceivePacket.c'
  889. fi
  890. if test -f 'IPP/host/host.c' -a "${1}" != "-c" ; then 
  891.   echo shar: Will not clobber existing file \"'IPP/host/host.c'\"
  892. else
  893.   echo shar: Extracting \"'IPP/host/host.c'\" \(1833 characters\)
  894.   sed "s/^X//" >'IPP/host/host.c' <<'END_OF_FILE'
  895. X/* ------------------------------------------------------------------------------
  896. X * Ident: host.c
  897. X * Author: Damiano Bolla 1993
  898. X * All this project is covered by the GNU Copyright.
  899. X */
  900. X
  901. X#include <stdio.h>
  902. X#include <string.h>
  903. X#include <sys/types.h>
  904. X#include <sys/socket.h>
  905. X#include <netdb.h>
  906. X#include <sys/time.h>
  907. X#include <netinet/in.h>
  908. X#include "defs.h"
  909. X#include "debug.h"
  910. X#include "packet.h"
  911. X#include "router.h"
  912. X#include "host.h"
  913. X#include "func_defs.h"
  914. X
  915. Xstruct Debug dbg;
  916. X
  917. X/* This is a host. It can only have one link 
  918. X * The link is setup at startup time by command line.
  919. X */
  920. X
  921. Xint main ( int argc, char *argv[] )
  922. X   {
  923. X   struct Host hostdata;
  924. X   fd_set  readfds;
  925. X   struct timeval timeout;
  926. X   int error;
  927. X
  928. X   /* First thing to do is to setup the debugging unit...            */
  929. X   if ( DebugInit ( "localhost", "1234", "Host") ) return (1);
  930. X
  931. X   if ( HostInit ( &hostdata ) ) return (1);
  932. X
  933. X   strcpy (dbg.ident, ipp_ntoa(&hostdata.Myaddr));
  934. X
  935. X   sleep (5);
  936. X
  937. X   for (;;)
  938. X      {
  939. X      FD_ZERO (&readfds);  
  940. X
  941. X      /* We have to set the mask each time we come here...                      */
  942. X      FD_SET (hostdata.NetFd, &readfds);
  943. X
  944. X      timeout.tv_sec = 1;       /* Timeout in  seconds                  */
  945. X      timeout.tv_usec = 0;      /* and no microseconds                 */
  946. X
  947. X      error = select  (MAX_FILES, &readfds, NULL, NULL, &timeout);
  948. X
  949. X      if ( error < 0 ) 
  950. X         {
  951. X         sprintf (dbg.msg,"Host: Select failed badly");
  952. X         DebugCall ( ERR_MSG, DEBUG_ALERT );
  953. X         }
  954. X
  955. X      if ( error == 0 ) 
  956. X         {
  957. X         sprintf (dbg.msg,"Host: Host is idle, let's send a packet");
  958. X         DebugCall ( ERR_MSG, DEBUG_TEXT );
  959. X         if ( SendPacket ( &hostdata ) ) return (0);
  960. X         }
  961. X
  962. X      if ( (error > 0) && FD_ISSET (hostdata.NetFd, &readfds) ) 
  963. X         if ( ReceivePacket ( &hostdata ) ) return (0);
  964. X
  965. X      }
  966. X   }
  967. END_OF_FILE
  968.   if test 1833 -ne `wc -c <'IPP/host/host.c'`; then
  969.     echo shar: \"'IPP/host/host.c'\" unpacked with wrong size!
  970.   fi
  971.   # end of 'IPP/host/host.c'
  972. fi
  973. if test -f 'IPP/include/defs.h' -a "${1}" != "-c" ; then 
  974.   echo shar: Will not clobber existing file \"'IPP/include/defs.h'\"
  975. else
  976.   echo shar: Extracting \"'IPP/include/defs.h'\" \(1609 characters\)
  977.   sed "s/^X//" >'IPP/include/defs.h' <<'END_OF_FILE'
  978. X/* ----------------------------------------------------------------------
  979. X * AUthor: Damiano Bolla, 1993
  980. X * All this project is covered by the GNU Copyright.
  981. X */
  982. X
  983. X#ifndef DEFS_H
  984. X#define DEFS_H
  985. X
  986. X/* This file include the definitions of what MUST be common.
  987. X * Things MUST be defined ONCE !!!
  988. X * NOTE: The following small set of constants MUST NOT be changed
  989. X */
  990. X
  991. X#define DONE        0    /* Sam as below.. :-)                */
  992. X#define FALSE        0    /* So you can do if ( .. )             */
  993. X#define NOT_USED    0    /* Do not change this !!!!             */
  994. X
  995. X#define NOT_DONE    -1    /* Do not change this                 */
  996. X#define TRUE        -1    /* Anything different tan Zero             */
  997. X
  998. X/* -------------------------------------------------------------------
  999. X * General constants here
  1000. X */
  1001. X
  1002. X#define LISTEN_QUEUE    4    /* Length of thexlistening queue        */
  1003. X#define SREAD_TOUT    5    /* Timeout for a SafeRead Function         */
  1004. X#define IDLE_TOUT    30    /* Timeout to decide a select is idle (sec)    */
  1005. X
  1006. X#define MAX_FILES    60    /* Max number of open files             */
  1007. X#define ADDR_NUM    256    /* From 0 to 255                 */
  1008. X#define ADDR_DEPTH    16    /* The depthe of the tree can go 0->15         */
  1009. X#define IPP_DATA    1024    /* Max data into an IPP packet             */
  1010. X#define CONF_LLEN    1024    /* Maximum length of one config line         */
  1011. X#define INIT_TTL    255    /* Initial TTL value                 */
  1012. X#define MAX_COST    254    /* A route cannot cost more than this         */
  1013. X#define IP_NAMLEN    254    /* An ip name cannot be longer,,         */
  1014. X
  1015. X#define SOCK_TECH    1    /* Link type uses this tecnology         */
  1016. X#define SOCK_TECH_NAM    "sock"    /* The same as above but in ascii         */
  1017. X
  1018. X#define CMD_SEP        " \t\n\r"    /* A command can be divided by         */
  1019. X
  1020. X#define min(a,b) ((a) <= (b) ? (a) : (b))
  1021. X
  1022. X#endif
  1023. END_OF_FILE
  1024.   if test 1609 -ne `wc -c <'IPP/include/defs.h'`; then
  1025.     echo shar: \"'IPP/include/defs.h'\" unpacked with wrong size!
  1026.   fi
  1027.   # end of 'IPP/include/defs.h'
  1028. fi
  1029. if test -f 'IPP/include/ethernet.h' -a "${1}" != "-c" ; then 
  1030.   echo shar: Will not clobber existing file \"'IPP/include/ethernet.h'\"
  1031. else
  1032.   echo shar: Extracting \"'IPP/include/ethernet.h'\" \(1035 characters\)
  1033.   sed "s/^X//" >'IPP/include/ethernet.h' <<'END_OF_FILE'
  1034. X/* ----------------------------------------------------------------------
  1035. X * AUthor: Damiano Bolla, 1993
  1036. X * All this project is covered by the GNU Copyright.
  1037. X */
  1038. X
  1039. X#ifndef ETHERNET_H
  1040. X#define ETHERNET_H
  1041. X
  1042. X/* This file defines all things that are used by the ethernet system
  1043. X * In particular it defines a structure that holds all data useful
  1044. X * to describe the status of the ethernet driver.
  1045. X * In this way a singlepointer is passed around to the system.
  1046. X */
  1047. X
  1048. X
  1049. Xstruct Ethernet
  1050. X   {
  1051. X   char Host[IP_NAMLEN+2];    /* To store teh adress of this host        */
  1052. X   int ListenPort;    /* The port used to accept incoming connections        */
  1053. X   int ListenFd;    /* The file descriptor accepting incoming calls        */
  1054. X   int IoFd[ADDR_NUM];    /* The array that holds the descriptors of connections    */
  1055. X   fd_set readfds;    /* Used by select to know who is ready to read        */
  1056. X   u_long Idle;        /* Counts how many seconds it has been idle        */
  1057. X   u_long BadPack;    /* Counts the packets received that are bad        */
  1058. X   u_long LostPack;    /* Counts the lost packets                */
  1059. X   };
  1060. X
  1061. X#endif
  1062. END_OF_FILE
  1063.   if test 1035 -ne `wc -c <'IPP/include/ethernet.h'`; then
  1064.     echo shar: \"'IPP/include/ethernet.h'\" unpacked with wrong size!
  1065.   fi
  1066.   # end of 'IPP/include/ethernet.h'
  1067. fi
  1068. if test -f 'IPP/include/func_defs.h' -a "${1}" != "-c" ; then 
  1069.   echo shar: Will not clobber existing file \"'IPP/include/func_defs.h'\"
  1070. else
  1071.   echo shar: Extracting \"'IPP/include/func_defs.h'\" \(1658 characters\)
  1072.   sed "s/^X//" >'IPP/include/func_defs.h' <<'END_OF_FILE'
  1073. X/* ----------------------------------------------------------------------
  1074. X * AUthor: Damiano Bolla, 1993
  1075. X * All this project is covered by the GNU Copyright.
  1076. X */
  1077. X
  1078. X#ifndef FUNCDEFS_H
  1079. X#define FUNCDEFS_H
  1080. X
  1081. Xint   atoi  ( char *str );
  1082. Xint   ipp_atoi ( char *str );
  1083. X
  1084. Xchar *ReadConfig();
  1085. Xint Accept ( int Ring, int *Newsock, char *Msg, int MsgLen );
  1086. Xint Listen ( int *socket_id, char *host, int *port );
  1087. X
  1088. X#ifdef PACKET_H
  1089. Xstruct IPPaddr *ipp_aton( char *str );
  1090. Xchar   *ipp_ntoa ( struct IPPaddr *addr );
  1091. Xint Connect ( char *host, u_short port, int *sock, struct IPPaddr *Myaddr );
  1092. Xint SndPack ( struct IPP *ipp, int fd, int *Eof );
  1093. Xint RcvPack ( struct IPP *ipp, int fd, int *Eof );
  1094. Xint ipp_AtoS ( struct IPPaddr *src, struct IPP *dest );
  1095. Xint ipp_AtoR ( struct IPPaddr *src, struct IPP *dest );
  1096. Xint ipp_StoA ( struct IPP *src, struct IPPaddr *dest );
  1097. Xint ipp_RtoA ( struct IPP *src, struct IPPaddr *dest );
  1098. Xint ipp_AtoA ( struct IPPaddr *dest, struct IPPaddr *src );
  1099. Xint SetPackAddr ( struct IPP *ipp, struct IPPaddr *Snd, struct IPPaddr *Rcv );
  1100. Xint WhatIsIt ( struct IPPaddr *Myaddr, struct IPPaddr *dest );
  1101. X#endif
  1102. X
  1103. X#ifdef DEBUG_H
  1104. Xvoid DebugCall ( int ErrType, int ErrLevel );
  1105. Xint  DebugInit ( char *logd_host, char *logd_port, char *prog );
  1106. X#endif
  1107. X
  1108. X#ifdef ROUTER_H
  1109. Xint RouteHostMgr ( struct HostEntry *rdata );
  1110. Xint RouteNetMgr ( struct NetEntry *rdata );
  1111. Xint RouteAdd ( struct Routing *rinfo, char *Arg );
  1112. Xint FindHostRoute ( struct Routing *rinfo, u_char From, u_char Dest, u_char *NextHop, int *Interf );
  1113. Xint SeenAlready ( SeenData seendata, u_char Sender, u_char PackId );
  1114. Xint FindRoute ( struct Routing *rinfo, struct IPP *ipp, int    *Interf );
  1115. X#endif
  1116. X
  1117. X#endif
  1118. END_OF_FILE
  1119.   if test 1658 -ne `wc -c <'IPP/include/func_defs.h'`; then
  1120.     echo shar: \"'IPP/include/func_defs.h'\" unpacked with wrong size!
  1121.   fi
  1122.   # end of 'IPP/include/func_defs.h'
  1123. fi
  1124. if test -f 'IPP/include/host.h' -a "${1}" != "-c" ; then 
  1125.   echo shar: Will not clobber existing file \"'IPP/include/host.h'\"
  1126. else
  1127.   echo shar: Extracting \"'IPP/include/host.h'\" \(1501 characters\)
  1128.   sed "s/^X//" >'IPP/include/host.h' <<'END_OF_FILE'
  1129. X/* ----------------------------------------------------------------------
  1130. X * AUthor: Damiano Bolla, 1993
  1131. X * All this project is covered by the GNU Copyright.
  1132. X */
  1133. X
  1134. X#ifndef HOST_H
  1135. X#define HOST_H
  1136. X
  1137. X/* This file defines the structure that is used to hold the status 
  1138. X * information for the host program. 
  1139. X * A host program will just talk with anybody that it is told to.
  1140. X * The talk will be a pseudoramndom talk and the values will be given
  1141. X * by the network.
  1142. X * Statistics collection is also a duty of the host program.
  1143. X * On demand thi will report statistics..
  1144. X */
  1145. X
  1146. X#define PEER_MSG        256     /* Max size of a message between peers      */
  1147. X#define PEER_MAX    16    /* Max number of pers that a host can have    */
  1148. X
  1149. Xstruct PeerStruct
  1150. X   {
  1151. X   struct IPPaddr Peer;        /* The address to where to send data        */
  1152. X   int  Freq;            /* The proposed frequency of the talking X min    */
  1153. X   u_long SndCount;    /* Number of packets sent to the remote side        */
  1154. X   u_long RcvCount;    /* Number of packets received from the remote side    */
  1155. X   };
  1156. X
  1157. Xstruct Host
  1158. X   {
  1159. X   struct IPPaddr Myaddr;    /* Ny address                    */
  1160. X   u_char Router;        /* The single byte address of the router    */
  1161. X   u_char PackId;        /* Used to generate "unique" packet Id        */
  1162. X   int    CurPeer;         /* The perr I am sending messages        */
  1163. X   struct PeerStruct Peer[PEER_MAX+2];    /* A number of peers to talk with    */
  1164. X   u_long BadPack;        /* Number of bad packets received        */
  1165. X   fd_set readfds;        /* For select...                */
  1166. X   int    NetFd;        /* The network Fd to use...            */
  1167. X   };
  1168. X
  1169. X#endif
  1170. END_OF_FILE
  1171.   if test 1501 -ne `wc -c <'IPP/include/host.h'`; then
  1172.     echo shar: \"'IPP/include/host.h'\" unpacked with wrong size!
  1173.   fi
  1174.   # end of 'IPP/include/host.h'
  1175. fi
  1176. if test -f 'IPP/lib/route/AddressMatch.c' -a "${1}" != "-c" ; then 
  1177.   echo shar: Will not clobber existing file \"'IPP/lib/route/AddressMatch.c'\"
  1178. else
  1179.   echo shar: Extracting \"'IPP/lib/route/AddressMatch.c'\" \(1650 characters\)
  1180.   sed "s/^X//" >'IPP/lib/route/AddressMatch.c' <<'END_OF_FILE'
  1181. X/* ---------------------------------------------------------------------------
  1182. X * Ident: AddressMatch.c
  1183. X * Author: Damiano Bolla 1993
  1184. X * All this project is covered by the GNU Copyright.
  1185. X */
  1186. X
  1187. X#include <stdio.h>
  1188. X#include <memory.h>
  1189. X#include <sys/types.h>
  1190. X#include <sys/time.h>
  1191. X#include "defs.h"
  1192. X#include "debug.h"
  1193. X#include "packet.h"
  1194. X#include "router.h"
  1195. X#include "func_defs.h"
  1196. X
  1197. Xextern struct Debug dbg;
  1198. X
  1199. X/* This function will see if the FULL Myaddr match the DestAddr
  1200. X * This should try to avoid memory fault :-)
  1201. X * It will return TRUE if they match, FALSE othervise
  1202. X */
  1203. Xint AddressMatch ( struct IPPaddr *MyAddr, struct IPPaddr *DestAddr, int Depth )
  1204. X   {
  1205. X   u_char *Taddr;
  1206. X
  1207. X   if ( (MyAddr==NULL) || (DestAddr==NULL) ) 
  1208. X      {
  1209. X      sprintf (dbg.msg,"AddressMatch: You gave me NULL pointers ! ");
  1210. X      DebugCall ( ERR_NULL, DEBUG_CRITICAL );
  1211. X      return (FALSE);
  1212. X      }
  1213. X
  1214. X   /* If the address depth is longer than the full length of my address
  1215. X    * what can I check ??? There is something very wrong here
  1216. X    */
  1217. X   if ( Depth >= MyAddr->Al ) return (FALSE);
  1218. X
  1219. X   /* This is really an error... what should I do ?? Debug ??            */
  1220. X   if ( Depth+DestAddr->Al >= ADDR_DEPTH ) 
  1221. X      {
  1222. X      sprintf (dbg.msg,"AddressMatch: Depth is %d DestLeng is %d ",Depth,DestAddr->Al);
  1223. X      DebugCall ( ERR_BADDEPTH, DEBUG_ALERT );
  1224. X      return (FALSE);
  1225. X      }
  1226. X
  1227. X   /* I will the start checkng from here...                    */
  1228. X   Taddr = &MyAddr->Addr[Depth];
  1229. X
  1230. X   /* Ok, almost done, I just have to compare the two things            */
  1231. X   if ( (memcmp(Taddr, DestAddr->Addr, DestAddr->Al)==0) && 
  1232. X        (DestAddr->Al == MyAddr->Al-Depth) ) return (TRUE);
  1233. X   else return (FALSE);
  1234. X   }
  1235. END_OF_FILE
  1236.   if test 1650 -ne `wc -c <'IPP/lib/route/AddressMatch.c'`; then
  1237.     echo shar: \"'IPP/lib/route/AddressMatch.c'\" unpacked with wrong size!
  1238.   fi
  1239.   # end of 'IPP/lib/route/AddressMatch.c'
  1240. fi
  1241. if test -f 'IPP/lib/route/FindHostRoute.c' -a "${1}" != "-c" ; then 
  1242.   echo shar: Will not clobber existing file \"'IPP/lib/route/FindHostRoute.c'\"
  1243. else
  1244.   echo shar: Extracting \"'IPP/lib/route/FindHostRoute.c'\" \(1844 characters\)
  1245.   sed "s/^X//" >'IPP/lib/route/FindHostRoute.c' <<'END_OF_FILE'
  1246. X/* ---------------------------------------------------------------------------
  1247. X * Ident: FindHostRoute.c
  1248. X * Author: Damiano Bolla 1993
  1249. X * All this project is covered by the GNU Copyright.
  1250. X */
  1251. X
  1252. X#include <stdio.h>
  1253. X#include <sys/types.h>
  1254. X#include <sys/time.h>
  1255. X#include "defs.h"
  1256. X#include "debug.h"
  1257. X#include "packet.h"
  1258. X#include "router.h"
  1259. X#include "func_defs.h"
  1260. X
  1261. Xextern struct Debug dbg;
  1262. X
  1263. X/* This tryes to find a route to the desired destination...
  1264. X * It wants the routing table, the destination, depth, and returns
  1265. X * what is the right next with the given depth and the interface.
  1266. X * NOTE: The interface returned is NOT a file descriptor it is anumber
  1267. X * indicating what interface to use !!!
  1268. X * NOTE: This ONLY find a route to a HOST in this net !
  1269. X */
  1270. Xint FindHostRoute ( struct Routing *rinfo, 
  1271. X    u_char From,
  1272. X    u_char Dest, 
  1273. X    u_char *NextHop, 
  1274. X    int *Interf )
  1275. X   {
  1276. X   struct HostEntry *Entry;
  1277. X   int    UseThis;
  1278. X
  1279. X   /* If this host has any route I can use it...                */
  1280. X   /* Othervise I have to say there is no route available...            */
  1281. X   Entry = &rinfo->hostdata[Dest];
  1282. X   UseThis = Entry->Direct;
  1283. X   if ( !UseThis )
  1284. X      {
  1285. X      sprintf (dbg.msg,"FindHostRoute: Cannot find any route to Host %d",Dest);
  1286. X      DebugCall ( ERR_BADROUTE, DEBUG_NOTICE );
  1287. X      return (NOT_DONE);
  1288. X      }
  1289. X
  1290. X   /* Let me see.. is the proposed route the one I got the packet from ?    */
  1291. X   if ( Entry->Link[UseThis].Next == From ) 
  1292. X      UseThis = Entry->Another;
  1293. X
  1294. X   if ( !UseThis )
  1295. X      {
  1296. X      sprintf (dbg.msg,"FindHostRoute: No way to avoid a loop %d",Dest);
  1297. X      DebugCall ( ERR_BADROUTE, DEBUG_NOTICE );
  1298. X      rinfo->LoopCount++;
  1299. X      return (NOT_DONE);
  1300. X      }
  1301. X
  1302. X   *Interf  = Entry->Link[UseThis].Interface;
  1303. X   *NextHop = Entry->Link[UseThis].Next;
  1304. X   Entry->Link[UseThis].Cumulated += Entry->Link[UseThis].Cost;
  1305. X   RouteHostMgr ( Entry );
  1306. X   return (DONE);
  1307. X   }
  1308. END_OF_FILE
  1309.   if test 1844 -ne `wc -c <'IPP/lib/route/FindHostRoute.c'`; then
  1310.     echo shar: \"'IPP/lib/route/FindHostRoute.c'\" unpacked with wrong size!
  1311.   fi
  1312.   # end of 'IPP/lib/route/FindHostRoute.c'
  1313. fi
  1314. if test -f 'IPP/lib/route/ShowInterface.c' -a "${1}" != "-c" ; then 
  1315.   echo shar: Will not clobber existing file \"'IPP/lib/route/ShowInterface.c'\"
  1316. else
  1317.   echo shar: Extracting \"'IPP/lib/route/ShowInterface.c'\" \(1518 characters\)
  1318.   sed "s/^X//" >'IPP/lib/route/ShowInterface.c' <<'END_OF_FILE'
  1319. X/* ---------------------------------------------------------------------------
  1320. X * Ident: ShowInterface.c
  1321. X * Author: Damiano Bolla 1993
  1322. X * All this project is covered by the GNU Copyright.
  1323. X */
  1324. X
  1325. X#include <stdio.h>
  1326. X#include <string.h>
  1327. X#include <sys/types.h>
  1328. X#include <sys/time.h>
  1329. X#include "defs.h"
  1330. X#include "debug.h"
  1331. X#include "packet.h"
  1332. X#include "router.h"
  1333. X#include "commands.h"
  1334. X#include "func_defs.h"
  1335. X
  1336. Xextern struct Debug dbg;
  1337. X
  1338. X/* This one looks at the tree tables of routing and try to print them
  1339. X * in a nice way. The difficult thing is NOT to ooverflow th buffer.
  1340. X */
  1341. Xint ShowInterface ( struct Routing *rinfo, char *Buff, int Bufflen )
  1342. X   {
  1343. X   int c;
  1344. X   char *ptr;
  1345. X
  1346. X   ptr = Buff;
  1347. X
  1348. X   sprintf (ptr,"If \t Line \t Tech \t Ring \t Host \t Port \t Sent \t Received \n");
  1349. X   ptr += strlen (ptr);
  1350. X
  1351. X   for (c=1; c<=IF_MAX; c++)
  1352. X      {
  1353. X      /* If there is no data to show why bother ???                */
  1354. X      if ( rinfo->ifdata[c].Line==0 && rinfo->ifdata[c].Ring==0 ) continue;
  1355. X
  1356. X      sprintf (ptr,"%d \t %d \t %d \t %d \t %s \t %d \t %d \t %d\n",c,
  1357. X        rinfo->ifdata[c].Line, rinfo->ifdata[c].Technology, 
  1358. X        rinfo->ifdata[c].Ring, rinfo->ifdata[c].RingHost, 
  1359. X        rinfo->ifdata[c].RingPort, rinfo->ifdata[c].Sent,
  1360. X        rinfo->ifdata[c].Received );
  1361. X      ptr += strlen (ptr);
  1362. X      if ( strlen (Buff) > Bufflen )
  1363. X         {
  1364. X         sprintf (dbg.msg,"ShowInterface: Not enough space in the buffer ");
  1365. X         DebugCall ( ERR_MEMFAULT, DEBUG_CRASH );
  1366. X         exit (1); 
  1367. X         }
  1368. X      }
  1369. X   return (DONE);
  1370. X   }
  1371. X
  1372. END_OF_FILE
  1373.   if test 1518 -ne `wc -c <'IPP/lib/route/ShowInterface.c'`; then
  1374.     echo shar: \"'IPP/lib/route/ShowInterface.c'\" unpacked with wrong size!
  1375.   fi
  1376.   # end of 'IPP/lib/route/ShowInterface.c'
  1377. fi
  1378. if test -f 'IPP/lib/route/WhatIsIt.c' -a "${1}" != "-c" ; then 
  1379.   echo shar: Will not clobber existing file \"'IPP/lib/route/WhatIsIt.c'\"
  1380. else
  1381.   echo shar: Extracting \"'IPP/lib/route/WhatIsIt.c'\" \(2123 characters\)
  1382.   sed "s/^X//" >'IPP/lib/route/WhatIsIt.c' <<'END_OF_FILE'
  1383. X/* ---------------------------------------------------------------------------------
  1384. X * Ident: WhatIsIt.c
  1385. X * Author: Damiano Bolla 1993
  1386. X * All this project is covered by the GNU Copyright.
  1387. X */
  1388. X
  1389. X#include <stdio.h>
  1390. X#include <sys/types.h>
  1391. X#include <string.h>
  1392. X#include "defs.h"
  1393. X#include "debug.h"
  1394. X#include "packet.h"
  1395. X#include "router.h"
  1396. X#include "func_defs.h"
  1397. X
  1398. X/* This function will check if the dest address is a subnet of the 
  1399. X * given local address. It should be robust... and use the depth information
  1400. X * NOTE: The myaddr is in COMPLETE form, I.e. not relative to depth
  1401. X * It will return what the dest address is relative to the current address.
  1402. X * It will return it in the return paramenter.
  1403. X */
  1404. X
  1405. Xint WhatIsIt ( struct IPPaddr *Myaddr, struct IPPaddr *Dest )
  1406. X   {
  1407. X   int  BytesToCheck;
  1408. X   int  Remain;
  1409. X   int  More;
  1410. X   char *Myptr;
  1411. X   char *Deptr;
  1412. X   int  c;
  1413. X   u_char Depth;
  1414. X
  1415. X   Depth = Dest->Depth;
  1416. X
  1417. X   BytesToCheck = Myaddr->Al - Depth;
  1418. X   if ( BytesToCheck <= 0 ) return (NOT_DONE);
  1419. X
  1420. X   /* More counts the number of bytes up and down the above Remain        */
  1421. X   More = Dest->Al-BytesToCheck;
  1422. X   /* If the dest address is shorter then where I am ... It is a parent        */
  1423. X   if (More<0) return (IS_PARENTNET);
  1424. X
  1425. X   Myptr = &Myaddr->Addr[Depth];
  1426. X   Deptr = Dest->Addr;
  1427. X
  1428. X   /* Note that I go from 1 to ... since I count the bytes checked        */
  1429. X   /* Weelll, circa, the following is correct :-)                */
  1430. X   c=0;
  1431. X   while ( (c<BytesToCheck) && (*Myptr++ == *Deptr++) ) c++;
  1432. X
  1433. X   /* Remain counte the numebr of bytes difference that thre are between the
  1434. X    * address of the router and the destination address
  1435. X    */
  1436. X   Remain = BytesToCheck - c;
  1437. X
  1438. X   if ( Remain == 0 ) 
  1439. X      {
  1440. X      /* This can be my same host OR a subnet of my host            */
  1441. X      if (More>0) return (IS_SUBNET);
  1442. X      else return (IS_THISHOST);
  1443. X      }
  1444. X
  1445. X   if ( Remain == 1 ) 
  1446. X      {
  1447. X      /* This can be a host of this net OR a subnet,,,..            */
  1448. X      if (More> 0) return (IS_SUBNET);
  1449. X      else return (IS_SAMENET);
  1450. X      }
  1451. X   if ( Remain > 1 ) return (IS_PARENTNET);
  1452. X
  1453. X   /* The above series of if should cover all cases.. if it doesnt..        */
  1454. X   return (NOT_DONE);
  1455. X   }
  1456. END_OF_FILE
  1457.   if test 2123 -ne `wc -c <'IPP/lib/route/WhatIsIt.c'`; then
  1458.     echo shar: \"'IPP/lib/route/WhatIsIt.c'\" unpacked with wrong size!
  1459.   fi
  1460.   # end of 'IPP/lib/route/WhatIsIt.c'
  1461. fi
  1462. if test -f 'IPP/lib/utils/Accept.c' -a "${1}" != "-c" ; then 
  1463.   echo shar: Will not clobber existing file \"'IPP/lib/utils/Accept.c'\"
  1464. else
  1465.   echo shar: Extracting \"'IPP/lib/utils/Accept.c'\" \(1619 characters\)
  1466.   sed "s/^X//" >'IPP/lib/utils/Accept.c' <<'END_OF_FILE'
  1467. X/* -----------------------------------------------------------------------------
  1468. X * Ident: Accept.c
  1469. X * Author: Damiano Bolla
  1470. X * All this project is covered by the GNU Copyright.
  1471. X */
  1472. X
  1473. X#include <stdio.h>
  1474. X#include <unistd.h>
  1475. X#include <string.h>
  1476. X#include <sys/types.h>
  1477. X#include <sys/socket.h>
  1478. X#include <sys/time.h>
  1479. X#include <netinet/in.h>
  1480. X#include "defs.h"
  1481. X#include "commands.h"
  1482. X#include "debug.h"
  1483. X#include "ethernet.h"
  1484. X#include "func_defs.h"
  1485. X
  1486. Xextern struct Debug dbg;     
  1487. X
  1488. X/* This one accept a connection. It knows that there is omeone calling.
  1489. X * Once the connection is accepted it gets what the other side wants
  1490. X * The dialog MUST be non blocking !!!!!!
  1491. X */
  1492. X
  1493. Xint Accept ( int Ring, int *Newsock, char *Msg, int MsgLen )
  1494. X   {
  1495. X   struct sockaddr_in from_where;
  1496. X   int socksize;
  1497. X   int newsocket;
  1498. X   int Letti;
  1499. X
  1500. X   socksize = sizeof ( from_where );
  1501. X   newsocket = accept ( Ring, (struct sockaddr *)&from_where, &socksize );
  1502. X   if ( newsocket < 0 )
  1503. X      {
  1504. X      sprintf (dbg.msg,"Accept: accept Syscall failed ");
  1505. X      DebugCall ( ERR_NOACCEPT, DEBUG_ALERT );
  1506. X      return (NOT_DONE);
  1507. X      }
  1508. X
  1509. X   /* Ok, adesso il nuovo descriptor newsocket dovrebbe avere dei dati        */
  1510. X   Letti = SafeRead ( SREAD_TOUT, newsocket, Msg, MsgLen);
  1511. X   if ( Letti == NOT_DONE )
  1512. X      {
  1513. X      sprintf (dbg.msg,"Accept: Nothing read from channel");
  1514. X      DebugCall ( ERR_SREAD, DEBUG_NOTICE );
  1515. X      close (newsocket);
  1516. X      return (NOT_DONE);
  1517. X      }
  1518. X
  1519. X   /* Ok, we have something here... we have to process it and do wht request    */
  1520. X   *Newsock = newsocket;
  1521. X   Msg[Letti]=0;    /* Must be shure that there is a 0 at the end        */
  1522. X   return (DONE);
  1523. X   }
  1524. END_OF_FILE
  1525.   if test 1619 -ne `wc -c <'IPP/lib/utils/Accept.c'`; then
  1526.     echo shar: \"'IPP/lib/utils/Accept.c'\" unpacked with wrong size!
  1527.   fi
  1528.   # end of 'IPP/lib/utils/Accept.c'
  1529. fi
  1530. if test -f 'IPP/lib/utils/GetAddress.c' -a "${1}" != "-c" ; then 
  1531.   echo shar: Will not clobber existing file \"'IPP/lib/utils/GetAddress.c'\"
  1532. else
  1533.   echo shar: Extracting \"'IPP/lib/utils/GetAddress.c'\" \(1924 characters\)
  1534.   sed "s/^X//" >'IPP/lib/utils/GetAddress.c' <<'END_OF_FILE'
  1535. X/* ---------------------------------------------------------------------------
  1536. X * Ident: GetAddress.c
  1537. X * Author: Damiano Bolla 1993
  1538. X * All this project is covered by the GNU Copyright.
  1539. X */
  1540. X
  1541. X#include <stdio.h>
  1542. X#include <string.h>
  1543. X#include <sys/types.h>
  1544. X#include <sys/time.h>
  1545. X#include "defs.h"
  1546. X#include "commands.h"
  1547. X#include "debug.h"
  1548. X#include "packet.h"
  1549. X#include "router.h"
  1550. X#include "func_defs.h"
  1551. X
  1552. Xextern struct Debug dbg;
  1553. X
  1554. X/* This function will try to read the network address of a machine from stdin
  1555. X * It returns NOT_DONE if it fails, DOEN otherwise...
  1556. X * Debugging is done via the logd daemon.
  1557. X */
  1558. X
  1559. Xint GetAddress ( struct IPPaddr* addr )
  1560. X   {
  1561. X   struct IPPaddr *tmp;
  1562. X   char *Line;    /* The command line I am parsing...                */
  1563. X   char *Cmd;    /* The given command                        */
  1564. X   char *Arg;    /* The given argument                        */
  1565. X   char Null[2]={0};
  1566. X
  1567. X   if ( (Line=ReadConfig(stdin)) == NULL )
  1568. X      {
  1569. X      /* Hey almeno il mio indirizzo me lo devi dare !!!            */
  1570. X      sprintf (dbg.msg,"GetAddress: You MUST give me my address !");
  1571. X      DebugCall ( ERR_CONFIG, DEBUG_CRITICAL );
  1572. X      return (NOT_DONE);
  1573. X      }
  1574. X
  1575. X   /* Ok, now... in general each config option is in key-value format        */
  1576. X   /* So... what I need to do is to break the two and use the appropriate func    */
  1577. X   if ((Cmd=strtok(Line,CMD_SEP))==NULL) Cmd=Null;
  1578. X
  1579. X   if ( strcasecmp (Cmd, CMD_ADDR) != 0 )
  1580. X      {
  1581. X      sprintf (dbg.msg,"GetAddress: You forgot the command ?? %s !",CMD_ADDR);
  1582. X      DebugCall ( ERR_CONFIG, DEBUG_CRITICAL );
  1583. X      return (NOT_DONE);
  1584. X      }
  1585. X
  1586. X   /* Ok , the remaining part is the wanted address...                */
  1587. X   if ((Arg=strtok(NULL,CMD_SEP))==NULL) Arg=Null;
  1588. X   
  1589. X   if ( (tmp=ipp_aton(Arg)) == NULL )
  1590. X      {
  1591. X      sprintf (dbg.msg,"GetAddress: Cannot convert '%s'",Cmd );
  1592. X      DebugCall ( ERR_CONFIG, DEBUG_CRITICAL );
  1593. X      return (NOT_DONE);
  1594. X      }
  1595. X
  1596. X   /* good good... almost all done...                        */
  1597. X   ipp_AtoA ( addr, tmp );
  1598. X   return (DONE);
  1599. X   }
  1600. END_OF_FILE
  1601.   if test 1924 -ne `wc -c <'IPP/lib/utils/GetAddress.c'`; then
  1602.     echo shar: \"'IPP/lib/utils/GetAddress.c'\" unpacked with wrong size!
  1603.   fi
  1604.   # end of 'IPP/lib/utils/GetAddress.c'
  1605. fi
  1606. if test -f 'IPP/lib/utils/Listen.c' -a "${1}" != "-c" ; then 
  1607.   echo shar: Will not clobber existing file \"'IPP/lib/utils/Listen.c'\"
  1608. else
  1609.   echo shar: Extracting \"'IPP/lib/utils/Listen.c'\" \(1813 characters\)
  1610.   sed "s/^X//" >'IPP/lib/utils/Listen.c' <<'END_OF_FILE'
  1611. X/* -------------------------------------------------------------------------
  1612. X * Ident: Listen.c
  1613. X * Author: Damiano Bolla 1993
  1614. X * All this project is covered by the GNU Copyright.
  1615. X */
  1616. X
  1617. X#include <stdio.h>
  1618. X#include <unistd.h>
  1619. X#include <sys/types.h>
  1620. X#include <sys/socket.h>    
  1621. X#include <sys/utsname.h>
  1622. X#include <netinet/in.h>    
  1623. X#include <sys/utsname.h>
  1624. X#include <netdb.h>    
  1625. X#include <signal.h>    
  1626. X#include "defs.h"
  1627. X#include "debug.h"
  1628. X#include "func_defs.h"
  1629. X
  1630. Xextern struct Debug dbg;
  1631. X
  1632. X/* This Function creates a socket and set it in Listen mode.
  1633. X * It requires the structure to handle errors and it will return
  1634. X * appropriate values on return.
  1635. X */
  1636. X
  1637. Xint Listen ( int *socket_id, char *host, int *port )
  1638. X   {
  1639. X   int listen_socket;
  1640. X   int address_len;
  1641. X   struct sockaddr_in address;    
  1642. X
  1643. X   listen_socket = socket ( AF_INET, SOCK_STREAM, 0);
  1644. X   if ( listen_socket < 0 ) 
  1645. X      {
  1646. X      sprintf (dbg.msg,"Listen: non poso creare il socket");
  1647. X      DebugCall ( ERR_NOLISTEN, DEBUG_CRITICAL );
  1648. X      return (NOT_DONE);
  1649. X      }
  1650. X
  1651. X   if ( listen ( listen_socket, LISTEN_QUEUE ) )
  1652. X      {
  1653. X      sprintf (dbg.msg,"Listen: Can't set socket to listen");
  1654. X      DebugCall ( ERR_NOLISTEN, DEBUG_CRITICAL );
  1655. X      close ( listen_socket );
  1656. X      return (NOT_DONE);
  1657. X      }
  1658. X
  1659. X   address_len = sizeof (struct sockaddr_in);
  1660. X   if ( getsockname (listen_socket, (struct sockaddr *)&address, &address_len ) )
  1661. X      {
  1662. X      sprintf (dbg.msg,"Listen: Can't get socket data with getsockname ");
  1663. X      DebugCall ( ERR_NOLISTEN, DEBUG_CRITICAL );
  1664. X      close ( listen_socket );
  1665. X      return (NOT_DONE);
  1666. X      }
  1667. X
  1668. X   /* I have to return/store the name of this host..            */
  1669. X   gethostname (host, IP_NAMLEN);
  1670. X
  1671. X   /* Ok at this point all is fine I can return safely :-)        */
  1672. X   *socket_id = listen_socket;
  1673. X   *port = ntohs(address.sin_port);
  1674. X   return (DONE);
  1675. X   }
  1676. END_OF_FILE
  1677.   if test 1813 -ne `wc -c <'IPP/lib/utils/Listen.c'`; then
  1678.     echo shar: \"'IPP/lib/utils/Listen.c'\" unpacked with wrong size!
  1679.   fi
  1680.   # end of 'IPP/lib/utils/Listen.c'
  1681. fi
  1682. if test -f 'IPP/lib/utils/ReadConfig.c' -a "${1}" != "-c" ; then 
  1683.   echo shar: Will not clobber existing file \"'IPP/lib/utils/ReadConfig.c'\"
  1684. else
  1685.   echo shar: Extracting \"'IPP/lib/utils/ReadConfig.c'\" \(1543 characters\)
  1686.   sed "s/^X//" >'IPP/lib/utils/ReadConfig.c' <<'END_OF_FILE'
  1687. X/* ---------------------------------------------------------------------------
  1688. X * Ident: ReadConfig.c
  1689. X * Author: Damiano Bolla 1993
  1690. X * All this project is covered by the GNU Copyright.
  1691. X */
  1692. X
  1693. X#include <stdio.h>
  1694. X#include <string.h>
  1695. X#include <ctype.h>
  1696. X#include <sys/types.h>
  1697. X#include <sys/time.h>
  1698. X#include "defs.h"
  1699. X#include "debug.h"
  1700. X#include "packet.h"
  1701. X#include "router.h"
  1702. X#include "func_defs.h"
  1703. X
  1704. X#define MAX_LINES    1000
  1705. X
  1706. Xextern struct Debug dbg;
  1707. X
  1708. X/* This function read from the config file and return only good entryes.
  1709. X * I.e. the returned pointer point s to a valid config option.
  1710. X * What it does is skip comments and blonk lines. Not much...
  1711. X * NOTE that it wants the file from where to read Ex: stdin...
  1712. X */
  1713. X
  1714. Xchar *ReadConfig ( FILE *input )
  1715. X   {
  1716. X   static char Risul[CONF_LLEN+2];    /* This will be the returned string    */
  1717. X   char   *NlPtr;
  1718. X   int c;
  1719. X
  1720. X   /* I have to cycle around until either the string is NULL or found valid    */
  1721. X   for (c=0; c<MAX_LINES; c++)
  1722. X      {
  1723. X      /* While reading I test for EOF in the direct caser.            */
  1724. X      if ( fgets(Risul, CONF_LLEN, input) == NULL ) return (NULL);
  1725. X      if ( strlen(Risul) == 0 ) return (NULL);    /* Found an EOF ??        */
  1726. X
  1727. X      /* The next two lines get rid of the possible newline at the end        */
  1728. X      NlPtr = strchr (Risul, '\n');
  1729. X      if ( NlPtr ) *NlPtr=0;
  1730. X
  1731. X      if ( isalpha (Risul[0]) ) return (Risul);    /* Got a config string        */
  1732. X      }
  1733. X
  1734. X   sprintf (dbg.msg,"ReadConfig: A config file longer than %d ???",MAX_LINES);
  1735. X   DebugCall ( ERR_CONFIG, DEBUG_CRITICAL );
  1736. X   return (NULL);
  1737. X   }
  1738. END_OF_FILE
  1739.   if test 1543 -ne `wc -c <'IPP/lib/utils/ReadConfig.c'`; then
  1740.     echo shar: \"'IPP/lib/utils/ReadConfig.c'\" unpacked with wrong size!
  1741.   fi
  1742.   # end of 'IPP/lib/utils/ReadConfig.c'
  1743. fi
  1744. if test -f 'IPP/lib/utils/SafeRead.c' -a "${1}" != "-c" ; then 
  1745.   echo shar: Will not clobber existing file \"'IPP/lib/utils/SafeRead.c'\"
  1746. else
  1747.   echo shar: Extracting \"'IPP/lib/utils/SafeRead.c'\" \(1729 characters\)
  1748.   sed "s/^X//" >'IPP/lib/utils/SafeRead.c' <<'END_OF_FILE'
  1749. X/* -------------------------------------------------------------------------
  1750. X * Ident: SafeRead.c
  1751. X * Author: Damiano Bolla 1993
  1752. X * All this project is covered by the GNU Copyright.
  1753. X */
  1754. X
  1755. X#include <stdio.h>
  1756. X#include <unistd.h>
  1757. X#include <sys/types.h>
  1758. X#include <sys/time.h>
  1759. X#include "defs.h"
  1760. X#include "debug.h"
  1761. X#include "func_defs.h"
  1762. X
  1763. Xextern struct Debug dbg;
  1764. X
  1765. X/* this function will read from a socket in a safe way.
  1766. X * That is without blokiing if there is no data.
  1767. X * This returns the nuber of bytes read if all is fine.
  1768. X * It it fails... it returns NOT_DONE (-1) BUT it does NOT close the socket
  1769. X */
  1770. X
  1771. Xint SafeRead ( int tout, int fd, char *buff, int BuffSize )
  1772. X   {
  1773. X   fd_set readfds;
  1774. X   struct timeval timeout;
  1775. X   int    Letti;
  1776. X   int    error;
  1777. X
  1778. X   FD_ZERO ( &readfds );
  1779. X   FD_SET  ( fd, &readfds );
  1780. X   timeout.tv_sec  = tout;    /* Timeout in  seconds                */
  1781. X   timeout.tv_usec = 0;        /* and no microseconds                */
  1782. X
  1783. X   error = select  (MAX_FILES, &readfds, NULL, NULL, &timeout);
  1784. X   if ( error == 0 )
  1785. X      {
  1786. X      sprintf (dbg.msg,"SafeRead: Select timeout ");
  1787. X      DebugCall ( ERR_NOLISTEN, DEBUG_NOTICE );
  1788. X      /* NOTE: I am not closing the socket Damiano                */
  1789. X      return (NOT_DONE);
  1790. X      }
  1791. X
  1792. X   if ( error < 0 )
  1793. X      {
  1794. X      sprintf (dbg.msg,"SafeRead: Select FAILED ");
  1795. X      DebugCall ( ERR_NOLISTEN, DEBUG_CRITICAL );
  1796. X      /* NOTE: I am not closing the socket Damiano                */
  1797. X      return (NOT_DONE);
  1798. X      }
  1799. X
  1800. X   if ( error > 0 )
  1801. X      {
  1802. X      Letti = read (fd, buff, BuffSize);
  1803. X      sprintf (dbg.msg,"SafeRead: Read succeded ");
  1804. X      DebugCall ( ERR_MSG, DEBUG_TEXT );
  1805. X      return ( Letti );    /* Return the number of chars read            */
  1806. X      }
  1807. X
  1808. X   /* Not that I can be here... anyway..                    */
  1809. X   return (NOT_DONE);   
  1810. X   }
  1811. END_OF_FILE
  1812.   if test 1729 -ne `wc -c <'IPP/lib/utils/SafeRead.c'`; then
  1813.     echo shar: \"'IPP/lib/utils/SafeRead.c'\" unpacked with wrong size!
  1814.   fi
  1815.   # end of 'IPP/lib/utils/SafeRead.c'
  1816. fi
  1817. if test -f 'IPP/lib/utils/WatchDog.c' -a "${1}" != "-c" ; then 
  1818.   echo shar: Will not clobber existing file \"'IPP/lib/utils/WatchDog.c'\"
  1819. else
  1820.   echo shar: Extracting \"'IPP/lib/utils/WatchDog.c'\" \(2051 characters\)
  1821.   sed "s/^X//" >'IPP/lib/utils/WatchDog.c' <<'END_OF_FILE'
  1822. X/* --------------------------------------------------------------------------------
  1823. X * Ident: WatchDog.c
  1824. X * Author: Damiano Bolla 1993
  1825. X * All this project is covered by the GNU Copyright.
  1826. X */
  1827. X
  1828. X
  1829. X#include <stdio.h>
  1830. X#include <unistd.h>
  1831. X#include <sys/types.h>
  1832. X#include <signal.h>
  1833. X#include "defs.h"
  1834. X#include "debug.h"
  1835. X#include "watchdog.h"
  1836. X#include "func_defs.h"
  1837. X
  1838. Xextern struct Debug dbg;
  1839. X
  1840. X/* This is a set of functions that deal with errors in a program.
  1841. X * In this case what I need to avoid at all cost is a program stopping in a syscall
  1842. X * It is too difficult to try to make all syscall non bloking with a recovery
  1843. X * system.. therefore I need a sort of hartbeat that when it stops kill teh program.
  1844. X * This is therefore the purpose of this bit. 
  1845. X * Of course not all programs will need this but ethernet, router and host.. yes !
  1846. X */
  1847. X
  1848. Xvoid Handler ( int Sig )
  1849. X   {
  1850. X   if ( Sig == SIGALRM )
  1851. X      {
  1852. X      /* I really got a signalarm... too bad !                    */
  1853. X      sprintf (dbg.msg,"Signal Handler: Got a Sigalarm from the WatchDog ! ");
  1854. X      DebugCall ( ERR_ALARM, DEBUG_PANIC );
  1855. X      chdir ("/tmp");    /* I want the core to be here... possibly        */
  1856. X      abort ();        /* End the program AND generate a core            */
  1857. X      exit (1);        /* Just in case...                    */
  1858. X      }
  1859. X
  1860. X   /* mhhh, why am I here ??? better tell and then die..            */
  1861. X   sprintf (dbg.msg,"Signal Handler: Got Signal %d I core and then die! ",Sig);
  1862. X   DebugCall ( ERR_SIGNAL, DEBUG_PANIC );
  1863. X   chdir ("/tmp");    /* I want the core to be here... possibly        */
  1864. X   abort ();        /* End the program AND generate a core            */
  1865. X   exit (1);        /* Just in case...                    */
  1866. X   }
  1867. X
  1868. X
  1869. X
  1870. X/* This is in charge to prepare the Watchdog Handler
  1871. X * It will NOT start the watchdog !!!!
  1872. X */
  1873. Xvoid WatchDogInit ( void (*Handler)() )
  1874. X   {
  1875. X   /* This cannot fail.. can it ??? :-)                        */
  1876. X   signal ( SIGALRM, Handler );
  1877. X   signal ( SIGSEGV, Handler );
  1878. X   signal ( SIGTERM, Handler );
  1879. X   }
  1880. X
  1881. X/* This function will activate the timer (in seconds)
  1882. X * If the value is Zero it deactivate it.
  1883. X */
  1884. Xint WatchDog ( int Sec ) { return (alarm (Sec)); }
  1885. END_OF_FILE
  1886.   if test 2051 -ne `wc -c <'IPP/lib/utils/WatchDog.c'`; then
  1887.     echo shar: \"'IPP/lib/utils/WatchDog.c'\" unpacked with wrong size!
  1888.   fi
  1889.   # end of 'IPP/lib/utils/WatchDog.c'
  1890. fi
  1891. if test -f 'IPP/monitor/Send.c' -a "${1}" != "-c" ; then 
  1892.   echo shar: Will not clobber existing file \"'IPP/monitor/Send.c'\"
  1893. else
  1894.   echo shar: Extracting \"'IPP/monitor/Send.c'\" \(1895 characters\)
  1895.   sed "s/^X//" >'IPP/monitor/Send.c' <<'END_OF_FILE'
  1896. X/* ------------------------------------------------------------------------------
  1897. X * Ident: Send.c
  1898. X * Author: Damiano Bolla 1993
  1899. X * All this project is covered by the GNU Copyright.
  1900. X */
  1901. X
  1902. X#include <stdio.h>
  1903. X#include <string.h>
  1904. X#include <sys/types.h>
  1905. X#include <sys/socket.h>
  1906. X#include <netdb.h>
  1907. X#include <sys/time.h>
  1908. X#include <netinet/in.h>
  1909. X#include "defs.h"
  1910. X#include "debug.h"
  1911. X#include "packet.h"
  1912. X#include "router.h"
  1913. X#include "func_defs.h"
  1914. X
  1915. Xextern struct Debug dbg;
  1916. X
  1917. Xint Send ( struct IPPaddr *myaddr, int talksock, u_char NextHop , u_char *PackId)
  1918. X   {
  1919. X   struct IPPaddr *dest;
  1920. X   struct IPP      ippS;
  1921. X   char   Tbuff[CONF_LLEN+2];
  1922. X   char   TmpBuff[CONF_LLEN+2];
  1923. X   int    Eof;
  1924. X   u_char Mylastbyte;
  1925. X
  1926. X   TmpBuff[0]=0;    /* I must be shure it is empty        */
  1927. X   Mylastbyte = myaddr->Addr[myaddr->Al -1];
  1928. X
  1929. X   fflush (stdin); fflush (stdout);
  1930. X   printf ("%s Destination  > ",ipp_ntoa(myaddr));fflush (stdout);
  1931. X   while ( TtyGets(Tbuff,CONF_LLEN), strlen(Tbuff) == 0);
  1932. X   dest = ipp_aton (Tbuff);
  1933. X   if ( dest == NULL ) return (DONE); 
  1934. X
  1935. X   fflush (stdin); fflush (stdout);
  1936. X   printf ("Packet Type (Ping, Record-route, Data)  > ");fflush (stdout);
  1937. X   TtyGets(Tbuff,CONF_LLEN);
  1938. X   if ( Tbuff[0] == 'p' ) ippS.Type = PTYPE_PING;
  1939. X   if ( Tbuff[0] == 'r' ) ippS.Type = PTYPE_RR;
  1940. X   if ( Tbuff[0] == 'd' ) 
  1941. X      {
  1942. X      ippS.Type = PTYPE_DATA;
  1943. X      fflush (stdin);
  1944. X      printf ("Message  > ");fflush (stdout);
  1945. X      TtyGets (TmpBuff,CONF_LLEN);
  1946. X      } 
  1947. X
  1948. X   ipp_AtoS ( myaddr, &ippS );    
  1949. X   ipp_AtoR ( dest, &ippS );
  1950. X   ippS.NextRouter = NOT_USED;
  1951. X   ippS.NextHop = NextHop;
  1952. X   ippS.From = Mylastbyte;
  1953. X   ippS.Sender = Mylastbyte;
  1954. X   ippS.PackId = ++(*PackId);
  1955. X
  1956. X   ippS.Depth=0;
  1957. X   ippS.TTL=INIT_TTL;
  1958. X
  1959. X   ippS.DataLen = strlen(TmpBuff);
  1960. X   strcpy (ippS.Data,TmpBuff);
  1961. X
  1962. X   Eof = FALSE;
  1963. X   if ( SndPack( &ippS, talksock, &Eof) ) printf ("Send failed \n");
  1964. X   if ( Eof ) return (NOT_DONE);
  1965. X   return (DONE);
  1966. X   }
  1967. END_OF_FILE
  1968.   if test 1895 -ne `wc -c <'IPP/monitor/Send.c'`; then
  1969.     echo shar: \"'IPP/monitor/Send.c'\" unpacked with wrong size!
  1970.   fi
  1971.   # end of 'IPP/monitor/Send.c'
  1972. fi
  1973. echo shar: End of archive 5 \(of 6\).
  1974. cp /dev/null ark5isdone
  1975. MISSING=""
  1976. for I in 1 2 3 4 5 6 ; do
  1977.     if test ! -f ark${I}isdone ; then
  1978.     MISSING="${MISSING} ${I}"
  1979.     fi
  1980. done
  1981. if test "${MISSING}" = "" ; then
  1982.     echo You have unpacked all 6 archives.
  1983.     rm -f ark[1-9]isdone
  1984. else
  1985.     echo You still must unpack the following archives:
  1986.     echo "        " ${MISSING}
  1987. fi
  1988. exit 0
  1989. exit 0 # Just in case...
  1990.