IPXADDR.CPP 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508
  1. /*
  2. ** Command & Conquer Red Alert(tm)
  3. ** Copyright 2025 Electronic Arts Inc.
  4. **
  5. ** This program is free software: you can redistribute it and/or modify
  6. ** it under the terms of the GNU General Public License as published by
  7. ** the Free Software Foundation, either version 3 of the License, or
  8. ** (at your option) any later version.
  9. **
  10. ** This program is distributed in the hope that it will be useful,
  11. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. ** GNU General Public License for more details.
  14. **
  15. ** You should have received a copy of the GNU General Public License
  16. ** along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. /* $Header: /CounterStrike/IPXADDR.CPP 1 3/03/97 10:24a Joe_bostic $ */
  19. /***************************************************************************
  20. ** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S **
  21. ***************************************************************************
  22. * *
  23. * Project Name : Command & Conquer *
  24. * *
  25. * File Name : IPXADDR.CPP *
  26. * *
  27. * Programmer : Bill Randolph *
  28. * *
  29. * Start Date : December 19, 1994 *
  30. * *
  31. * Last Update : December 19, 1994 [BR] *
  32. * *
  33. *-------------------------------------------------------------------------*
  34. * Functions: *
  35. * IPXAddressClass::IPXAddressClass -- class constructor *
  36. * IPXAddressClass::IPXAddressClass -- class constructor form 2 *
  37. * IPXAddressClass::IPXAddressClass -- class constructor form 3 *
  38. * IPXAddressClass::Set_Address -- sets the IPX address values *
  39. * IPXAddressClass::Set_Address -- sets the IPX values from a header *
  40. * IPXAddressClass::Get_Address -- retrieves the IPX address values *
  41. * IPXAddressClass::Get_Address -- copies address into an IPX header *
  42. * IPXAddressClass::Is_Broadcast -- tells if this is a broadcast address *
  43. * IPXAddressClass::operator== -- overloaded comparison operator *
  44. * IPXAddressClass::operator!= -- overloaded comparison operator *
  45. * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
  46. #include "function.h"
  47. #include <stdio.h>
  48. #include <mem.h>
  49. #include "ipxaddr.h"
  50. #ifdef WINSOCK_IPX
  51. #include "WSProto.h"
  52. #endif //WINSOCK_IPX
  53. /***************************************************************************
  54. * IPXAddressClass::IPXAddressClass -- class constructor *
  55. * *
  56. * This default constructor generates a broadcast address. *
  57. * *
  58. * INPUT: *
  59. * net Network Number for this address *
  60. * node Node Address for this address *
  61. * *
  62. * OUTPUT: *
  63. * none. *
  64. * *
  65. * WARNINGS: *
  66. * none. *
  67. * *
  68. * HISTORY: *
  69. * 12/19/1994 BR : Created. *
  70. *=========================================================================*/
  71. IPXAddressClass::IPXAddressClass(void)
  72. {
  73. NetworkNumber[0] = 0xff;
  74. NetworkNumber[1] = 0xff;
  75. NetworkNumber[2] = 0xff;
  76. NetworkNumber[3] = 0xff;
  77. NodeAddress[0] = 0xff;
  78. NodeAddress[1] = 0xff;
  79. NodeAddress[2] = 0xff;
  80. NodeAddress[3] = 0xff;
  81. NodeAddress[4] = 0xff;
  82. NodeAddress[5] = 0xff;
  83. } /* end of IPXAddressClass */
  84. /***************************************************************************
  85. * IPXAddressClass::IPXAddressClass -- class constructor form 2 *
  86. * *
  87. * INPUT: *
  88. * net Network Number for this address *
  89. * node Node Address for this address *
  90. * *
  91. * OUTPUT: *
  92. * none. *
  93. * *
  94. * WARNINGS: *
  95. * none. *
  96. * *
  97. * HISTORY: *
  98. * 12/19/1994 BR : Created. *
  99. *=========================================================================*/
  100. IPXAddressClass::IPXAddressClass(NetNumType net, NetNodeType node)
  101. {
  102. memcpy(NetworkNumber, net, 4);
  103. memcpy(NodeAddress, node, 6);
  104. } /* end of IPXAddressClass */
  105. /***************************************************************************
  106. * IPXAddressClass::IPXAddressClass -- class constructor form 3 *
  107. * *
  108. * This form of the constructor takes an IPX header as an argument. It *
  109. * extracts the address from the Source address fields in the header. *
  110. * *
  111. * INPUT: *
  112. * header Header from which to extract the address *
  113. * *
  114. * OUTPUT: *
  115. * none. *
  116. * *
  117. * WARNINGS: *
  118. * none. *
  119. * *
  120. * HISTORY: *
  121. * 12/19/1994 BR : Created. *
  122. *=========================================================================*/
  123. IPXAddressClass::IPXAddressClass(IPXHeaderType *header)
  124. {
  125. memcpy(NetworkNumber,header->SourceNetworkNumber,4);
  126. memcpy(NodeAddress,header->SourceNetworkNode,6);
  127. } /* end of IPXAddressClass */
  128. /***************************************************************************
  129. * IPXAddressClass::Set_Address -- sets the IPX address values *
  130. * *
  131. * INPUT: *
  132. * net Network Number for this address *
  133. * node Node Address for this address *
  134. * *
  135. * OUTPUT: *
  136. * none. *
  137. * *
  138. * WARNINGS: *
  139. * none. *
  140. * *
  141. * HISTORY: *
  142. * 12/19/1994 BR : Created. *
  143. *=========================================================================*/
  144. void IPXAddressClass::Set_Address(NetNumType net, NetNodeType node)
  145. {
  146. memcpy(NetworkNumber,net,4);
  147. memcpy(NodeAddress,node,6);
  148. } /* end of Set_Address */
  149. /***************************************************************************
  150. * IPXAddressClass::Set_Address -- sets the IPX values from a header *
  151. * *
  152. * This routine extracts the source addresses from the given IPX header. *
  153. * *
  154. * INPUT: *
  155. * net Network Number for this address *
  156. * node Node Address for this address *
  157. * *
  158. * OUTPUT: *
  159. * none. *
  160. * *
  161. * WARNINGS: *
  162. * none. *
  163. * *
  164. * HISTORY: *
  165. * 12/19/1994 BR : Created. *
  166. *=========================================================================*/
  167. void IPXAddressClass::Set_Address(IPXHeaderType *header)
  168. {
  169. #ifdef WINSOCK_IPX
  170. ProtocolEnum protocol = PROTOCOL_IPX;
  171. if ( PacketTransport ) protocol = PacketTransport->Get_Protocol();
  172. switch ( protocol ) {
  173. case PROTOCOL_IPX:
  174. memcpy(NetworkNumber,header->SourceNetworkNumber,4);
  175. memcpy(NodeAddress,header->SourceNetworkNode,6);
  176. break;
  177. case PROTOCOL_UDP:
  178. unsigned char *addr = (unsigned char*) header;
  179. memset (NodeAddress, 0, 6);
  180. memcpy (NodeAddress, addr, 4);
  181. memset (NetworkNumber, 0, 4);
  182. break;
  183. }
  184. #else //WINSOCK_IPX
  185. if (header) {
  186. memcpy(NetworkNumber,header->SourceNetworkNumber,4);
  187. memcpy(NodeAddress,header->SourceNetworkNode,6);
  188. } else {
  189. /*
  190. ** Address is meaningless when using winsock
  191. */
  192. memset(NetworkNumber, 1 ,4);
  193. memset(NodeAddress, 1, 6);
  194. }
  195. #endif //WINSOCK_IPX
  196. } /* end of Set_Address */
  197. /***************************************************************************
  198. * IPXAddressClass::Get_Address -- retrieves the IPX address values *
  199. * *
  200. * INPUT: *
  201. * net Network Number for this address *
  202. * node Node Address for this address *
  203. * *
  204. * OUTPUT: *
  205. * none. *
  206. * *
  207. * WARNINGS: *
  208. * none. *
  209. * *
  210. * HISTORY: *
  211. * 12/19/1994 BR : Created. *
  212. *=========================================================================*/
  213. void IPXAddressClass::Get_Address(NetNumType net, NetNodeType node)
  214. {
  215. memcpy(net,NetworkNumber,4);
  216. memcpy(node,NodeAddress,6);
  217. } /* end of Get_Address */
  218. /***************************************************************************
  219. * IPXAddressClass::Get_Address -- copies address into an IPX header *
  220. * *
  221. * INPUT: *
  222. * net Network Number for this address *
  223. * node Node Address for this address *
  224. * *
  225. * OUTPUT: *
  226. * none. *
  227. * *
  228. * WARNINGS: *
  229. * none. *
  230. * *
  231. * HISTORY: *
  232. * 12/19/1994 BR : Created. *
  233. *=========================================================================*/
  234. void IPXAddressClass::Get_Address(IPXHeaderType *header)
  235. {
  236. memcpy(header->DestNetworkNumber,NetworkNumber,4);
  237. memcpy(header->DestNetworkNode,NodeAddress,6);
  238. } /* end of Get_Address */
  239. /***************************************************************************
  240. * IPXAddressClass::Is_Broadcast -- tells if this is a broadcast address *
  241. * *
  242. * INPUT: *
  243. * none. *
  244. * *
  245. * OUTPUT: *
  246. * none. *
  247. * *
  248. * WARNINGS: *
  249. * none. *
  250. * *
  251. * HISTORY: *
  252. * 12/19/1994 BR : Created. *
  253. *=========================================================================*/
  254. int IPXAddressClass::Is_Broadcast(void)
  255. {
  256. if ( NetworkNumber[0] == 0xff &&
  257. NetworkNumber[1] == 0xff &&
  258. NetworkNumber[2] == 0xff &&
  259. NetworkNumber[3] == 0xff &&
  260. NodeAddress[0] == 0xff &&
  261. NodeAddress[1] == 0xff &&
  262. NodeAddress[2] == 0xff &&
  263. NodeAddress[3] == 0xff &&
  264. NodeAddress[4] == 0xff &&
  265. NodeAddress[5] == 0xff) {
  266. return(1);
  267. }
  268. else {
  269. return(0);
  270. }
  271. } /* end of Is_Broadcast */
  272. /***************************************************************************
  273. * IPXAddressClass::operator== -- overloaded comparison operator *
  274. * *
  275. * Since, if NETX isn't running, the network number on a received packet *
  276. * can be bogus (all 0's), only the node address is used for comparison *
  277. * purposes here. *
  278. * *
  279. * INPUT: *
  280. * addr address to compare to *
  281. * *
  282. * OUTPUT: *
  283. * 0 = not equal, 1 = equal *
  284. * *
  285. * WARNINGS: *
  286. * none. *
  287. * *
  288. * HISTORY: *
  289. * 12/19/1994 BR : Created. *
  290. *=========================================================================*/
  291. int IPXAddressClass::operator == (IPXAddressClass & addr)
  292. {
  293. //------------------------------------------------------------------------
  294. // If either Network Number is all 0's (which can happen if the system is
  295. // not running NETX), compare only the Node Addresses.
  296. //------------------------------------------------------------------------
  297. if ( (NetworkNumber[0]==0 &&
  298. NetworkNumber[1]==0 &&
  299. NetworkNumber[2]==0 &&
  300. NetworkNumber[3]==0) ||
  301. (addr.NetworkNumber[0]==0 &&
  302. addr.NetworkNumber[1]==0 &&
  303. addr.NetworkNumber[2]==0 &&
  304. addr.NetworkNumber[3]==0) ) {
  305. if (memcmp(NodeAddress,addr.NodeAddress,6)==0) {
  306. return(1);
  307. }
  308. else {
  309. return(0);
  310. }
  311. }
  312. //------------------------------------------------------------------------
  313. // Otherwise, compare both the Network Numbers and Node Addresses
  314. //------------------------------------------------------------------------
  315. else {
  316. if (memcmp(NodeAddress,addr.NodeAddress,6)==0 &&
  317. memcmp(NetworkNumber,addr.NetworkNumber,4)==0) {
  318. return(1);
  319. }
  320. else {
  321. return(0);
  322. }
  323. }
  324. } /* end of operator== */
  325. /***************************************************************************
  326. * IPXAddressClass::operator!= -- overloaded comparison operator *
  327. * *
  328. * Since, if NETX isn't running, the network number on a received packet *
  329. * can be bogus (all 0's), only the node address is used for comparison *
  330. * purposes here. *
  331. * *
  332. * INPUT: *
  333. * addr address to compare to *
  334. * *
  335. * OUTPUT: *
  336. * 0 = equal, 1 = not equal *
  337. * *
  338. * WARNINGS: *
  339. * none. *
  340. * *
  341. * HISTORY: *
  342. * 12/19/1994 BR : Created. *
  343. *=========================================================================*/
  344. int IPXAddressClass::operator != (IPXAddressClass & addr)
  345. {
  346. //------------------------------------------------------------------------
  347. // If either Network Number is all 0's (which can happen if the system is
  348. // not running NETX), compare only the Node Addresses.
  349. //------------------------------------------------------------------------
  350. if ( (NetworkNumber[0]==0 &&
  351. NetworkNumber[1]==0 &&
  352. NetworkNumber[2]==0 &&
  353. NetworkNumber[3]==0) ||
  354. (addr.NetworkNumber[0]==0 &&
  355. addr.NetworkNumber[1]==0 &&
  356. addr.NetworkNumber[2]==0 &&
  357. addr.NetworkNumber[3]==0) ) {
  358. if (memcmp(NodeAddress,addr.NodeAddress,6)==0) {
  359. return(0);
  360. }
  361. else {
  362. return(1);
  363. }
  364. }
  365. //------------------------------------------------------------------------
  366. // Otherwise, compare both the Network Numbers and Node Addresses
  367. //------------------------------------------------------------------------
  368. else {
  369. if (memcmp(NodeAddress,addr.NodeAddress,6)==0 &&
  370. memcmp(NetworkNumber,addr.NetworkNumber,4)==0) {
  371. return(0);
  372. }
  373. else {
  374. return(1);
  375. }
  376. }
  377. } /* end of operator!= */
  378. /***************************************************************************
  379. * IPXAddressClass::operator > -- overloaded comparison operator *
  380. * *
  381. * INPUT: *
  382. * addr address to compare to *
  383. * *
  384. * OUTPUT: *
  385. * TRUE = greater, FALSE = not *
  386. * *
  387. * WARNINGS: *
  388. * none. *
  389. * *
  390. * HISTORY: *
  391. * 12/19/1994 BR : Created. *
  392. *=========================================================================*/
  393. int IPXAddressClass::operator > (IPXAddressClass & addr)
  394. {
  395. return(memcmp(this, &addr, 10) > 0);
  396. } /* end of operator> */
  397. /***************************************************************************
  398. * IPXAddressClass::operator < -- overloaded comparison operator *
  399. * *
  400. * INPUT: *
  401. * addr address to compare to *
  402. * *
  403. * OUTPUT: *
  404. * TRUE = less, FALSE = not *
  405. * *
  406. * WARNINGS: *
  407. * none. *
  408. * *
  409. * HISTORY: *
  410. * 12/19/1994 BR : Created. *
  411. *=========================================================================*/
  412. int IPXAddressClass::operator < (IPXAddressClass & addr)
  413. {
  414. return(memcmp(this, &addr, 10) < 0);
  415. } /* end of operator< */
  416. /***************************************************************************
  417. * IPXAddressClass::operator >= -- overloaded comparison operator *
  418. * *
  419. * INPUT: *
  420. * addr address to compare to *
  421. * *
  422. * OUTPUT: *
  423. * TRUE = greater or equal, FALSE = not *
  424. * *
  425. * WARNINGS: *
  426. * none. *
  427. * *
  428. * HISTORY: *
  429. * 12/19/1994 BR : Created. *
  430. *=========================================================================*/
  431. int IPXAddressClass::operator >= (IPXAddressClass & addr)
  432. {
  433. return(memcmp(this, &addr, 10) >= 0);
  434. } /* end of operator>= */
  435. /***************************************************************************
  436. * IPXAddressClass::operator <= -- overloaded comparison operator *
  437. * *
  438. * INPUT: *
  439. * addr address to compare to *
  440. * *
  441. * OUTPUT: *
  442. * TRUE = less or equal, FALSE = not *
  443. * *
  444. * WARNINGS: *
  445. * none. *
  446. * *
  447. * HISTORY: *
  448. * 12/19/1994 BR : Created. *
  449. *=========================================================================*/
  450. int IPXAddressClass::operator <= (IPXAddressClass & addr)
  451. {
  452. return(memcmp(this, &addr, 10) <= 0);
  453. } /* end of operator<= */
  454. /************************** end of ipxaddr.cpp *****************************/