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

网络

开发平台:

Unix_Linux

  1. /* icmp.c - icmp */
  2. #include <conf.h>
  3. #include <kernel.h>
  4. #include <network.h>
  5. /*
  6.  * ICT_REDIRECT - pa2 == gateway address
  7.  * ICT_PARAMP - pa2 == (packet) pointer to parameter error
  8.  * ICT_MASKRP - pa2 == mask address
  9.  * ICT_ECHORQ - pa1 == seq, pa2 == data size
  10.  */
  11. struct ep *icsetbuf(int, void *, Bool *, Bool *);
  12. Bool icerrok(struct ep *);
  13. void icsetsrc(struct ip *);
  14. int icsetdata(int, struct ip *, void *);
  15. /*------------------------------------------------------------------------
  16.  *  icmp -  send an ICMP message
  17.  *------------------------------------------------------------------------
  18.  */
  19. int
  20. icmp(u_short type, u_short code, IPaddr dst, void *pa1, void *pa2)
  21. {
  22. struct ep *pep;
  23. struct ip *pip;
  24. struct icmp *pic;
  25. Bool isresp, iserr;
  26. int datalen;
  27. IcmpOutMsgs++;
  28. pep = icsetbuf(type, pa1, &isresp, &iserr);
  29. if (pep == 0) {
  30. IcmpOutErrors++;
  31. return SYSERR;
  32. }
  33. pip = (struct ip *)pep->ep_data;
  34. pic = (struct icmp *) pip->ip_data;
  35. datalen = IC_HLEN;
  36. /* we fill in the source here, so routing won't break it */
  37. if (isresp) {
  38. if (iserr) {
  39. if (!icerrok(pep)) {
  40. freebuf(pep);
  41. return OK;
  42. }
  43. memcpy(pic->ic_data, pip, IP_HLEN(pip)+8);
  44. datalen += IP_HLEN(pip)+8;
  45. }
  46. icsetsrc(pip);
  47. } else
  48. pip->ip_src = ip_anyaddr;
  49. pip->ip_dst = dst;
  50. pic->ic_type = (char) type;
  51. pic->ic_code = (char) code;
  52. if (!isresp) {
  53. if (type == ICT_ECHORQ)
  54. pic->ic_seq = (int) pa1;
  55. else
  56. pic->ic_seq = 0;
  57. pic->ic_id = getpid();
  58. }
  59. datalen += icsetdata(type, pip, pa2);
  60. pic->ic_cksum = 0;
  61. pic->ic_cksum = cksum((WORD *)pic, datalen);
  62. ipsend(dst, pep, datalen, IPT_ICMP, IPP_INCTL, IP_TTL);
  63. return OK;
  64. }