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 / rip_output.original < prev    next >
Text File  |  1989-03-04  |  1KB  |  55 lines

  1. /*
  2.  * Generate IP header and pass packet to ip_output.
  3.  * Tack on options user may have setup with control call.
  4.  */
  5. rip_output(m0, so)
  6.     struct mbuf *m0;
  7.     struct socket *so;
  8. {
  9.     register struct mbuf *m;
  10.     register struct ip *ip;
  11.     int len = 0, error;
  12.     struct rawcb *rp = sotorawcb(so);
  13.     struct sockaddr_in *sin;
  14.  
  15.     /*
  16.      * Calculate data length and get an mbuf
  17.      * for IP header.
  18.      */
  19.     for (m = m0; m; m = m->m_next)
  20.         len += m->m_len;
  21.     m = m_get(M_DONTWAIT, MT_HEADER);
  22.     if (m == 0) {
  23.         error = ENOBUFS;
  24.         goto bad;
  25.     }
  26.     
  27.     /*
  28.      * Fill in IP header as needed.
  29.      */
  30.     m->m_off = MMAXOFF - sizeof(struct ip);
  31.     m->m_len = sizeof(struct ip);
  32.     m->m_next = m0;
  33.     ip = mtod(m, struct ip *);
  34.     ip->ip_tos = 0;
  35.     ip->ip_off = 0;
  36.     ip->ip_p = rp->rcb_proto.sp_protocol;
  37.     ip->ip_len = sizeof(struct ip) + len;
  38.     if (rp->rcb_flags & RAW_LADDR) {
  39.         sin = (struct sockaddr_in *)&rp->rcb_laddr;
  40.         if (sin->sin_family != AF_INET) {
  41.             error = EAFNOSUPPORT;
  42.             goto bad;
  43.         }
  44.         ip->ip_src.s_addr = sin->sin_addr.s_addr;
  45.     } else
  46.         ip->ip_src.s_addr = 0;
  47.     ip->ip_dst = ((struct sockaddr_in *)&rp->rcb_faddr)->sin_addr;
  48.     ip->ip_ttl = MAXTTL;
  49.     return (ip_output(m, rp->rcb_options, &rp->rcb_route, 
  50.        (so->so_options & SO_DONTROUTE) | IP_ALLOWBROADCAST));
  51. bad:
  52.     m_freem(m);
  53.     return (error);
  54. }
  55.