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

网络

开发平台:

Unix_Linux

  1. /* icsetdata.c - icsetdata */
  2. #include <conf.h>
  3. #include <kernel.h>
  4. #include <network.h>
  5. /* ECHOMAX must be an even number */
  6. #define ECHOMAX(pip) (MAXLRGBUF-IC_HLEN-IP_HLEN(pip)-EP_HLEN-EP_CRC)
  7. /*------------------------------------------------------------------------
  8.  *  icsetdata -  set the data section. Return value is data length
  9.  *------------------------------------------------------------------------
  10.  */
  11. int
  12. icsetdata(int type, struct ip *pip, void *pa2)
  13. {
  14. struct icmp *pic = (struct icmp *)pip->ip_data;
  15. int i, len;
  16. switch (type) {
  17. case ICT_ECHORP:
  18. len = pip->ip_len - IP_HLEN(pip) - IC_HLEN;
  19. if (isodd(len))
  20. pic->ic_data[len] = 0; /* so cksum works */
  21. return len;
  22. case ICT_DESTUR:
  23. case ICT_SRCQ:
  24. case ICT_TIMEX:
  25. pic->ic_mbz = 0; /* must be 0 */
  26. break;
  27. case ICT_REDIRECT:
  28. pic->ic_gw = (IPaddr)pa2;
  29. break;
  30. case ICT_PARAMP:
  31. pic->ic_ptr = (u_char) ((unsigned)pa2 & 0xff);
  32. for (i=0; i<IC_PADLEN; ++i)
  33. pic->ic_pad[i] = 0;
  34. break;
  35. case ICT_MASKRP:
  36. memcpy(pic->ic_data, &pa2, IP_ALEN);
  37. break;
  38. case ICT_ECHORQ:
  39. if ((int)pa2 > ECHOMAX(pip))
  40. pa2 = (void *)ECHOMAX(pip);
  41. for (i=0; i<(int)pa2; ++i)
  42. pic->ic_data[i] = i;
  43. return (int)pa2;
  44. case ICT_MASKRQ:
  45. memcpy(pic->ic_data, &ip_anyaddr, IP_ALEN);
  46. return IP_ALEN;
  47. }
  48. return 0;
  49. }