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.van < prev    next >
Text File  |  1989-03-04  |  2KB  |  72 lines

  1. rip_output(m, so)
  2.     register struct mbuf *m;
  3.     struct socket *so;
  4. {
  5.     register struct ip *ip;
  6.     int error;
  7.     struct rawcb *rp = sotorawcb(so);
  8.     struct sockaddr_in *sin;
  9. #if BSD>=43
  10.     short proto = rp->rcb_proto.sp_protocol;
  11. #else
  12.     short proto = so->so_proto->pr_protocol;
  13. #endif
  14.     /*
  15.      * if the protocol is IPPROTO_RAW, the user handed us a 
  16.      * complete IP packet.  Otherwise, allocate an mbuf for a
  17.      * header and fill it in as needed.
  18.      */
  19.     if (proto != IPPROTO_RAW) {
  20.         /*
  21.          * Calculate data length and get an mbuf
  22.          * for IP header.
  23.          */
  24.         int len = 0;
  25.         struct mbuf *m0;
  26.  
  27.         for (m0 = m; m; m = m->m_next)
  28.             len += m->m_len;
  29.  
  30.         m = m_get(M_DONTWAIT, MT_HEADER);
  31.         if (m == 0) {
  32.             m = m0;
  33.             error = ENOBUFS;
  34.             goto bad;
  35.         }
  36.         m->m_off = MMAXOFF - sizeof(struct ip);
  37.         m->m_len = sizeof(struct ip);
  38.         m->m_next = m0;
  39.  
  40.         ip = mtod(m, struct ip *);
  41.         ip->ip_tos = 0;
  42.         ip->ip_off = 0;
  43.         ip->ip_p = proto;
  44.         ip->ip_len = sizeof(struct ip) + len;
  45.         ip->ip_ttl = MAXTTL;
  46.     } else
  47.         ip = mtod(m, struct ip *);
  48.  
  49.     if (rp->rcb_flags & RAW_LADDR) {
  50.         sin = (struct sockaddr_in *)&rp->rcb_laddr;
  51.         if (sin->sin_family != AF_INET) {
  52.             error = EAFNOSUPPORT;
  53.             goto bad;
  54.         }
  55.         ip->ip_src.s_addr = sin->sin_addr.s_addr;
  56.     } else
  57.         ip->ip_src.s_addr = 0;
  58.  
  59.     ip->ip_dst = ((struct sockaddr_in *)&rp->rcb_faddr)->sin_addr;
  60.  
  61. #if BSD>=43
  62.     return (ip_output(m, rp->rcb_options, &rp->rcb_route, 
  63.        (so->so_options & SO_DONTROUTE) | IP_ALLOWBROADCAST));
  64. #else
  65.     return (ip_output(m, (struct mbuf *)0, &rp->rcb_route, 
  66.        (so->so_options & SO_DONTROUTE) | IP_ALLOWBROADCAST));
  67. #endif
  68. bad:
  69.     m_freem(m);
  70.     return (error);
  71. }
  72.