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

网络

开发平台:

Unix_Linux

  1. head 1.1;
  2. access;
  3. symbols;
  4. locks
  5. dls:1.1; strict;
  6. comment @ * @;
  7. 1.1
  8. date 97.09.21.19.26.41; author dls; state Dist;
  9. branches;
  10. next ;
  11. desc
  12. @@
  13. 1.1
  14. log
  15. @pre-3e code
  16. @
  17. text
  18. @/* icsetdata.c - icsetdata */
  19. #include <conf.h>
  20. #include <kernel.h>
  21. #include <network.h>
  22. /* ECHOMAX must be an even number */
  23. #define ECHOMAX(pip) (MAXLRGBUF-IC_HLEN-IP_HLEN(pip)-EP_HLEN-EP_CRC)
  24. /*------------------------------------------------------------------------
  25.  *  icsetdata -  set the data section. Return value is data length
  26.  *------------------------------------------------------------------------
  27.  */
  28. int icsetdata(type, pip, pa2)
  29. int type;
  30. struct ip *pip;
  31. void *pa2;
  32. {
  33. struct icmp *pic = (struct icmp *)pip->ip_data;
  34. int i, len;
  35. switch (type) {
  36. case ICT_ECHORP:
  37. len = pip->ip_len - IP_HLEN(pip) - IC_HLEN;
  38. if (isodd(len))
  39. pic->ic_data[len] = 0; /* so cksum works */
  40. return len;
  41. case ICT_DESTUR:
  42. case ICT_SRCQ:
  43. case ICT_TIMEX:
  44. pic->ic_mbz = 0; /* must be 0 */
  45. break;
  46. case ICT_REDIRECT:
  47. pic->ic_gw = (IPaddr)pa2;
  48. break;
  49. case ICT_PARAMP:
  50. pic->ic_ptr = (char) pa2;
  51. for (i=0; i<IC_PADLEN; ++i)
  52. pic->ic_pad[i] = 0;
  53. break;
  54. case ICT_MASKRP:
  55. blkcopy(pic->ic_data, &pa2, IP_ALEN);
  56. break;
  57. case ICT_ECHORQ:
  58. if ((unsigned)pa2 > ECHOMAX(pip))
  59. pa2 = (char *)ECHOMAX(pip);
  60. for (i=0; i<(int)pa2; ++i)
  61. pic->ic_data[i] = i;
  62. return (int)pa2;
  63. case ICT_MASKRQ:
  64. blkcopy(pic->ic_data, &ip_anyaddr, IP_ALEN);
  65. return IP_ALEN;
  66. }
  67. return 0;
  68. }
  69. @