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