1 /* 2 * spppcomp.h - Solaris STREAMS PPP compression module definitions 3 * 4 * Copyright 2000-2002 Sun Microsystems, Inc. All rights reserved. 5 * Use is subject to license terms. 6 * 7 * Permission to use, copy, modify, and distribute this software and its 8 * documentation is hereby granted, provided that the above copyright 9 * notice appears in all copies. 10 * 11 * SUN MAKES NO REPRESENTATION OR WARRANTIES ABOUT THE SUITABILITY OF 12 * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED 13 * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 14 * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR 15 * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR 16 * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES 17 * 18 * Copyright (c) 1994 The Australian National University. 19 * All rights reserved. 20 * 21 * Permission to use, copy, modify, and distribute this software and its 22 * documentation is hereby granted, provided that the above copyright 23 * notice appears in all copies. This software is provided without any 24 * warranty, express or implied. The Australian National University 25 * makes no representations about the suitability of this software for 26 * any purpose. 27 * 28 * IN NO EVENT SHALL THE AUSTRALIAN NATIONAL UNIVERSITY BE LIABLE TO ANY 29 * PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES 30 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF 31 * THE AUSTRALIAN NATIONAL UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY 32 * OF SUCH DAMAGE. 33 * 34 * THE AUSTRALIAN NATIONAL UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, 35 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 36 * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS 37 * ON AN "AS IS" BASIS, AND THE AUSTRALIAN NATIONAL UNIVERSITY HAS NO 38 * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, 39 * OR MODIFICATIONS. 40 * 41 * This driver is derived from the original SVR4 STREAMS PPP driver 42 * originally written by Paul Mackerras <paul.mackerras@cs.anu.edu.au>. 43 * 44 * Adi Masputra <adi.masputra@sun.com> rewrote and restructured the code 45 * for improved performance and scalability. 46 */ 47 48 #ifndef __SPPPCOMP_H 49 #define __SPPPCOMP_H 50 51 #pragma ident "%Z%%M% %I% %E% SMI" 52 53 #ifdef __cplusplus 54 extern "C" { 55 #endif 56 57 /* 58 * Per-unit kstats. 59 */ 60 typedef struct spppcomp_kstats { 61 kstat_named_t vj_out_pkts; 62 kstat_named_t vj_out_pkts_comp; 63 kstat_named_t vj_cs_searches; 64 kstat_named_t vj_cs_misses; 65 kstat_named_t vj_in_pkts_uncomp; 66 kstat_named_t vj_in_pkts_comp; 67 kstat_named_t vj_in_error; 68 kstat_named_t vj_in_tossed; 69 kstat_named_t out_errors_low; 70 kstat_named_t out_uncomp_bytes; 71 kstat_named_t out_uncomp_pkts; 72 kstat_named_t out_comp_bytes; 73 kstat_named_t out_comp_pkts; 74 kstat_named_t out_incomp_bytes; 75 kstat_named_t out_incomp_pkts; 76 kstat_named_t in_errors_low; 77 kstat_named_t in_uncomp_bytes; 78 kstat_named_t in_uncomp_pkts; 79 kstat_named_t in_comp_bytes; 80 kstat_named_t in_comp_pkts; 81 kstat_named_t in_incomp_bytes; 82 kstat_named_t in_incomp_pkts; 83 #ifdef SPC_DEBUG 84 kstat_named_t in_msg_ccp_pulledup; 85 kstat_named_t in_msg_vj_pulledup; 86 kstat_named_t out_msg_pulledup; 87 kstat_named_t out_msg_copied; 88 kstat_named_t out_queued; 89 kstat_named_t out_handled; 90 kstat_named_t in_queued; 91 kstat_named_t in_handled; 92 #endif 93 94 /* 64 bit entries */ 95 kstat_named_t out_bytes; 96 kstat_named_t out_pkts; 97 kstat_named_t out_errors; 98 kstat_named_t in_bytes; 99 kstat_named_t in_pkts; 100 kstat_named_t in_errors; 101 } spppcomp_kstats_t; 102 103 #define SPPPCOMP_KSTATS_NAMES \ 104 "vj_out_pkts", "vj_out_pkts_comp", "vj_cs_searches", \ 105 "vj_cs_misses", "vj_in_pkts_uncomp", "vj_in_pkts_comp", \ 106 "vj_in_error", "vj_in_tossed", "out_errors_lower", \ 107 "out_uncomp_bytes", "out_uncomp_pkts", "out_comp_bytes", \ 108 "out_comp_pkts", "out_incomp_bytes", "out_incomp_pkts", \ 109 "in_errors_lower", "in_uncomp_bytes", "in_uncomp_pkts", \ 110 "in_comp_bytes", "in_comp_pkts", "in_incomp_bytes", \ 111 "in_incomp_pkts" 112 113 #ifdef SPC_DEBUG 114 #define SPCDEBUG_KSTATS_NAMES \ 115 "in_msg_ccp_pulledup", "in_msg_vj_pulledup", "out_msg_pulledup", \ 116 "out_msg_copied", "out_queued", "out_handled", \ 117 "in_queued", "in_handled" 118 #endif 119 120 #define SPPPCOMP_KSTATS64_NAMES \ 121 "out_bytes", "out_pkts", "out_errors", \ 122 "in_bytes", "in_pkts", "in_errors" 123 124 /* 125 * Per-stream instance state information. 126 * 127 * Each instance is dynamically allocated at open() and freed at close(). 128 * Each per-Stream instance points to at most one per-unit kstats structure 129 * using the cp_kstats field, which is allocated once per-Stream when 130 * PPPCTL_UNIT is received from above. 131 */ 132 typedef struct sppp_comp { 133 uint32_t cp_flags; /* miscellaneous flags */ 134 ushort_t cp_mru; /* link layer MRU */ 135 ushort_t cp_mtu; /* link layer MTU */ 136 uint32_t cp_unit; /* unique unit id */ 137 struct compressor *cp_xcomp; /* compressor structure */ 138 void *cp_xstate; /* compressor state */ 139 struct compressor *cp_rcomp; /* de-compressor structure */ 140 void *cp_rstate; /* de-compressor state */ 141 struct vjcompress cp_vj; /* VJ compression state */ 142 kmutex_t cp_pair_lock; /* lock for queue pair */ 143 hrtime_t cp_lastfinish; /* last decode finish time */ 144 int16_t cp_effort; /* configured effort level */ 145 int16_t cp_nxslots; /* VJ compress slots */ 146 uint16_t cp_fastin; /* count of fast inputs */ 147 ppp_counter_t cp_vj_last_ierrors; /* last VJ input errors */ 148 struct pppstat64 cp_stats; /* legacy stats structure */ 149 kstat_t *cp_kstats; /* ptr to kstats structure */ 150 uint32_t cp_ierr_low; /* in error from below */ 151 uint32_t cp_oerr_low; /* out error from below */ 152 #ifdef SPC_DEBUG 153 uint32_t cp_imsg_ccp_pull; /* msgpullup on recv */ 154 uint32_t cp_imsg_vj_pull; /* msgpullup on recv */ 155 uint32_t cp_omsg_pull; /* msgpullup on send */ 156 uint32_t cp_omsg_dcopy; /* copymsg on send */ 157 uint32_t cp_out_queued; /* did putq */ 158 uint32_t cp_out_handled; /* did putnext */ 159 uint32_t cp_in_queued; /* did putq */ 160 uint32_t cp_in_handled; /* did putnext */ 161 #endif 162 } sppp_comp_t; 163 164 /* 165 * Bits in flags are as defined in pppio.h 166 * COMP_AC 0x00000001 compress address/control 167 * DECOMP_AC 0x00000002 decompress address/control 168 * COMP_PROT 0x00000004 compress PPP protocol 169 * DECOMP_PROT 0x00000008 decompress PPP protocol 170 * COMP_VJC 0x00000010 compress TCP/IP headers 171 * COMP_VJCCID 0x00000020 compress connection ID as well 172 * DECOMP_VJC 0x00000040 decompress TCP/IP headers 173 * DECOMP_VJCCID 0x00000080 accept compressed connection ID 174 * CCP_ISOPEN 0x00000100 look at CCP packets 175 * CCP_ISUP 0x00000200 do packet comp/decomp 176 * CCP_ERROR 0x00000400 (status) error in packet decomp 177 * CCP_FATALERROR 0x00000800 (status) fatal error ditto 178 * CCP_COMP_RUN 0x00001000 (status) seen CCP ack sent 179 * CCP_DECOMP_RUN 0x00002000 (status) seen CCP ack rcvd 180 */ 181 #define CP_KDEBUG 0x02000000 /* log debugging stuff */ 182 #define CP_HASUNIT 0x04000000 /* PPPCTL_UNIT has been issued on */ 183 #define CP_LASTMOD 0x08000000 /* last PPP-aware module in stream */ 184 #define CCP_ERR (CCP_ERROR | CCP_FATALERROR) 185 186 #define IS_COMP_AC(x) \ 187 ((x)->cp_flags & COMP_AC) 188 #define IS_DECOMP_AC(x) \ 189 ((x)->cp_flags & DECOMP_AC) 190 #define IS_COMP_PROT(x) \ 191 ((x)->cp_flags & COMP_PROT) 192 #define IS_DECOMP_PROT(x) \ 193 ((x)->cp_flags & DECOMP_PROT) 194 #define IS_COMP_VJC(x) \ 195 ((x)->cp_flags & COMP_VJC) 196 #define IS_COMP_VJCCID(x) \ 197 ((x)->cp_flags & COMP_VJCCID) 198 #define IS_DECOMP_VJC(x) \ 199 ((x)->cp_flags & DECOMP_VJC) 200 #define IS_DECOMP_VJCCID(x) \ 201 ((x)->cp_flags & DECOMP_VJCCID) 202 #define IS_CCP_ISOPEN(x) \ 203 ((x)->cp_flags & CCP_ISOPEN) 204 #define IS_CCP_ISUP(x) \ 205 ((x)->cp_flags & CCP_ISUP) 206 #define IS_CCP_ERROR(x) \ 207 ((x)->cp_flags & CCP_ERROR) 208 #define IS_CCP_FATALERROR(x) \ 209 ((x)->cp_flags & CCP_FATALERROR) 210 #define IS_CCP_COMP_RUN(x) \ 211 ((x)->cp_flags & CCP_COMP_RUN) 212 #define IS_CCP_DECOMP_RUN(x) \ 213 ((x)->cp_flags & CCP_DECOMP_RUN) 214 #define IS_CP_KDEBUG(x) \ 215 ((x)->cp_flags & CP_KDEBUG) 216 #define IS_CP_HASUNIT(x) \ 217 ((x)->cp_flags & CP_HASUNIT) 218 #define IS_CP_LASTMOD(x) \ 219 ((x)->cp_flags & CP_LASTMOD) 220 221 /* 222 * Bit format (octal based) string for cmn_err/printf, which 223 * represents the flags. 224 */ 225 #define CP_FLAGSSTR \ 226 "\020" \ 227 "\1comp_ac" \ 228 "\2decomp_ac" \ 229 "\3comp_prot" \ 230 "\4decomp_prot" \ 231 "\5comp_vjc" \ 232 "\6comp_vjccid" \ 233 "\7decomp_vjc" \ 234 "\10decomp_vjccid" \ 235 "\11ccp_isopen" \ 236 "\12ccp_isup" \ 237 "\13ccp_error" \ 238 "\14ccp_fatalerror" \ 239 "\15ccp_comp_run" \ 240 "\16ccp_decomp_run" \ 241 "\32kdebug" \ 242 "\33hasunit" \ 243 "\34lastmod" 244 245 #ifdef __cplusplus 246 } 247 #endif 248 249 #endif /* __SPPPCOMP_H */ 250