/* raw_imp.c 4.1 82/02/01 */
#include "../h/protosw.h"
#include "../h/socketvar.h"
#include "../net/in_systm.h"
#include "../net/if_imp.h"
#include "../net/raw_cb.h"
#include "/usr/include/errno.h"
* Generate IMP leader and pass packet to impoutput.
* The user must create a skeletal leader in order to
* communicate message type, message subtype, etc.
* We fill in holes where needed and verify parameters
imp_output(m
, so
) /* too close to impoutput */
register struct imp_leader
*il
;
register struct sockaddr_in
*sin
;
register struct rawcb
*rp
= sotorawcb(so
);
* Verify user has supplied necessary space
* for the leader and check parameters in it.
if ((m
->m_off
> MMAXOFF
|| m
->m_len
< sizeof(struct imp_leader
)) &&
(m
= m_pullup(m
, sizeof(struct imp_leader
))) == 0)
il
= mtod(m
, struct imp_leader
*);
if (il
->il_format
!= IMP_NFF
)
if (il
->il_link
!= IMPLINK_IP
&&
(il
->il_link
< IMPLINK_LOWEXPER
|| il
->il_link
> IMPLINK_HIGHEXPER
))
* Fill in IMP leader -- impoutput refrains from rebuilding
* the leader when it sees the protocol family PF_IMPLINK.
* (message size calculated by walking through mbuf's)
for (len
= 0, n
= m
; n
; n
= n
->m_next
)
il
->il_length
= len
<< 3;
sin
= (struct sockaddr_in
*)&rp
->rcb_addr
;
il
->il_network
= sin
->sin_addr
.s_net
;
il
->il_host
= sin
->sin_addr
.s_host
;
il
->il_imp
= sin
->sin_addr
.s_imp
;
return (impoutput((struct ifnet
*)rp
->rcb_pcb
, m
, PF_IMPLINK
));
* Intercept operations required to
* maintain interface pointer used on output.
imp_usrreq(so
, req
, m
, addr
)
register struct rawcb
*rp
= sotorawcb(so
);
if (rp
== 0 && req
!= PRU_ATTACH
)
* Verify address has an interface to go with it
* and record information for use in output routine.
register struct sockaddr_in
*sin
;
register struct ifnet
*ifp
;
sin
= (struct sockaddr_in
*)addr
;
ifp
= if_ifonnetof(sin
->sin_addr
);
ifp
= if_gatewayfor(sin
->sin_addr
);
return (EADDRNOTAVAIL
); /* XXX */
rp
->rcb_pcb
= (caddr_t
)ifp
;
return (raw_usrreq(so
, req
, m
, addr
));