icmp_in.c
上传用户:lywr2008
上传日期:2022-05-26
资源大小:9k
文件大小:2k
源码类别:

网络

开发平台:

Unix_Linux

  1. /* icmp_in.c - icmp_in */
  2. #include <conf.h>
  3. #include <kernel.h>
  4. #include <network.h>
  5. #include <proc.h>
  6. int icredirect(struct ep *);
  7. void icsetsrc(struct ip *);
  8. /*------------------------------------------------------------------------
  9.  *  icmp_in  -  handle ICMP packet coming in from the network
  10.  *------------------------------------------------------------------------
  11.  */
  12. int
  13. icmp_in(struct netif *pni, struct ep *pep)
  14. {
  15. struct ip *pip;
  16. struct icmp *pic;
  17. int i, len;
  18. pip = (struct ip *)pep->ep_data;
  19. pic = (struct icmp *) pip->ip_data;
  20. len = pip->ip_len - IP_HLEN(pip);
  21. if (cksum((WORD *)pic, len)) {
  22. IcmpInErrors++;
  23. freebuf(pep);
  24. return SYSERR;
  25. }
  26. IcmpInMsgs++;
  27. switch(pic->ic_type) {
  28. case ICT_ECHORQ:
  29. IcmpInEchos++;
  30. return icmp(ICT_ECHORP, 0, pip->ip_src, pep, 0);
  31. case ICT_MASKRQ:
  32. IcmpInAddrMasks++;
  33. if (!gateway) {
  34. freebuf(pep);
  35. return OK;
  36. }
  37. pic->ic_type = (char) ICT_MASKRP;
  38. *(IPaddr *)pic->ic_data = netmask(pip->ip_dst);
  39. break;
  40. case ICT_MASKRP:
  41. IcmpInAddrMaskReps++;
  42. for (i=0; i<Net.nif; ++i)
  43. if (nif[i].ni_ip == pip->ip_dst)
  44. break;
  45. if (i != Net.nif) {
  46. setmask(i, *(IPaddr *)pic->ic_data);
  47. send(pic->ic_id, ICT_MASKRP);
  48. }
  49. freebuf(pep);
  50. return OK;
  51. case ICT_ECHORP:
  52. IcmpInEchoReps++;
  53. if (send(pic->ic_id, (int)pep) != OK)
  54. freebuf(pep);
  55. return OK;
  56. case ICT_REDIRECT:
  57. IcmpInRedirects++;
  58. icredirect(pep);
  59. return OK;
  60. case ICT_DESTUR: IcmpInDestUnreachs++; freebuf(pep); return OK;
  61. case ICT_SRCQ:  IcmpInSrcQuenchs++; freebuf(pep); return OK;
  62. case ICT_TIMEX:  IcmpInTimeExcds++; freebuf(pep); return OK;
  63. case ICT_PARAMP: IcmpInParmProbs++; freebuf(pep); return OK;
  64. case ICT_TIMERQ: IcmpInTimestamps++; freebuf(pep); return OK;
  65. case ICT_TIMERP: IcmpInTimestampReps++; freebuf(pep); return OK;
  66. default:
  67. IcmpInErrors++;
  68. freebuf(pep);
  69. return OK;
  70. }
  71. icsetsrc(pip);
  72. len = pip->ip_len - IP_HLEN(pip);
  73. pic->ic_cksum = 0;
  74. pic->ic_cksum = cksum((WORD *)pic, len);
  75. IcmpOutMsgs++;
  76. ipsend(pip->ip_dst, pep, len, IPT_ICMP, IPP_INCTL, IP_TTL);
  77. return OK;
  78. }