1*8413Swnj /* tp_usrreq.c 1.3 82/10/09 */ 26834Ssam 36834Ssam #include "../h/param.h" 46834Ssam #include "../h/systm.h" 56834Ssam #include "../h/mbuf.h" 66834Ssam #include "../h/socket.h" 76834Ssam #include "../h/socketvar.h" 86834Ssam #include "../h/protosw.h" 9*8413Swnj #include "../netdecnet/dn_systm.h" 10*8413Swnj #include "../netdecnet/tp.h" 11*8413Swnj #include "../netdecnet/tp_var.h" 126834Ssam 136834Ssam /* 146834Ssam * Transport protocol interface to socket abstraction. 156834Ssam * Used ONLY to initialize the Transport layer. May be 166834Ssam * used for routing control in the future. 176834Ssam */ 186834Ssam 196834Ssam /* 206834Ssam * Process a Transport user request. Only allowed 216834Ssam * operation is PRU_ATTACH to initialize the Transport 226834Ssam * layer. 236834Ssam */ 246834Ssam tp_usrreq(so, req, m, addr) 256834Ssam struct socket *so; 266834Ssam int req; 276834Ssam struct mbuf *m; 286834Ssam caddr_t addr; 296834Ssam { 306834Ssam int s = splimp(); 316834Ssam int error = 0; 326834Ssam 336834Ssam /* 346834Ssam */ 356834Ssam if (so->so_pcb != 0 || req != PRU_ATTACH) { 366834Ssam splx(s); 376834Ssam return (EINVAL); /* XXX */ 386834Ssam } 396834Ssam if (tpstate != TPS_HALT) { 406834Ssam splx(s); 416834Ssam return (0); 426834Ssam } 436834Ssam if (tp_linit() == 0) { 446834Ssam splx(s); 456834Ssam return (EIO); 466834Ssam } 476834Ssam sleep((caddr_t)&tpstate, PZERO+1); 486834Ssam splx(s); 496834Ssam return (0); 506834Ssam } 516834Ssam 526834Ssam /* 536834Ssam * Perform transport initialization for a line 546834Ssam */ 556834Ssam tp_linit() 566834Ssam { 576834Ssam register struct mbuf *m; 586834Ssam register struct tpin *t; 596834Ssam register int n; 606834Ssam 616834Ssam m = m_get(0); 626834Ssam if (m == 0) 636834Ssam return (0); 646834Ssam m->m_off = MMINOFF; 656834Ssam m->m_len = sizeof (struct tpin); 666834Ssam t = mtod(m, struct tpin *); 676834Ssam t->tpin_ctlflg = TP_INIT; 686834Ssam AD_SHORT(t->tpin_srcnode, tp_host); 696834Ssam t->tpin_tiinfo = TPINNT_NRT; 706834Ssam AD_SHORT(t->tpin_blksize, 1024); 716834Ssam t->tpin_ver[0] = 1; 726834Ssam t->tpin_ver[1] = 3; 736834Ssam t->tpin_ver[2] = 0; 746834Ssam t->tpin_res = 0; 756834Ssam n = (*tpifp->if_output)(tpifp, m, PF_DECNET); 766834Ssam tpstate = TPS_TIS; 776834Ssam m_freem(m); 786834Ssam return (n); 796834Ssam } 80