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

网络

开发平台:

Unix_Linux

  1. /* icredirect.c - icredirect */
  2. #include <conf.h>
  3. #include <kernel.h>
  4. #include <network.h>
  5. /*------------------------------------------------------------------------
  6.  *  icredirect -  handle an incoming ICMP redirect
  7.  *------------------------------------------------------------------------
  8.  */
  9. int
  10. icredirect(struct ep *pep)
  11. {
  12. struct route *prt;
  13. struct ip *pip, *pip2;
  14. struct icmp *pic;
  15. IPaddr mask;
  16. pip = (struct ip *)pep->ep_data;
  17. pic = (struct icmp *)pip->ip_data;
  18. pip2 = (struct ip *)pic->ic_data;
  19. if (pic->ic_code == ICC_HOSTRD)
  20. mask = ip_maskall;
  21. else
  22. mask = netmask(pip2->ip_dst);
  23. prt = rtget(pip2->ip_dst, RTF_LOCAL);
  24. if (prt == 0) {
  25. freebuf(pep);
  26. return OK;
  27. }
  28. if (pip->ip_src == prt->rt_gw) {
  29. rtdel(pip2->ip_dst, mask);
  30. rtadd(pip2->ip_dst, mask, pic->ic_gw, prt->rt_metric,
  31. prt->rt_ifnum, IC_RDTTL);
  32. }
  33. rtfree(prt);
  34. freebuf(pep);
  35. return OK;
  36. }