/* raw_pup.c 4.13 82/06/26 */
#include "../h/protosw.h"
#include "../h/socketvar.h"
#include "../net/in_systm.h"
#include "../net/raw_cb.h"
* Raw PUP protocol interface.
* Encapsulate packet in PUP header which is supplied by the
* user. This is done to allow user to specify PUP identifier.
register struct rawcb
*rp
= sotorawcb(so
);
register struct pup_header
*pup
;
struct sockaddr_pup
*dst
;
* Verify user has supplied necessary space
* for the header and check parameters in it.
if ((m
->m_off
> MMAXOFF
|| m
->m_len
< sizeof(struct pup_header
)) &&
(m
= m_pullup(m
, sizeof(struct pup_header
))) == 0) {
error
= EMSGSIZE
; /* XXX */
pup
= mtod(m
, struct pup_header
*);
if (pup
->pup_type
== 0) {
if (pup
->pup_tcontrol
&& (pup
->pup_tcontrol
& ~PUP_TRACE
)) {
for (len
= 0, n
= m
; n
; n
= n
->m_next
)
pup
->pup_length
= htons(pup
->pup_length
);
/* assume user generates PUP checksum. */
dst
= (struct sockaddr_pup
*)&rp
->rcb_faddr
;
pup
->pup_dport
= dst
->spup_addr
;
ifp
= if_ifonnetof(pup
->pup_dnet
);
if (rp
->rcb_flags
& RAW_LADDR
) {
register struct sockaddr_pup
*src
;
src
= (struct sockaddr_pup
*)&rp
->rcb_laddr
;
pup
->pup_sport
= src
->spup_addr
;
pup
->pup_snet
= ifp
->if_net
;
pup
->pup_shost
= ifp
->if_host
[0];
/* socket is specified by user */
return ((*ifp
->if_output
)(ifp
, m
, (struct sockaddr
*)dst
));