home *** CD-ROM | disk | FTP | other *** search
/ ftp.muug.mb.ca / 2014.06.ftp.muug.mb.ca.tar / ftp.muug.mb.ca / pub / src / traceroute / vj_traceroute / raw_ip.diff < prev    next >
Text File  |  1989-03-04  |  3KB  |  126 lines

  1. *** rip_output.original    Sat Mar  4 23:08:29 1989
  2. --- rip_output.van    Sat Mar  4 23:08:57 1989
  3. ***************
  4. *** 1,40 ****
  5. ! /*
  6. !  * Generate IP header and pass packet to ip_output.
  7. !  * Tack on options user may have setup with control call.
  8. !  */
  9. ! rip_output(m0, so)
  10. !     struct mbuf *m0;
  11.       struct socket *so;
  12.   {
  13. -     register struct mbuf *m;
  14.       register struct ip *ip;
  15. !     int len = 0, error;
  16.       struct rawcb *rp = sotorawcb(so);
  17.       struct sockaddr_in *sin;
  18.       /*
  19. !      * Calculate data length and get an mbuf
  20. !      * for IP header.
  21.        */
  22. !     for (m = m0; m; m = m->m_next)
  23. !         len += m->m_len;
  24. !     m = m_get(M_DONTWAIT, MT_HEADER);
  25. !     if (m == 0) {
  26. !         error = ENOBUFS;
  27. !         goto bad;
  28. !     }
  29. !     
  30. !     /*
  31. !      * Fill in IP header as needed.
  32. !      */
  33. !     m->m_off = MMAXOFF - sizeof(struct ip);
  34. !     m->m_len = sizeof(struct ip);
  35. !     m->m_next = m0;
  36. !     ip = mtod(m, struct ip *);
  37. !     ip->ip_tos = 0;
  38. !     ip->ip_off = 0;
  39. !     ip->ip_p = rp->rcb_proto.sp_protocol;
  40. !     ip->ip_len = sizeof(struct ip) + len;
  41.       if (rp->rcb_flags & RAW_LADDR) {
  42.           sin = (struct sockaddr_in *)&rp->rcb_laddr;
  43.           if (sin->sin_family != AF_INET) {
  44. --- 1,51 ----
  45. ! rip_output(m, so)
  46. !     register struct mbuf *m;
  47.       struct socket *so;
  48.   {
  49.       register struct ip *ip;
  50. !     int error;
  51.       struct rawcb *rp = sotorawcb(so);
  52.       struct sockaddr_in *sin;
  53. ! #if BSD>=43
  54. !     short proto = rp->rcb_proto.sp_protocol;
  55. ! #else
  56. !     short proto = so->so_proto->pr_protocol;
  57. ! #endif
  58.       /*
  59. !      * if the protocol is IPPROTO_RAW, the user handed us a 
  60. !      * complete IP packet.  Otherwise, allocate an mbuf for a
  61. !      * header and fill it in as needed.
  62.        */
  63. !     if (proto != IPPROTO_RAW) {
  64. !         /*
  65. !          * Calculate data length and get an mbuf
  66. !          * for IP header.
  67. !          */
  68. !         int len = 0;
  69. !         struct mbuf *m0;
  70. !         for (m0 = m; m; m = m->m_next)
  71. !             len += m->m_len;
  72. !         m = m_get(M_DONTWAIT, MT_HEADER);
  73. !         if (m == 0) {
  74. !             m = m0;
  75. !             error = ENOBUFS;
  76. !             goto bad;
  77. !         }
  78. !         m->m_off = MMAXOFF - sizeof(struct ip);
  79. !         m->m_len = sizeof(struct ip);
  80. !         m->m_next = m0;
  81. !         ip = mtod(m, struct ip *);
  82. !         ip->ip_tos = 0;
  83. !         ip->ip_off = 0;
  84. !         ip->ip_p = proto;
  85. !         ip->ip_len = sizeof(struct ip) + len;
  86. !         ip->ip_ttl = MAXTTL;
  87. !     } else
  88. !         ip = mtod(m, struct ip *);
  89.       if (rp->rcb_flags & RAW_LADDR) {
  90.           sin = (struct sockaddr_in *)&rp->rcb_laddr;
  91.           if (sin->sin_family != AF_INET) {
  92. ***************
  93. *** 44,53 ****
  94.           ip->ip_src.s_addr = sin->sin_addr.s_addr;
  95.       } else
  96.           ip->ip_src.s_addr = 0;
  97.       ip->ip_dst = ((struct sockaddr_in *)&rp->rcb_faddr)->sin_addr;
  98. !     ip->ip_ttl = MAXTTL;
  99.       return (ip_output(m, rp->rcb_options, &rp->rcb_route, 
  100.          (so->so_options & SO_DONTROUTE) | IP_ALLOWBROADCAST));
  101.   bad:
  102.       m_freem(m);
  103.       return (error);
  104. --- 55,70 ----
  105.           ip->ip_src.s_addr = sin->sin_addr.s_addr;
  106.       } else
  107.           ip->ip_src.s_addr = 0;
  108.       ip->ip_dst = ((struct sockaddr_in *)&rp->rcb_faddr)->sin_addr;
  109. ! #if BSD>=43
  110.       return (ip_output(m, rp->rcb_options, &rp->rcb_route, 
  111.          (so->so_options & SO_DONTROUTE) | IP_ALLOWBROADCAST));
  112. + #else
  113. +     return (ip_output(m, (struct mbuf *)0, &rp->rcb_route, 
  114. +        (so->so_options & SO_DONTROUTE) | IP_ALLOWBROADCAST));
  115. + #endif
  116.   bad:
  117.       m_freem(m);
  118.       return (error);
  119.