icmp.c 991 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #include "all.h"
  2. #include "mem.h"
  3. #include "../ip/ip.h"
  4. enum /* Packet Types */
  5. {
  6. EchoReply = 0,
  7. Unreachable = 3,
  8. SrcQuench = 4,
  9. EchoRequest = 8,
  10. TimeExceed = 11,
  11. Timestamp = 13,
  12. TimestampReply = 14,
  13. InfoRequest = 15,
  14. InfoReply = 16,
  15. };
  16. void
  17. icmprecv(Msgbuf *mb, Ifc *ifc)
  18. {
  19. Icmppkt *p;
  20. uchar tmp[Pasize];
  21. p = (Icmppkt*)mb->data;
  22. switch(p->icmptype) {
  23. default:
  24. goto drop;
  25. case EchoRequest:
  26. memmove(tmp, p->src, Pasize);
  27. memmove(p->src, p->dst, Pasize);
  28. memmove(p->dst, tmp, Pasize);
  29. p->icmptype = EchoReply;
  30. p->icmpsum[0] = 0;
  31. p->icmpsum[1] = 0;
  32. hnputs(p->icmpsum,
  33. ptclcsum((uchar*)mb->data+(Ensize+Ipsize),
  34. mb->count-(Ensize+Ipsize)));
  35. /* note that tmp contains dst */
  36. if((nhgetl(ifc->ipa)&ifc->mask) != (nhgetl(p->dst)&ifc->mask))
  37. iproute(tmp, p->dst, ifc->netgate);
  38. ipsend1(mb, ifc, tmp);
  39. break;
  40. }
  41. return;
  42. drop:
  43. mbfree(mb);
  44. }
  45. void
  46. igmprecv(Msgbuf *mb, Ifc*)
  47. {
  48. mbfree(mb);
  49. }
  50. void
  51. tcprecv(Msgbuf *mb, Ifc*)
  52. {
  53. mbfree(mb);
  54. }