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 >
Wrap
Text File
|
1989-03-04
|
3KB
|
126 lines
*** rip_output.original Sat Mar 4 23:08:29 1989
--- rip_output.van Sat Mar 4 23:08:57 1989
***************
*** 1,40 ****
! /*
! * Generate IP header and pass packet to ip_output.
! * Tack on options user may have setup with control call.
! */
! rip_output(m0, so)
! struct mbuf *m0;
struct socket *so;
{
- register struct mbuf *m;
register struct ip *ip;
! int len = 0, error;
struct rawcb *rp = sotorawcb(so);
struct sockaddr_in *sin;
!
/*
! * Calculate data length and get an mbuf
! * for IP header.
*/
! for (m = m0; m; m = m->m_next)
! len += m->m_len;
! m = m_get(M_DONTWAIT, MT_HEADER);
! if (m == 0) {
! error = ENOBUFS;
! goto bad;
! }
!
! /*
! * Fill in IP header as needed.
! */
! m->m_off = MMAXOFF - sizeof(struct ip);
! m->m_len = sizeof(struct ip);
! m->m_next = m0;
! ip = mtod(m, struct ip *);
! ip->ip_tos = 0;
! ip->ip_off = 0;
! ip->ip_p = rp->rcb_proto.sp_protocol;
! ip->ip_len = sizeof(struct ip) + len;
if (rp->rcb_flags & RAW_LADDR) {
sin = (struct sockaddr_in *)&rp->rcb_laddr;
if (sin->sin_family != AF_INET) {
--- 1,51 ----
! rip_output(m, so)
! register struct mbuf *m;
struct socket *so;
{
register struct ip *ip;
! int error;
struct rawcb *rp = sotorawcb(so);
struct sockaddr_in *sin;
! #if BSD>=43
! short proto = rp->rcb_proto.sp_protocol;
! #else
! short proto = so->so_proto->pr_protocol;
! #endif
/*
! * if the protocol is IPPROTO_RAW, the user handed us a
! * complete IP packet. Otherwise, allocate an mbuf for a
! * header and fill it in as needed.
*/
! if (proto != IPPROTO_RAW) {
! /*
! * Calculate data length and get an mbuf
! * for IP header.
! */
! int len = 0;
! struct mbuf *m0;
!
! for (m0 = m; m; m = m->m_next)
! len += m->m_len;
!
! m = m_get(M_DONTWAIT, MT_HEADER);
! if (m == 0) {
! m = m0;
! error = ENOBUFS;
! goto bad;
! }
! m->m_off = MMAXOFF - sizeof(struct ip);
! m->m_len = sizeof(struct ip);
! m->m_next = m0;
!
! ip = mtod(m, struct ip *);
! ip->ip_tos = 0;
! ip->ip_off = 0;
! ip->ip_p = proto;
! ip->ip_len = sizeof(struct ip) + len;
! ip->ip_ttl = MAXTTL;
! } else
! ip = mtod(m, struct ip *);
!
if (rp->rcb_flags & RAW_LADDR) {
sin = (struct sockaddr_in *)&rp->rcb_laddr;
if (sin->sin_family != AF_INET) {
***************
*** 44,53 ****
ip->ip_src.s_addr = sin->sin_addr.s_addr;
} else
ip->ip_src.s_addr = 0;
ip->ip_dst = ((struct sockaddr_in *)&rp->rcb_faddr)->sin_addr;
! ip->ip_ttl = MAXTTL;
return (ip_output(m, rp->rcb_options, &rp->rcb_route,
(so->so_options & SO_DONTROUTE) | IP_ALLOWBROADCAST));
bad:
m_freem(m);
return (error);
--- 55,70 ----
ip->ip_src.s_addr = sin->sin_addr.s_addr;
} else
ip->ip_src.s_addr = 0;
+
ip->ip_dst = ((struct sockaddr_in *)&rp->rcb_faddr)->sin_addr;
!
! #if BSD>=43
return (ip_output(m, rp->rcb_options, &rp->rcb_route,
(so->so_options & SO_DONTROUTE) | IP_ALLOWBROADCAST));
+ #else
+ return (ip_output(m, (struct mbuf *)0, &rp->rcb_route,
+ (so->so_options & SO_DONTROUTE) | IP_ALLOWBROADCAST));
+ #endif
bad:
m_freem(m);
return (error);