/network/snoop/snoopdns.c

https://github.com/eerpini/xinu · C · 610 lines · 10 code · 3 blank · 597 comment · 0 complexity · c10c0f67f6404ca101ebaf70905ee69b MD5 · raw file

  1. /**
  2. * @file snoopdns.c
  3. * @provides snoopdns
  4. *
  5. * $Id: snoopdns.c 2020 2009-08-13 17:50:08Z mschul $
  6. */
  7. /* Embedded Xinu, Copyright (C) 2009. All rights reserved. */
  8. #include <stddef.h>
  9. #include <net.h>
  10. #include <stdio.h>
  11. #include <string.h>
  12. #include <interrupt.h>
  13. #include <mailbox.h>
  14. #include <memory.h>
  15. #include <snoop.h>
  16. #include <network.h>
  17. #include <arp.h>
  18. //#include <ip.h>
  19. //#include <icmp.h>
  20. //#include <dhcp.h>
  21. //#include <udp.h>
  22. //#include <dns.h>
  23. /**
  24. * Snoop contents of dns packet
  25. * @param dns the dns packet
  26. */
  27. /*void snoopdns(struct dnsPkt *dns)
  28. {
  29. ulong var;
  30. uchar *ptr = NULL;
  31. ushort type = 0;
  32. ushort rdatalen = 0;
  33. ulong numbofsect = 0;
  34. ulong count = 0;
  35. fprintf(stdout,"DNS:\t----- DNS Header -----\n");
  36. fprintf(stdout,"DNS\tID = %d\n", net2hs(dns->id));
  37. fprintf(stdout,"DNS:\tQR = %d ", (dns->opts1 & DNS_QR) >> 7);
  38. switch((dns->opts1 & DNS_QR) >> 7)
  39. {
  40. case DNS_Q:
  41. fprintf(stdout,"(Query)\n");
  42. break;
  43. case DNS_R:
  44. fprintf(stdout,"(Response)\n");
  45. break;
  46. default:
  47. fprintf(stdout,"(Unrecognized QR)\n");
  48. break;
  49. }
  50. fprintf(stdout,"DNS:\tOpcode = %d ", (dns->opts1 & DNS_OPCODE) >> 3);
  51. switch((dns->opts1 & DNS_OPCODE) >> 3)
  52. {
  53. case DNS_CODE_Q:
  54. fprintf(stdout, "(Query)\n");
  55. break;
  56. case DNS_CODE_IQ:
  57. fprintf(stdout, "(Inverse Query)\n");
  58. break;
  59. case DNS_CODE_STATUS:
  60. fprintf(stdout, "(Status)\n");
  61. break;
  62. default:
  63. fprintf(stdout, "(Unrecognized Opcode)\n");
  64. break;
  65. }
  66. fprintf(stdout,"DNS:\tAuthoritative Answer = %d\n",
  67. (dns->opts1 & DNS_AA) >> 2);
  68. fprintf(stdout,"DNS:\tTruncation = %d\n", (dns->opts1 & DNS_TC) >> 1);
  69. fprintf(stdout,"DNS:\tRecursion Desired = %d\n", (dns->opts1 & DNS_RD));
  70. fprintf(stdout,"DNS:\tRecursion Available = %d\n",
  71. (dns->opts2 & DNS_RA) >> 7);
  72. fprintf(stdout,"DNS:\tResponse Code = %d ", dns->opts2 & DNS_RCODE);
  73. switch(dns->opts2 & DNS_RCODE)
  74. {
  75. case DNS_RESP_NOERR:
  76. fprintf(stdout, "(No Error)\n");
  77. break;
  78. case DNS_RESP_FORMAT:
  79. fprintf(stdout, "(Format Error)\n");
  80. break;
  81. case DNS_RESP_SERV:
  82. fprintf(stdout, "(Server Error)\n");
  83. break;
  84. case DNS_RESP_NAME:
  85. fprintf(stdout, "(Name Error)\n");
  86. break;
  87. case DNS_RESP_NOIMP:
  88. fprintf(stdout, "(Not Implemented Error)\n");
  89. break;
  90. case DNS_RESP_REFUSE:
  91. fprintf(stdout, "(Refused)\n");
  92. break;
  93. default:
  94. fprintf(stdout, "(Unrecognized Code)\n");
  95. break;
  96. }
  97. fprintf(stdout,"DNS:\tQuestion Entry in Question Section Count = %d\n",
  98. net2hs(dns->qdcount));
  99. fprintf(stdout,"DNS:\tResource Record in Answer Section Count = %d\n",
  100. net2hs(dns->ancount));
  101. fprintf(stdout,"DNS:\tName Server Resource Record Count = %d\n",
  102. net2hs(dns->nscount));
  103. fprintf(stdout,"DNS:\tResource Record in Records Section Count = %d\n",
  104. net2hs(dns->arcount));
  105. fprintf(stdout,"DNS:\n");
  106. ptr = dns->data;
  107. numbofsect = net2hs(dns->qdcount);
  108. ulong sectioncount = 1;
  109. while (0 != numbofsect)
  110. {
  111. fprintf(stdout,"DNS:\t----- DNS Question Section %d -----\n",
  112. sectioncount);
  113. fprintf(stdout, "DNS:\tQuestion Name = ");
  114. while (0 != *ptr)
  115. {
  116. count = *ptr;
  117. ptr++;
  118. while (0 != count)
  119. {
  120. fprintf(stdout, "%c", *ptr);
  121. count--;
  122. ptr++;
  123. }
  124. if (0 != *ptr)
  125. { fprintf(stdout,"."); }
  126. }
  127. fprintf(stdout, "\n");
  128. ptr++;
  129. var = *ptr << 8;
  130. ptr++;
  131. var+=*ptr;
  132. fprintf(stdout, "DNS:\tQuestion Type = %d ", var);
  133. switch (var)
  134. {
  135. case DNS_TYPE_A:
  136. fprintf(stdout,"(Host Address)\n");
  137. break;
  138. case DNS_TYPE_NS:
  139. fprintf(stdout,"(Name Server)\n");
  140. break;
  141. case DNS_TYPE_CNAME:
  142. fprintf(stdout,"(Canonical Name)\n");
  143. break;
  144. case DNS_TYPE_SOA:
  145. fprintf(stdout,"(Start of Zone)\n");
  146. break;
  147. case DNS_TYPE_WKS:
  148. fprintf(stdout,"(Well Known Service Description)\n");
  149. break;
  150. case DNS_TYPE_PTR:
  151. fprintf(stdout,"(Domain Name Pointer)\n");
  152. break;
  153. case DNS_TYPE_HINFO:
  154. fprintf(stdout,"(Host Information)\n");
  155. break;
  156. case DNS_TYPE_MINFO:
  157. fprintf(stdout,"(Mailbox Mail List)\n");
  158. break;
  159. case DNS_TYPE_MX:
  160. fprintf(stdout,"(Mail Exchange)\n");
  161. break;
  162. case DNS_TYPE_TXT:
  163. fprintf(stdout,"(Text Strings)\n");
  164. break;
  165. case DNS_QTYPE_AXFR:
  166. fprintf(stdout,"(Request Transfer Zone)\n");
  167. break;
  168. case DNS_QTYPE_MAILB:
  169. fprintf(stdout,"(Request Mailbox Related Records)\n");
  170. break;
  171. case DNS_QTYPE_ALL:
  172. fprintf(stdout,"(Reqeust for All Records)\n");
  173. break;
  174. default:
  175. fprintf(stdout,"(Unrecognized Type)\n");
  176. break;
  177. }
  178. ptr++;
  179. var = *ptr << 8;
  180. ptr++;
  181. var+=*ptr;
  182. fprintf(stdout, "DNS:\tQuestion Class = %d ", var);
  183. switch (var)
  184. {
  185. case DNS_CLASS_IN:
  186. fprintf(stdout, "(Internet)\n");
  187. break;
  188. case DNS_QCLASS_ALL:
  189. fprintf(stdout, "(Any Class)\n");
  190. break;
  191. default:
  192. fprintf(stdout, "(Unrecognized Class)\n");
  193. break;
  194. }
  195. numbofsect--;
  196. sectioncount++;
  197. fprintf(stdout, "DNS:\n");
  198. ptr++;
  199. }
  200. numbofsect = net2hs(dns->ancount);
  201. sectioncount = 1;
  202. while (0 != numbofsect)
  203. {
  204. fprintf(stdout,"DNS:\t----- DNS Answer Section %d -----\n",
  205. sectioncount);
  206. fprintf(stdout, "DNS:\tServer Name = ");
  207. while (0 != *ptr)
  208. {
  209. // If name is a pointer then we are done
  210. if (*ptr & 0xC0)
  211. {
  212. var = *ptr & 0x3;
  213. ptr++;
  214. var+= *ptr;
  215. fprintf(stdout,"Pointer = %d", var);
  216. break;
  217. }
  218. count = *ptr;
  219. ptr++;
  220. while (0 != count)
  221. {
  222. fprintf(stdout, "%c", *ptr);
  223. count--;
  224. ptr++;
  225. }
  226. if (0 != *ptr)
  227. { fprintf(stdout,"."); }
  228. }
  229. fprintf(stdout, "\n");
  230. ptr++;
  231. var = *ptr << 8;
  232. ptr++;
  233. var+=*ptr;
  234. type = var;
  235. fprintf(stdout, "DNS:\tRecord Type = %d ", var);
  236. switch (var)
  237. {
  238. case DNS_TYPE_A:
  239. fprintf(stdout,"(Host Address)\n");
  240. break;
  241. case DNS_TYPE_NS:
  242. fprintf(stdout,"(Name Server)\n");
  243. break;
  244. case DNS_TYPE_CNAME:
  245. fprintf(stdout,"(Canonical Name)\n");
  246. break;
  247. case DNS_TYPE_SOA:
  248. fprintf(stdout,"(Start of Zone)\n");
  249. break;
  250. case DNS_TYPE_WKS:
  251. fprintf(stdout,"(Well Known Service Description)\n");
  252. break;
  253. case DNS_TYPE_PTR:
  254. fprintf(stdout,"(Domain Name Pointer)\n");
  255. break;
  256. case DNS_TYPE_HINFO:
  257. fprintf(stdout,"(Host Information)\n");
  258. break;
  259. case DNS_TYPE_MINFO:
  260. fprintf(stdout,"(Mailbox Mail List)\n");
  261. break;
  262. case DNS_TYPE_MX:
  263. fprintf(stdout,"(Mail Exchange)\n");
  264. break;
  265. case DNS_TYPE_TXT:
  266. fprintf(stdout,"(Text Strings)\n");
  267. break;
  268. default:
  269. fprintf(stdout,"(Unrecognized Type)\n");
  270. break;
  271. }
  272. ptr++;
  273. var = *ptr << 8;
  274. ptr++;
  275. var+=*ptr;
  276. fprintf(stdout, "DNS:\tRecord Class = %d ", var);
  277. switch (var)
  278. {
  279. case DNS_CLASS_IN:
  280. fprintf(stdout, "(Internet)\n");
  281. break;
  282. case DNS_QCLASS_ALL:
  283. fprintf(stdout, "(Any Class)\n");
  284. break;
  285. default:
  286. fprintf(stdout, "(Unrecognized Class)\n");
  287. break;
  288. }
  289. ptr++;
  290. var = *ptr << 24;
  291. ptr++;
  292. var+=*ptr << 16;
  293. ptr++;
  294. var+=*ptr << 8;
  295. ptr++;
  296. var+=*ptr;
  297. fprintf(stdout, "DNS:\tTTL = %u\n", var);
  298. ptr++;
  299. var=*ptr << 8;
  300. ptr++;
  301. var+=*ptr;
  302. rdatalen = var;
  303. fprintf(stdout, "DNS:\tRData length = %d\n", var);
  304. fprintf(stdout, "DNS:\tRData = ");
  305. switch(type)
  306. {
  307. case DNS_TYPE_A:
  308. ptr++;
  309. var = *ptr << 24;
  310. ptr++;
  311. var+=*ptr << 16;
  312. ptr++;
  313. var+=*ptr << 8;
  314. ptr++;
  315. var+=*ptr;
  316. fprint_iplong(var);
  317. fprintf(stdout, "\n");
  318. break;
  319. case DNS_TYPE_CNAME:
  320. ptr++;
  321. while (0 != *ptr)
  322. {
  323. // If name is a pointer then we are done
  324. if (*ptr & 0xC0)
  325. {
  326. var = *ptr & 0x3;
  327. ptr++;
  328. var+= *ptr;
  329. fprintf(stdout,"Pointer = %d", var);
  330. break;
  331. }
  332. count = *ptr;
  333. ptr++;
  334. while (0 != count)
  335. {
  336. fprintf(stdout, "%c", *ptr);
  337. count--;
  338. ptr++;
  339. }
  340. if (0 != *ptr)
  341. { fprintf(stdout,"."); }
  342. }
  343. fprintf(stdout, "\n");
  344. break;
  345. case DNS_TYPE_PTR:
  346. ptr++;
  347. while (0 != *ptr)
  348. {
  349. // If name is a pointer then we are done
  350. if (*ptr & 0xC0)
  351. {
  352. var = *ptr & 0x3;
  353. ptr++;
  354. var+= *ptr;
  355. fprintf(stdout,"Pointer = %d", var);
  356. break;
  357. }
  358. count = *ptr;
  359. ptr++;
  360. while (0 != count)
  361. {
  362. fprintf(stdout, "%c", *ptr);
  363. count--;
  364. ptr++;
  365. }
  366. if (0 != *ptr)
  367. { fprintf(stdout,"."); }
  368. }
  369. fprintf(stdout, "\n");
  370. break;
  371. default:
  372. fprintf(stdout,"Unrecognized\n");
  373. ptr+=rdatalen;
  374. break;
  375. }
  376. ptr++;
  377. sectioncount++;
  378. fprintf(stdout, "DNS:\n");
  379. numbofsect--;
  380. }
  381. numbofsect = net2hs(dns->nscount);
  382. sectioncount = 1;
  383. while (0 != numbofsect)
  384. {
  385. fprintf(stdout,"DNS:\t----- DNS Name Server Section %d -----\n",
  386. sectioncount);
  387. fprintf(stdout, "DNS:\tServer Name = ");
  388. while (0 != *ptr)
  389. {
  390. // If name is a pointer then we are done
  391. if (*ptr & 0xC0)
  392. {
  393. var = *ptr & 0x3;
  394. ptr++;
  395. var+= *ptr;
  396. fprintf(stdout,"Pointer = %d", var);
  397. break;
  398. }
  399. count = *ptr;
  400. ptr++;
  401. while (0 != count)
  402. {
  403. fprintf(stdout, "%c", *ptr);
  404. count--;
  405. ptr++;
  406. }
  407. if (0 != *ptr)
  408. { fprintf(stdout,"."); }
  409. }
  410. fprintf(stdout, "\n");
  411. ptr++;
  412. var = *ptr << 8;
  413. ptr++;
  414. var+=*ptr;
  415. type = var;
  416. fprintf(stdout, "DNS:\tRecord Type = %d ", var);
  417. switch (var)
  418. {
  419. case DNS_TYPE_A:
  420. fprintf(stdout,"(Host Address)\n");
  421. break;
  422. case DNS_TYPE_NS:
  423. fprintf(stdout,"(Name Server)\n");
  424. break;
  425. case DNS_TYPE_CNAME:
  426. fprintf(stdout,"(Canonical Name)\n");
  427. break;
  428. case DNS_TYPE_SOA:
  429. fprintf(stdout,"(Start of Zone)\n");
  430. break;
  431. case DNS_TYPE_WKS:
  432. fprintf(stdout,"(Well Known Service Description)\n");
  433. break;
  434. case DNS_TYPE_PTR:
  435. fprintf(stdout,"(Domain Name Pointer)\n");
  436. break;
  437. case DNS_TYPE_HINFO:
  438. fprintf(stdout,"(Host Information)\n");
  439. break;
  440. case DNS_TYPE_MINFO:
  441. fprintf(stdout,"(Mailbox Mail List)\n");
  442. break;
  443. case DNS_TYPE_MX:
  444. fprintf(stdout,"(Mail Exchange)\n");
  445. break;
  446. case DNS_TYPE_TXT:
  447. fprintf(stdout,"(Text Strings)\n");
  448. break;
  449. default:
  450. fprintf(stdout,"(Unrecognized Type)\n");
  451. break;
  452. }
  453. ptr++;
  454. var = *ptr << 8;
  455. ptr++;
  456. var+=*ptr;
  457. fprintf(stdout, "DNS:\tRecord Class = %d ", var);
  458. switch (var)
  459. {
  460. case DNS_CLASS_IN:
  461. fprintf(stdout, "(Internet)\n");
  462. break;
  463. case DNS_QCLASS_ALL:
  464. fprintf(stdout, "(Any Class)\n");
  465. break;
  466. default:
  467. fprintf(stdout, "(Unrecognized Class)\n");
  468. break;
  469. }
  470. ptr++;
  471. var = *ptr << 24;
  472. ptr++;
  473. var+=*ptr << 16;
  474. ptr++;
  475. var+=*ptr << 8;
  476. ptr++;
  477. var+=*ptr;
  478. fprintf(stdout, "DNS:\tTTL = %u\n", var);
  479. ptr++;
  480. var=*ptr << 8;
  481. ptr++;
  482. var+=*ptr;
  483. rdatalen = var;
  484. fprintf(stdout, "DNS:\tRData length = %d\n", var);
  485. fprintf(stdout, "DNS:\tRData = ");
  486. switch(type)
  487. {
  488. case DNS_TYPE_A:
  489. ptr++;
  490. var = *ptr << 24;
  491. ptr++;
  492. var+=*ptr << 16;
  493. ptr++;
  494. var+=*ptr << 8;
  495. ptr++;
  496. var+=*ptr;
  497. fprint_iplong(var);
  498. fprintf(stdout, "\n");
  499. break;
  500. case DNS_TYPE_CNAME:
  501. ptr++;
  502. while (0 != *ptr)
  503. {
  504. // If name is a pointer then we are done
  505. if (*ptr & 0xC0)
  506. {
  507. var = *ptr & 0x3;
  508. ptr++;
  509. var+= *ptr;
  510. fprintf(stdout,"Pointer = %d", var);
  511. break;
  512. }
  513. count = *ptr;
  514. ptr++;
  515. while (0 != count)
  516. {
  517. fprintf(stdout, "%c", *ptr);
  518. count--;
  519. ptr++;
  520. }
  521. if (0 != *ptr)
  522. { fprintf(stdout,"."); }
  523. }
  524. fprintf(stdout, "\n");
  525. break;
  526. case DNS_TYPE_PTR:
  527. ptr++;
  528. while (0 != *ptr)
  529. {
  530. // If name is a pointer then we are done
  531. if (*ptr & 0xC0)
  532. {
  533. var = *ptr & 0x3;
  534. ptr++;
  535. var+= *ptr;
  536. fprintf(stdout,"Pointer = %d", var);
  537. break;
  538. }
  539. count = *ptr;
  540. ptr++;
  541. while (0 != count)
  542. {
  543. fprintf(stdout, "%c", *ptr);
  544. count--;
  545. ptr++;
  546. }
  547. if (0 != *ptr)
  548. { fprintf(stdout,"."); }
  549. }
  550. fprintf(stdout, "\n");
  551. break;
  552. default:
  553. fprintf(stdout,"Unrecognized\n");
  554. ptr+=rdatalen;
  555. break;
  556. }
  557. ptr++;
  558. sectioncount++;
  559. fprintf(stdout, "DNS:\n");
  560. numbofsect--;
  561. }
  562. numbofsect = net2hs(dns->arcount);
  563. while (0 != numbofsect)
  564. {
  565. numbofsect--;
  566. }
  567. }
  568. */