1*25202Skarels /**************************************************************************/
2*25202Skarels /*                                                                        */
3*25202Skarels /*  code to support kernel generated traps -- user's can send their own   */
4*25202Skarels /*  thru normal channels.                                                 */
5*25202Skarels /*                                                                        */
6*25202Skarels /**************************************************************************/
7*25202Skarels 
8*25202Skarels #if HMP && HMPTRAPS
9*25202Skarels 
10*25202Skarels #include "../h/param.h"
11*25202Skarels #include "../h/dir.h"
12*25202Skarels #include "../h/user.h"
13*25202Skarels #include "../h/mbuf.h"
14*25202Skarels #include "../h/protosw.h"
15*25202Skarels #include "../h/socket.h"
16*25202Skarels #include "../h/socketvar.h"
17*25202Skarels #include "../h/errno.h"
18*25202Skarels 
19*25202Skarels #include "../net/if.h"
20*25202Skarels #include "../net/route.h"
21*25202Skarels 
22*25202Skarels #include "../bbnnet/in.h"
23*25202Skarels #include "../bbnnet/in_pcb.h"
24*25202Skarels #include "../bbnnet/in_var.h"
25*25202Skarels #include "../bbnnet/ip.h"
26*25202Skarels #include "../bbnnet/hmp.h"
27*25202Skarels #include "../bbnnet/hmp_var.h"
28*25202Skarels #include "../bbnnet/hmp_traps.h"
29*25202Skarels 
30*25202Skarels /*
31*25202Skarels  * list of monitoring hosts that want to get traps
32*25202Skarels  * uses a sockaddr_hmp so you can specify address & port. doesn't use
33*25202Skarels  * other fields but is the most common structure for saving port/host info.
34*25202Skarels  */
35*25202Skarels 
36*25202Skarels static struct sockaddr_hmp mon_hosts[MAX_MONHOSTS];
37*25202Skarels static int num_monhosts = 0;
38*25202Skarels 
39*25202Skarels /*
40*25202Skarels  * learn who gets traps
41*25202Skarels  */
42*25202Skarels 
43*25202Skarels getmonhosts(optval)
44*25202Skarels struct mbuf **optval;
45*25202Skarels {
46*25202Skarels     struct mbuf *m;
47*25202Skarels 
48*25202Skarels     if ((m = m_getclr(M_WAIT,MT_DATA)) == 0)
49*25202Skarels 	return(ENOBUFS);
50*25202Skarels 
51*25202Skarels     if (num_monhosts)
52*25202Skarels     {
53*25202Skarels 	m->m_len = num_monhosts * sizeof(struct sockaddr_hmp);
54*25202Skarels 	bcopy((caddr_t)mon_hosts,mtod(m,caddr_t),(unsigned)m->m_len);
55*25202Skarels     }
56*25202Skarels     else
57*25202Skarels     {
58*25202Skarels 	/* would like to return nothing, but can't */
59*25202Skarels 	m->m_len = sizeof(struct sockaddr_hmp);
60*25202Skarels 	bzero(mtod(m,caddr_t),m->m_len);
61*25202Skarels     }
62*25202Skarels 
63*25202Skarels     *optval = m;
64*25202Skarels     return(0);
65*25202Skarels }
66*25202Skarels 
67*25202Skarels /*
68*25202Skarels  * changing who gets our traps
69*25202Skarels  */
70*25202Skarels 
71*25202Skarels setmonhosts(optval)
72*25202Skarels struct mbuf *optval;
73*25202Skarels {
74*25202Skarels     register unsigned len;
75*25202Skarels 
76*25202Skarels     if (!suser())
77*25202Skarels 	return(u.u_error);
78*25202Skarels 
79*25202Skarels     if (optval == 0)
80*25202Skarels     {
81*25202Skarels 	/* clearing table */
82*25202Skarels 	num_monhosts = 0;
83*25202Skarels 	return(0);
84*25202Skarels     }
85*25202Skarels 
86*25202Skarels     len = (optval)->m_len;
87*25202Skarels 
88*25202Skarels     /* rational data ? */
89*25202Skarels     if (((len/sizeof(struct sockaddr_hmp)) == 0) ||
90*25202Skarels 	((len % sizeof(struct sockaddr_hmp)) != 0))
91*25202Skarels 	return(EFAULT);
92*25202Skarels 
93*25202Skarels     if (len > sizeof(mon_hosts))
94*25202Skarels 	return(ENOBUFS);	/* close enough to true error */
95*25202Skarels 
96*25202Skarels     bcopy(mtod(optval,caddr_t),(caddr_t)mon_hosts,len);
97*25202Skarels 
98*25202Skarels     num_monhosts = len / sizeof(struct sockaddr_hmp);
99*25202Skarels 
100*25202Skarels     return(0);
101*25202Skarels }
102*25202Skarels 
103*25202Skarels /*
104*25202Skarels  * what kernel calls to send stuff
105*25202Skarels  */
106*25202Skarels 
107*25202Skarels /* nobody does anything but copy this */
108*25202Skarels static struct hmpcb trappcb =
109*25202Skarels {
110*25202Skarels     	0,		0,		HM_43HOST,	HM_43HOST,
111*25202Skarels 	HM_TRAP,	HM_TRAP,	0,		0,
112*25202Skarels 	0,		0,		0,
113*25202Skarels } ;
114*25202Skarels 
hmp_trap(code,data,len)115*25202Skarels hmp_trap(code, data, len)
116*25202Skarels int code;
117*25202Skarels caddr_t data;
118*25202Skarels unsigned len;
119*25202Skarels {
120*25202Skarels     register int i;
121*25202Skarels     struct mbuf *m;
122*25202Skarels     struct inpcb inp;
123*25202Skarels     struct hmpcb hp;
124*25202Skarels     struct hmp_trap ht;
125*25202Skarels 
126*25202Skarels     if (num_monhosts == 0)
127*25202Skarels 	return;
128*25202Skarels 
129*25202Skarels     if (len > (MLEN - sizeof(ht)))
130*25202Skarels     {
131*25202Skarels 	printf("hmp_trap: trap size too big\n");
132*25202Skarels 	return;
133*25202Skarels     }
134*25202Skarels     bcopy((caddr_t)&trappcb,(caddr_t)&hp,sizeof(hp));
135*25202Skarels     bzero((caddr_t)&inp,sizeof(inp));
136*25202Skarels 
137*25202Skarels     /* this may not be necessary but careful never hurts */
138*25202Skarels     inp.inp_ppcb = &hp;
139*25202Skarels     hp.hp_inpcb = &inp;
140*25202Skarels 
141*25202Skarels     /* fill in trap data leader */
142*25202Skarels     ht.ht_time = iptime();
143*25202Skarels     ht.ht_type = htonl((u_long)code);
144*25202Skarels 
145*25202Skarels 
146*25202Skarels     for(i=0; i < num_monhosts; i++)
147*25202Skarels     {
148*25202Skarels 	/* get mbuf for packet */
149*25202Skarels 	m = m_getclr(M_DONTWAIT,MT_DATA);
150*25202Skarels 
151*25202Skarels 	if (m == 0)
152*25202Skarels 	    return;
153*25202Skarels 
154*25202Skarels 	bcopy((caddr_t)&ht,mtod(m,caddr_t),sizeof(ht));
155*25202Skarels 	bcopy(data,mtod(m,caddr_t)+sizeof(ht),len);
156*25202Skarels 
157*25202Skarels 	m->m_len = len + sizeof(ht);
158*25202Skarels 
159*25202Skarels 	/* stuff remote address and port */
160*25202Skarels 	inp.inp_faddr = mon_hosts[i].sin_addr;
161*25202Skarels 	inp.inp_fport = mon_hosts[i].sin_port;
162*25202Skarels 
163*25202Skarels 	(void) hmp_output(&inp,m);
164*25202Skarels     }
165*25202Skarels }
166*25202Skarels 
167*25202Skarels #endif
168