/* raw_ip.c 4.14 82/10/09 */
#include "../h/protosw.h"
#include "../h/socketvar.h"
#include "../netinet/in.h"
#include "../netinet/in_systm.h"
#include "../netinet/ip.h"
#include "../netinet/ip_var.h"
#include "../net/raw_cb.h"
#include "../net/route.h"
* Raw interface to IP protocol.
static struct sockaddr_in ripdst
= { AF_INET
};
static struct sockaddr_in ripsrc
= { AF_INET
};
static struct sockproto ripproto
= { PF_INET
};
* Setup generic address and protocol structures
* for raw_input routine, then pass them along with
register struct ip
*ip
= mtod(m
, struct ip
*);
ripproto
.sp_protocol
= ip
->ip_p
;
ripdst
.sin_addr
= ip
->ip_dst
;
ripsrc
.sin_addr
= ip
->ip_src
;
raw_input(m
, &ripproto
, (struct sockaddr
*)&ripsrc
,
(struct sockaddr
*)&ripdst
);
* Generate IP header and pass packet to ip_output.
* Tack on options user may have setup with control call.
struct rawcb
*rp
= sotorawcb(so
);
* Calculate data length and get an mbuf
for (m
= m0
; m
; m
= m
->m_next
)
* Fill in IP header as needed.
m
->m_off
= MMAXOFF
- sizeof(struct ip
);
m
->m_len
= sizeof(struct ip
);
ip
= mtod(m
, struct ip
*);
ip
->ip_p
= so
->so_proto
->pr_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
) {
ip
->ip_src
.s_addr
= sin
->sin_addr
.s_addr
;
ip
->ip_dst
= ((struct sockaddr_in
*)&rp
->rcb_faddr
)->sin_addr
;
return (ip_output(m
, (struct mbuf
*)0, &routetoif
, 1));