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