fix header files
[unix-history] / usr / src / sys / deprecated / netdecnet / tp_input.c
CommitLineData
24d3bb4c 1/* tp_input.c 1.2 82/05/15 */
944419ad
SL
2
3#include "../h/param.h"
4#include "../h/systm.h"
5#include "../h/clock.h"
6#include "../h/mbuf.h"
7#include "../h/protosw.h"
8#include "../h/socket.h"
9#include "../net/dn_systm.h"
10#include "../net/if.h"
11#include "../net/tp.h"
12#include "../net/tp_var.h"
13
14
15/*
16 * Initialize a few of the Transport variables here.
17 */
18tp_init()
19{
20 tp_host = 244;
21 tprp.tprp_nn = 255; /* max node number */
22}
23
24/*
25 * Attach a DECnet interface.
26 * For now, since we are an end node,
27 * there can only be one.
28 */
29tp_attach(ifp)
30 register struct ifnet *ifp;
31{
32 if (tpifp) {
33 printf("tp: Only one DECnet interface allowed, ");
34 printf("%s%d ignored\n", ifp->if_name, ifp->if_unit);
35 return;
36 }
37 tpifp = ifp;
38}
39
40/*
41 * Transport input routine. Decode header, process
42 * initialization messages, flush other control messages,
43 * and strip route headers and pass to NSP.
44 */
45tp_input()
46{
47 register struct mbuf *m;
48 register char *p;
49
50next:
51 /*
52 * Get next packet off input queue.
53 */
54 IF_DEQUEUE(&tpintrq, m);
55 if (m == 0)
56 return;
57 p = mtod(m, char *);
58 switch (*p & TP_MSGTYPE) {
59 /*
60 * Transport initialization message from neighbor.
61 */
62 case TP_INIT:
63 {
64 register struct tpin *t = (struct tpin *)p;
65
66 printf("tpinit: node %d, %d, blksize %d, ver %o.%o.%o\n",
67 D_SHORT(t->tpin_srcnode), t->tpin_tiinfo,
68 D_SHORT(t->tpin_blksize),
69 t->tpin_ver[0], t->tpin_ver[1], t->tpin_ver[2]);
70 /* perform a few consistency checks */
71 if (m->m_len < sizeof (struct tpin)) {
72 tpstat.tps_badinit++;
73 break;
74 }
75 if (D_SHORT(t->tpin_srcnode) > tprp.tprp_nn) {
76 tpstat.tps_badinit++;
77 break;
78 }
79 if (t->tpin_res != 0) {
80 tpstat.tps_badinit++;
81 break;
82 }
83 tpstat.tps_init++;
84 if (tpstate == TPS_TIS) {
85 tpstate = TPS_RUN;
86 wakeup((caddr_t)&tpstate);
87 } else if (tpstate == TPS_HALT) {
88 tp_linit();
89 tpstate = TPS_RUN;
90 }
91 break;
92 }
93
94 /*
95 * Route header. Flush bad ones,
96 * strip good ones and pass to NSP.
97 */
98 case TP_RH:
99 {
100 register struct tprh *t = (struct tprh *)p;
101
102 /*
103 * Is it a reasonable route header?
104 */
105 if (tpstate != TPS_RUN) {
106 printf("tp: not running!\n");
107 break;
108 }
109 if (t->tprh_rtflg & TPRF_EV) {
110 printf("tp: got P2 ASCII header\n");
111 tpstat.tps_p2hdr++;
112 break;
113 }
114 if (t->tprh_rtflg & TPRF_RTS) {
115 printf("tp: got returned packet\n");
116 tpstat.tps_returned++;
117 break;
118 }
119 if (m->m_len <= sizeof (struct tprh)) {
120 printf("tp: got short packet, %d\n", m->m_len);
121 tpstat.tps_shortpacket++;
122 break;
123 }
124 if (D_SHORT(t->tprh_srcnode) > tprp.tprp_nn) {
125 tpstat.tps_badsrc++;
126 break;
127 }
128
129 /*
130 * Is it for us? If so,
131 * add it to the NSP input queue.
132 */
133 if (D_SHORT(t->tprh_dstnode) != tp_host) {
134 printf("tp: not for me, %d\n", D_SHORT(t->tprh_dstnode));
135 tpstat.tps_notforme++;
136 break;
137 }
138 setnspintr();
139 IF_ENQUEUE(&nspintrq, m);
140 goto next;
141 }
142
143 /*
144 * Verification messge. We should never see one
145 * of these because we never ask for one. Flush it.
146 */
147 case TP_VERIF:
148 printf("tp: got verification message\n");
149 tpstat.tps_verif++;
150 break;
151
152 /*
153 * Hello and test message. Make sure it's
154 * valid then flush it.
155 */
156 case TP_TEST:
157 {
158 register struct tpht *t = (struct tpht *)p;
159 register int i;
160
161 if (D_SHORT(t->tpht_srcnode) > tprp.tprp_nn) {
162 tpstat.tps_badsrc++;
163 break;
164 }
165 if ((i = t->tpht_cnt) < 0 || i > 128) {
166 printf("tp: test, bad count, %d\n", i);
167 tpstat.tps_badtest++;
168 break;
169 }
170 if (m->m_len != sizeof (struct tpht) + i - 1) {
171 printf("tp: test, bad len, %d\n", m->m_len);
172 tpstat.tps_bad_test++;
173 break;
174 }
175 for (p = t->tpht_data; i--; p++)
176 if (*p != 0252) {
177 printf("tp: test, bad data, %o\n", *p);
178 tpstat.tps_badtest++;
179 break;
180 }
181 break;
182 }
183
184 /*
185 * Routing message. We should never get this,
186 * at least not yet. Just flush it.
187 */
188 case TP_ROUTE:
189 printf("tp: got routing message\n");
190 tpstat.tps_route++;
191 break;
192
193 default:
194 printf("tp: unknown packet type, 0x%x\n", *p);
195 tpstat.tps_unknown++;
196 break;
197 }
198
199 /*
200 * Free the current packet and get the next one.
201 */
202 m_freem(m);
203 goto next;
204}