/* raw_pup.c 4.1 82/02/02 */
#include "../h/protosw.h"
#include "../h/socketvar.h"
#include "../net/in_systm.h"
#include "../net/raw_cb.h"
#include "/usr/include/errno.h"
* Raw PUP protocol interface.
static struct sockaddr_pup pupaddr
= { AF_PUP
};
static struct sockproto pupproto
= { PF_PUP
};
* Setup generic address and protocol structures
* for raw_input routine, then pass them along with
register struct pup_header
*pup
= mtod(m
, struct pup_header
*);
pupproto
.sp_protocol
= pup
->pup_type
;
pupaddr
.spup_addr
= pup
->pup_daddr
;
raw_input(m
, pupproto
, pupaddr
);
* 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
*spup
;
* 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) {
pup
= mtod(m
, struct pup_header
*);
if (pup
->pup_tcontrol
&& (pup
->pup_tcontrol
& ~PUP_TRACE
))
for (len
= 0, n
= m
; n
; n
= n
->m_next
)
spup
= (struct sockaddr_pup
*)&rp
->rcb_addr
;
pup
->pup_dport
= spup
->spup_addr
;
* Insure proper source address is included.
spup
= (struct sockadrr_pup
*)rp
->rcb_socket
->so_addr
;
pup
->pup_sport
= spup
->spup_addr
;
/* for now, assume user generates PUP checksum. */
if (rp
->rcb_pcb
== 0) /* XXX */
return (enoutput((struct ifnet
*)rp
->rcb_pcb
, m
, PF_PUP
));
* Intercept connects and sends to verify interface
* exists for destination address. Disconnects are
* also looked at to insure pointer is invalidated.
rawpup_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_pup
*spup
;
register struct ifnet
*ifp
;
spup
= (struct sockaddr_pup
*)addr
;
ifp
= if_ifonnetof(spup
->spup_addr
);
ifp
= if_gatewayfor(spup
->spup_addr
);
return (EADDRNOTAVAIL
); /* XXX */
rp
->rcb_pcb
= (caddr_t
)ifp
;
return (raw_usrreq(so
, req
, m
, addr
));