1 /* tp_usrreq.c 1.4 82/12/18 */
2
3 #include "../h/param.h"
4 #include "../h/systm.h"
5 #include "../h/mbuf.h"
6 #include "../h/socket.h"
7 #include "../h/socketvar.h"
8 #include "../h/protosw.h"
9 #include "../netdecnet/dn_systm.h"
10 #include "../netdecnet/tp.h"
11 #include "../netdecnet/tp_var.h"
12
13 /*
14 * Transport protocol interface to socket abstraction.
15 * Used ONLY to initialize the Transport layer. May be
16 * used for routing control in the future.
17 */
18
19 /*
20 * Process a Transport user request. Only allowed
21 * operation is PRU_ATTACH to initialize the Transport
22 * layer.
23 */
24 tp_usrreq(so, req, m, addr)
25 struct socket *so;
26 int req;
27 struct mbuf *m;
28 caddr_t addr;
29 {
30 int s = splimp();
31 int error = 0;
32
33 /*
34 */
35 if (so->so_pcb != 0 || req != PRU_ATTACH) {
36 splx(s);
37 return (EINVAL); /* XXX */
38 }
39 if (tpstate != TPS_HALT) {
40 splx(s);
41 return (0);
42 }
43 if (tp_linit() == 0) {
44 splx(s);
45 return (EIO);
46 }
47 sleep((caddr_t)&tpstate, PZERO+1);
48 splx(s);
49 return (0);
50 }
51
52 /*
53 * Perform transport initialization for a line
54 */
tp_linit()55 tp_linit()
56 {
57 register struct mbuf *m;
58 register struct tpin *t;
59 register int n;
60
61 m = m_get(MT_CANTWAIT, MT_HEADER);
62 if (m == 0)
63 return (0);
64 m->m_off = MMINOFF;
65 m->m_len = sizeof (struct tpin);
66 t = mtod(m, struct tpin *);
67 t->tpin_ctlflg = TP_INIT;
68 AD_SHORT(t->tpin_srcnode, tp_host);
69 t->tpin_tiinfo = TPINNT_NRT;
70 AD_SHORT(t->tpin_blksize, 1024);
71 t->tpin_ver[0] = 1;
72 t->tpin_ver[1] = 3;
73 t->tpin_ver[2] = 0;
74 t->tpin_res = 0;
75 n = (*tpifp->if_output)(tpifp, m, PF_DECNET);
76 tpstate = TPS_TIS;
77 m_freem(m);
78 return (n);
79 }
80