xref: /titanic_44/usr/src/uts/common/inet/ipf/misc.c (revision 381a2a9a387f449fab7d0c7e97c4184c26963abf)
1*381a2a9aSdr146992 /*
2*381a2a9aSdr146992  * Copyright (C) 2003 by Darren Reed.
3*381a2a9aSdr146992  *
4*381a2a9aSdr146992  * See the IPFILTER.LICENCE file for details on licencing.
5*381a2a9aSdr146992  */
6*381a2a9aSdr146992 /*
7*381a2a9aSdr146992  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
8*381a2a9aSdr146992  * Use is subject to license terms.
9*381a2a9aSdr146992  */
10*381a2a9aSdr146992 #ifndef __hpux
11*381a2a9aSdr146992 #pragma ident "@(#)$Id: misc.c,v 1.12 2003/11/29 07:11:03 darrenr Exp $"
12*381a2a9aSdr146992 #else
13*381a2a9aSdr146992 struct uio;
14*381a2a9aSdr146992 #endif
15*381a2a9aSdr146992 
16*381a2a9aSdr146992 #pragma ident	"%Z%%M%	%I%	%E% SMI"
17*381a2a9aSdr146992 
18*381a2a9aSdr146992 #include <sys/systm.h>
19*381a2a9aSdr146992 #include <sys/types.h>
20*381a2a9aSdr146992 #include <sys/stream.h>
21*381a2a9aSdr146992 #include <sys/ddi.h>
22*381a2a9aSdr146992 
23*381a2a9aSdr146992 #ifdef	__hpux
24*381a2a9aSdr146992 # define	BCOPY(a,b,c)	bcopy((caddr_t)a, (caddr_t)b, c)
25*381a2a9aSdr146992 #endif
26*381a2a9aSdr146992 #ifdef	sun
27*381a2a9aSdr146992 # define	BCOPY(a,b,c)	bcopy((char *)a, (char *)b, c)
28*381a2a9aSdr146992 #endif
29*381a2a9aSdr146992 
mb_copydata(min,off,len,buf)30*381a2a9aSdr146992 void mb_copydata(min, off, len, buf)
31*381a2a9aSdr146992 mblk_t *min;
32*381a2a9aSdr146992 size_t off, len;
33*381a2a9aSdr146992 char *buf;
34*381a2a9aSdr146992 {
35*381a2a9aSdr146992 	u_char *s, *bp = (u_char *)buf;
36*381a2a9aSdr146992 	size_t mlen, olen, clen;
37*381a2a9aSdr146992 	mblk_t *m;
38*381a2a9aSdr146992 
39*381a2a9aSdr146992 	for (m = min; (m != NULL) && (len > 0); m = m->b_cont) {
40*381a2a9aSdr146992 		if (m->b_datap->db_type != M_DATA)
41*381a2a9aSdr146992 			continue;
42*381a2a9aSdr146992 		s = m->b_rptr;
43*381a2a9aSdr146992 		mlen = m->b_wptr - s;
44*381a2a9aSdr146992 		olen = min(off, mlen);
45*381a2a9aSdr146992 		if ((olen == mlen) || (olen < off)) {
46*381a2a9aSdr146992 			off -= olen;
47*381a2a9aSdr146992 			continue;
48*381a2a9aSdr146992 		} else if (olen) {
49*381a2a9aSdr146992 			off -= olen;
50*381a2a9aSdr146992 			s += olen;
51*381a2a9aSdr146992 			mlen -= olen;
52*381a2a9aSdr146992 		}
53*381a2a9aSdr146992 		clen = min(mlen, len);
54*381a2a9aSdr146992 		BCOPY(s, bp, clen);
55*381a2a9aSdr146992 		len -= clen;
56*381a2a9aSdr146992 		bp += clen;
57*381a2a9aSdr146992 	}
58*381a2a9aSdr146992 }
59*381a2a9aSdr146992 
60*381a2a9aSdr146992 
mb_copyback(min,off,len,buf)61*381a2a9aSdr146992 void mb_copyback(min, off, len, buf)
62*381a2a9aSdr146992 mblk_t *min;
63*381a2a9aSdr146992 size_t off, len;
64*381a2a9aSdr146992 char *buf;
65*381a2a9aSdr146992 {
66*381a2a9aSdr146992 	u_char *s, *bp = (u_char *)buf;
67*381a2a9aSdr146992 	size_t mlen, olen, clen;
68*381a2a9aSdr146992 	mblk_t *m, *mp;
69*381a2a9aSdr146992 
70*381a2a9aSdr146992 	for (m = min, mp = NULL; (m != NULL) && (len > 0); m = m->b_cont) {
71*381a2a9aSdr146992 		mp = m;
72*381a2a9aSdr146992 		if (m->b_datap->db_type != M_DATA)
73*381a2a9aSdr146992 			continue;
74*381a2a9aSdr146992 
75*381a2a9aSdr146992 		s = m->b_rptr;
76*381a2a9aSdr146992 		mlen = m->b_wptr - s;
77*381a2a9aSdr146992 		olen = min(off, mlen);
78*381a2a9aSdr146992 		if ((olen == mlen) || (olen < off)) {
79*381a2a9aSdr146992 			off -= olen;
80*381a2a9aSdr146992 			continue;
81*381a2a9aSdr146992 		} else if (olen) {
82*381a2a9aSdr146992 			off -= olen;
83*381a2a9aSdr146992 			s += olen;
84*381a2a9aSdr146992 			mlen -= olen;
85*381a2a9aSdr146992 		}
86*381a2a9aSdr146992 		clen = min(mlen, len);
87*381a2a9aSdr146992 		BCOPY(bp, s, clen);
88*381a2a9aSdr146992 		len -= clen;
89*381a2a9aSdr146992 		bp += clen;
90*381a2a9aSdr146992 	}
91*381a2a9aSdr146992 
92*381a2a9aSdr146992 	if ((m == NULL) && (mp != NULL)) {
93*381a2a9aSdr146992 		if (len > 0) {
94*381a2a9aSdr146992 			mlen = mp->b_datap->db_lim - mp->b_wptr;
95*381a2a9aSdr146992 			if (mlen > 0) {
96*381a2a9aSdr146992 				if (mlen > len)
97*381a2a9aSdr146992 					mlen = len;
98*381a2a9aSdr146992 				BCOPY(bp, mp->b_wptr, mlen);
99*381a2a9aSdr146992 				bp += mlen;
100*381a2a9aSdr146992 				len -= mlen;
101*381a2a9aSdr146992 				mp->b_wptr += mlen;
102*381a2a9aSdr146992 #ifdef  STRUIO_IP
103*381a2a9aSdr146992 # if SOLARIS2 < 10
104*381a2a9aSdr146992 				mp->b_datap->db_struiolim = mp->b_wptr;
105*381a2a9aSdr146992 # endif
106*381a2a9aSdr146992 				mp->b_datap->db_struioflag &= ~STRUIO_IP;
107*381a2a9aSdr146992 #endif
108*381a2a9aSdr146992 			}
109*381a2a9aSdr146992 		}
110*381a2a9aSdr146992 
111*381a2a9aSdr146992 		if (len > 0) {
112*381a2a9aSdr146992 			m = allocb(len, BPRI_MED);
113*381a2a9aSdr146992 			if (m != NULL) {
114*381a2a9aSdr146992 				BCOPY(bp, m->b_wptr, len);
115*381a2a9aSdr146992 				m->b_band = mp->b_band;
116*381a2a9aSdr146992 				m->b_wptr += len;
117*381a2a9aSdr146992 				linkb(mp, m);
118*381a2a9aSdr146992 			}
119*381a2a9aSdr146992 		}
120*381a2a9aSdr146992 	}
121*381a2a9aSdr146992 }
122