1121326Sharti/* 2121326Sharti * Copyright (c) 1996-2003 3121326Sharti * Fraunhofer Institute for Open Communication Systems (FhG Fokus). 4121326Sharti * All rights reserved. 5121326Sharti * 6121326Sharti * Redistribution and use in source and binary forms, with or without 7121326Sharti * modification, are permitted provided that the following conditions 8121326Sharti * are met: 9121326Sharti * 1. Redistributions of source code must retain the above copyright 10121326Sharti * notice, this list of conditions and the following disclaimer. 11121326Sharti * 2. Redistributions in binary form must reproduce the above copyright 12121326Sharti * notice, this list of conditions and the following disclaimer in the 13121326Sharti * documentation and/or other materials provided with the distribution. 14121326Sharti * 15121326Sharti * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16121326Sharti * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17121326Sharti * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18121326Sharti * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19121326Sharti * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20121326Sharti * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21121326Sharti * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22121326Sharti * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23121326Sharti * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24121326Sharti * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25121326Sharti * SUCH DAMAGE. 26121326Sharti * 27121326Sharti * Author: Hartmut Brandt <harti@freebsd.org> 28121326Sharti * 29131826Sharti * $Begemot: libunimsg/netnatm/saal/saal_sscfu.c,v 1.4 2004/07/08 08:22:10 brandt Exp $ 30121326Sharti * 31121326Sharti * SSCF on the UNI 32121326Sharti */ 33121326Sharti 34121326Sharti#include <netnatm/saal/sscfu.h> 35121326Sharti#include <netnatm/saal/sscfupriv.h> 36121326Sharti 37121326Sharti#define MKSTR(S) #S 38121326Sharti 39121326Shartistatic const char *const sscf_sigs[] = { 40121326Sharti MKSTR(SAAL_ESTABLISH_request), 41121326Sharti MKSTR(SAAL_ESTABLISH_indication), 42121326Sharti MKSTR(SAAL_ESTABLISH_confirm), 43121326Sharti MKSTR(SAAL_RELEASE_request), 44121326Sharti MKSTR(SAAL_RELEASE_confirm), 45121326Sharti MKSTR(SAAL_RELEASE_indication), 46121326Sharti MKSTR(SAAL_DATA_request), 47121326Sharti MKSTR(SAAL_DATA_indication), 48121326Sharti MKSTR(SAAL_UDATA_request), 49121326Sharti MKSTR(SAAL_UDATA_indication), 50121326Sharti}; 51121326Sharti 52121326Shartistatic const char *const sscf_states[] = { 53121326Sharti MKSTR(SSCF_RELEASED), 54121326Sharti MKSTR(SSCF_AWAITING_ESTABLISH), 55121326Sharti MKSTR(SSCF_AWAITING_RELEASE), 56121326Sharti MKSTR(SSCF_ESTABLISHED), 57121326Sharti MKSTR(SSCF_RESYNC), 58121326Sharti}; 59121326Sharti 60121326Sharti#define AA_SIG(S,G,M) \ 61121326Sharti ((S)->funcs->send_upper((S), (S)->aarg, (G), (M))) 62121326Sharti 63121326Sharti#define SSCOP_AASIG(S,G,M,P) \ 64121326Sharti ((S)->funcs->send_lower((S), (S)->aarg, (G), (M), (P))) 65121326Sharti 66121326ShartiMEMINIT(); 67121326Sharti 68121326Shartistatic void sscfu_unqueue(struct sscfu *sscf); 69121326Sharti 70121326Sharti/************************************************************/ 71121326Sharti/* 72121326Sharti * INSTANCE AND CLASS MANAGEMENT 73121326Sharti */ 74121326Sharti 75121326Sharti/* 76121326Sharti * Initialize SSCF. 77121326Sharti */ 78121326Shartistruct sscfu * 79121326Shartisscfu_create(void *a, const struct sscfu_funcs *funcs) 80121326Sharti{ 81121326Sharti struct sscfu *sscf; 82121326Sharti 83121326Sharti MEMZALLOC(sscf, struct sscfu *, sizeof(struct sscfu)); 84121326Sharti if (sscf == NULL) 85121326Sharti return (NULL); 86121326Sharti 87121326Sharti sscf->funcs = funcs; 88121326Sharti sscf->aarg = a; 89121326Sharti sscf->state = SSCFU_RELEASED; 90121326Sharti sscf->inhand = 0; 91121326Sharti SIGQ_INIT(&sscf->sigs); 92121326Sharti sscf->debug = 0; 93121326Sharti 94121326Sharti return (sscf); 95121326Sharti} 96121326Sharti 97121326Sharti/* 98121326Sharti * Reset the instance. Call only if you know, what you're doing. 99121326Sharti */ 100121326Shartivoid 101121326Shartisscfu_reset(struct sscfu *sscf) 102121326Sharti{ 103121326Sharti sscf->state = SSCFU_RELEASED; 104121326Sharti sscf->inhand = 0; 105121326Sharti SIGQ_CLEAR(&sscf->sigs); 106121326Sharti} 107121326Sharti 108121326Sharti/* 109121326Sharti * Destroy SSCF 110121326Sharti */ 111121326Shartivoid 112121326Shartisscfu_destroy(struct sscfu *sscf) 113121326Sharti{ 114121326Sharti SIGQ_CLEAR(&sscf->sigs); 115121326Sharti MEMFREE(sscf); 116121326Sharti} 117121326Sharti 118121326Shartienum sscfu_state 119121326Shartisscfu_getstate(const struct sscfu *sscf) 120121326Sharti{ 121121326Sharti return (sscf->state); 122121326Sharti} 123121326Sharti 124121326Shartiu_int 125121326Shartisscfu_getdefparam(struct sscop_param *p) 126121326Sharti{ 127121326Sharti memset(p, 0, sizeof(*p)); 128121326Sharti 129121326Sharti p->timer_cc = 1000; 130121326Sharti p->timer_poll = 750; 131121326Sharti p->timer_keep_alive = 2000; 132121326Sharti p->timer_no_response = 7000; 133121326Sharti p->timer_idle = 15000; 134121326Sharti p->maxk = 4096; 135121326Sharti p->maxj = 4096; 136121326Sharti p->maxcc = 4; 137121326Sharti p->maxpd = 25; 138121326Sharti 139121326Sharti return (SSCOP_SET_TCC | SSCOP_SET_TPOLL | SSCOP_SET_TKA | 140121326Sharti SSCOP_SET_TNR | SSCOP_SET_TIDLE | SSCOP_SET_MAXK | 141121326Sharti SSCOP_SET_MAXJ | SSCOP_SET_MAXCC | SSCOP_SET_MAXPD); 142121326Sharti} 143121326Sharti 144121326Sharticonst char * 145121326Shartisscfu_signame(enum saal_sig sig) 146121326Sharti{ 147121326Sharti static char str[40]; 148121326Sharti 149121326Sharti if (sig >= sizeof(sscf_sigs)/sizeof(sscf_sigs[0])) { 150121326Sharti sprintf(str, "BAD SAAL_SIGNAL %u", sig); 151121326Sharti return (str); 152121326Sharti } else { 153121326Sharti return (sscf_sigs[sig]); 154121326Sharti } 155121326Sharti} 156121326Sharti 157121326Sharticonst char * 158121326Shartisscfu_statename(enum sscfu_state s) 159121326Sharti{ 160121326Sharti static char str[40]; 161121326Sharti 162121326Sharti if (s >= sizeof(sscf_states)/sizeof(sscf_states[0])) { 163121326Sharti sprintf(str, "BAD SSCFU state %u", s); 164121326Sharti return (str); 165121326Sharti } else { 166121326Sharti return (sscf_states[s]); 167121326Sharti } 168121326Sharti} 169121326Sharti 170121326Sharti/************************************************************/ 171121326Sharti/* 172121326Sharti * EXTERNAL INPUT SIGNAL MAPPING 173121326Sharti */ 174121326Shartistatic __inline void 175121326Shartiset_state(struct sscfu *sscf, enum sscfu_state state) 176121326Sharti{ 177121326Sharti VERBOSE(sscf, SSCFU_DBG_STATE, (sscf, sscf->aarg, 178121326Sharti "change state from %s to %s", 179121326Sharti sscf_states[sscf->state], sscf_states[state])); 180121326Sharti sscf->state = state; 181121326Sharti} 182121326Sharti 183121326Sharti/* 184121326Sharti * signal from SSCOP to SSCF 185121326Sharti * Message must be freed by the user specified handler, if 186121326Sharti * it is passed. 187121326Sharti */ 188121326Shartivoid 189121326Shartisscfu_input(struct sscfu *sscf, enum sscop_aasig sig, 190121326Sharti struct SSCFU_MBUF_T *m, u_int arg __unused) 191121326Sharti{ 192121326Sharti sscf->inhand = 1; 193121326Sharti 194121326Sharti VERBOSE(sscf, SSCFU_DBG_LSIG, (sscf, sscf->aarg, 195121326Sharti "SSCF got signal %d. in state %s", sig, sscf_states[sscf->state])); 196121326Sharti 197121326Sharti switch (sig) { 198121326Sharti 199121326Sharti case SSCOP_RELEASE_indication: 200121326Sharti /* arg is: UU, SRC */ 201121326Sharti switch (sscf->state) { 202121326Sharti 203121326Sharti case SSCFU_RELEASED: 204121326Sharti if (m) 205121326Sharti MBUF_FREE(m); 206121326Sharti goto badsig; 207121326Sharti 208121326Sharti case SSCFU_AWAITING_ESTABLISH: 209121326Sharti set_state(sscf, SSCFU_RELEASED); 210121326Sharti AA_SIG(sscf, SAAL_RELEASE_indication, m); 211121326Sharti break; 212121326Sharti 213121326Sharti case SSCFU_AWAITING_RELEASE: 214121326Sharti if (m) 215121326Sharti MBUF_FREE(m); 216121326Sharti goto badsig; 217121326Sharti 218121326Sharti case SSCFU_ESTABLISHED: 219121326Sharti set_state(sscf, SSCFU_RELEASED); 220121326Sharti AA_SIG(sscf, SAAL_RELEASE_indication, m); 221121326Sharti break; 222121326Sharti 223121326Sharti case SSCFU_RESYNC: 224121326Sharti set_state(sscf, SSCFU_RELEASED); 225121326Sharti AA_SIG(sscf, SAAL_RELEASE_indication, m); 226121326Sharti break; 227121326Sharti } 228121326Sharti break; 229121326Sharti 230121326Sharti case SSCOP_ESTABLISH_indication: 231121326Sharti /* arg is: UU */ 232121326Sharti switch (sscf->state) { 233121326Sharti 234121326Sharti case SSCFU_RELEASED: 235121326Sharti set_state(sscf, SSCFU_ESTABLISHED); 236121326Sharti SSCOP_AASIG(sscf, SSCOP_ESTABLISH_response, NULL, 1); 237121326Sharti AA_SIG(sscf, SAAL_ESTABLISH_indication, m); 238121326Sharti break; 239121326Sharti 240121326Sharti case SSCFU_AWAITING_ESTABLISH: 241121326Sharti case SSCFU_AWAITING_RELEASE: 242121326Sharti case SSCFU_ESTABLISHED: 243121326Sharti case SSCFU_RESYNC: 244121326Sharti if (m) 245121326Sharti MBUF_FREE(m); 246121326Sharti goto badsig; 247121326Sharti } 248121326Sharti break; 249121326Sharti 250121326Sharti case SSCOP_ESTABLISH_confirm: 251121326Sharti /* arg is: UU */ 252121326Sharti switch (sscf->state) { 253121326Sharti 254121326Sharti case SSCFU_RELEASED: 255121326Sharti if (m) 256121326Sharti MBUF_FREE(m); 257121326Sharti goto badsig; 258121326Sharti 259121326Sharti case SSCFU_AWAITING_ESTABLISH: 260121326Sharti set_state(sscf, SSCFU_ESTABLISHED); 261121326Sharti AA_SIG(sscf, SAAL_ESTABLISH_confirm, m); 262121326Sharti break; 263121326Sharti 264121326Sharti case SSCFU_AWAITING_RELEASE: 265121326Sharti case SSCFU_ESTABLISHED: 266121326Sharti case SSCFU_RESYNC: 267121326Sharti if (m) 268121326Sharti MBUF_FREE(m); 269121326Sharti goto badsig; 270121326Sharti } 271121326Sharti break; 272121326Sharti 273121326Sharti case SSCOP_RELEASE_confirm: 274121326Sharti /* arg is: */ 275121326Sharti switch (sscf->state) { 276121326Sharti 277121326Sharti case SSCFU_RELEASED: 278121326Sharti case SSCFU_AWAITING_ESTABLISH: 279121326Sharti goto badsig; 280121326Sharti 281121326Sharti case SSCFU_AWAITING_RELEASE: 282121326Sharti set_state(sscf, SSCFU_RELEASED); 283121326Sharti AA_SIG(sscf, SAAL_RELEASE_confirm, NULL); 284121326Sharti break; 285121326Sharti 286121326Sharti case SSCFU_ESTABLISHED: 287121326Sharti case SSCFU_RESYNC: 288121326Sharti goto badsig; 289121326Sharti } 290121326Sharti break; 291121326Sharti 292121326Sharti case SSCOP_DATA_indication: 293121326Sharti /* arg is: MU */ 294121326Sharti sscf->funcs->window(sscf, sscf->aarg, 1); 295121326Sharti switch (sscf->state) { 296121326Sharti 297121326Sharti case SSCFU_RELEASED: 298121326Sharti case SSCFU_AWAITING_ESTABLISH: 299121326Sharti case SSCFU_AWAITING_RELEASE: 300121326Sharti MBUF_FREE(m); 301121326Sharti goto badsig; 302121326Sharti 303121326Sharti case SSCFU_ESTABLISHED: 304121326Sharti AA_SIG(sscf, SAAL_DATA_indication, m); 305121326Sharti break; 306121326Sharti 307121326Sharti case SSCFU_RESYNC: 308121326Sharti MBUF_FREE(m); 309121326Sharti goto badsig; 310121326Sharti } 311121326Sharti break; 312121326Sharti 313121326Sharti case SSCOP_RECOVER_indication: 314121326Sharti /* arg is: */ 315121326Sharti switch (sscf->state) { 316121326Sharti 317121326Sharti case SSCFU_RELEASED: 318121326Sharti case SSCFU_AWAITING_ESTABLISH: 319121326Sharti case SSCFU_AWAITING_RELEASE: 320121326Sharti goto badsig; 321121326Sharti 322121326Sharti case SSCFU_ESTABLISHED: 323121326Sharti SSCOP_AASIG(sscf, SSCOP_RECOVER_response, NULL, 0); 324121326Sharti AA_SIG(sscf, SAAL_ESTABLISH_indication, NULL); 325121326Sharti break; 326121326Sharti 327121326Sharti case SSCFU_RESYNC: 328121326Sharti goto badsig; 329121326Sharti } 330121326Sharti break; 331121326Sharti 332121326Sharti case SSCOP_RESYNC_indication: 333121326Sharti /* arg is: UU */ 334121326Sharti switch (sscf->state) { 335121326Sharti 336121326Sharti case SSCFU_RELEASED: 337121326Sharti case SSCFU_AWAITING_ESTABLISH: 338121326Sharti case SSCFU_AWAITING_RELEASE: 339121326Sharti if (m) 340121326Sharti MBUF_FREE(m); 341121326Sharti goto badsig; 342121326Sharti 343121326Sharti case SSCFU_ESTABLISHED: 344121326Sharti SSCOP_AASIG(sscf, SSCOP_RESYNC_response, NULL, 0); 345121326Sharti AA_SIG(sscf, SAAL_ESTABLISH_indication, m); 346121326Sharti break; 347121326Sharti 348121326Sharti case SSCFU_RESYNC: 349121326Sharti if (m) 350121326Sharti MBUF_FREE(m); 351121326Sharti goto badsig; 352121326Sharti } 353121326Sharti break; 354121326Sharti 355121326Sharti case SSCOP_RESYNC_confirm: 356121326Sharti /* arg is: */ 357121326Sharti switch (sscf->state) { 358121326Sharti 359121326Sharti case SSCFU_RELEASED: 360121326Sharti case SSCFU_AWAITING_ESTABLISH: 361121326Sharti case SSCFU_AWAITING_RELEASE: 362121326Sharti case SSCFU_ESTABLISHED: 363121326Sharti 364121326Sharti case SSCFU_RESYNC: 365121326Sharti set_state(sscf, SSCFU_ESTABLISHED); 366121326Sharti AA_SIG(sscf, SAAL_ESTABLISH_confirm, NULL); 367121326Sharti break; 368121326Sharti } 369121326Sharti break; 370121326Sharti 371121326Sharti case SSCOP_UDATA_indication: 372121326Sharti /* arg is: MD */ 373121326Sharti AA_SIG(sscf, SAAL_UDATA_indication, m); 374121326Sharti break; 375121326Sharti 376121326Sharti 377121326Sharti case SSCOP_RETRIEVE_indication: 378121326Sharti if (m) 379121326Sharti MBUF_FREE(m); 380121326Sharti goto badsig; 381121326Sharti 382121326Sharti case SSCOP_RETRIEVE_COMPL_indication: 383121326Sharti goto badsig; 384121326Sharti 385121326Sharti case SSCOP_ESTABLISH_request: 386121326Sharti case SSCOP_RELEASE_request: 387121326Sharti case SSCOP_ESTABLISH_response: 388121326Sharti case SSCOP_DATA_request: 389121326Sharti case SSCOP_RECOVER_response: 390121326Sharti case SSCOP_RESYNC_request: 391121326Sharti case SSCOP_RESYNC_response: 392121326Sharti case SSCOP_UDATA_request: 393121326Sharti case SSCOP_RETRIEVE_request: 394121326Sharti ASSERT(0); 395121326Sharti break; 396121326Sharti } 397121326Sharti 398121326Sharti sscfu_unqueue(sscf); 399121326Sharti return; 400121326Sharti 401121326Sharti badsig: 402121326Sharti VERBOSE(sscf, SSCFU_DBG_ERR, (sscf, sscf->aarg, 403121326Sharti "bad signal %d. in state %s", sig, sscf_states[sscf->state])); 404121326Sharti sscfu_unqueue(sscf); 405121326Sharti} 406121326Sharti 407121326Sharti 408121326Sharti/* 409121326Sharti * Handle signals from the user 410121326Sharti */ 411121326Shartistatic void 412121326Shartisscfu_dosig(struct sscfu *sscf, enum saal_sig sig, struct SSCFU_MBUF_T *m) 413121326Sharti{ 414121326Sharti VERBOSE(sscf, SSCFU_DBG_EXEC, (sscf, sscf->aarg, 415121326Sharti "executing signal %s(%s)", 416121326Sharti sscf_sigs[sig], sscf_states[sscf->state])); 417121326Sharti 418121326Sharti switch (sig) { 419121326Sharti 420121326Sharti case SAAL_ESTABLISH_request: 421121326Sharti /* arg is opt UU */ 422121326Sharti switch (sscf->state) { 423121326Sharti 424121326Sharti case SSCFU_RELEASED: 425121326Sharti set_state(sscf, SSCFU_AWAITING_ESTABLISH); 426121326Sharti SSCOP_AASIG(sscf, SSCOP_ESTABLISH_request, m, 1); 427121326Sharti break; 428121326Sharti 429121326Sharti case SSCFU_AWAITING_ESTABLISH: 430121326Sharti if (m) 431121326Sharti MBUF_FREE(m); 432121326Sharti goto badsig; 433121326Sharti 434121326Sharti case SSCFU_AWAITING_RELEASE: 435121326Sharti set_state(sscf, SSCFU_AWAITING_ESTABLISH); 436121326Sharti SSCOP_AASIG(sscf, SSCOP_ESTABLISH_request, m, 1); 437121326Sharti break; 438121326Sharti 439121326Sharti case SSCFU_ESTABLISHED: 440121326Sharti set_state(sscf, SSCFU_RESYNC); 441121326Sharti SSCOP_AASIG(sscf, SSCOP_RESYNC_request, m, 0); 442121326Sharti break; 443121326Sharti 444121326Sharti case SSCFU_RESYNC: 445121326Sharti if (m) 446121326Sharti MBUF_FREE(m); 447121326Sharti goto badsig; 448121326Sharti } 449121326Sharti break; 450121326Sharti 451121326Sharti case SAAL_RELEASE_request: 452121326Sharti /* arg is opt UU */ 453121326Sharti switch(sscf->state) { 454121326Sharti 455121326Sharti case SSCFU_RELEASED: 456121326Sharti if (m) 457121326Sharti MBUF_FREE(m); 458121326Sharti AA_SIG(sscf, SAAL_RELEASE_confirm, NULL); 459121326Sharti break; 460121326Sharti 461121326Sharti case SSCFU_AWAITING_ESTABLISH: 462121326Sharti set_state(sscf, SSCFU_AWAITING_RELEASE); 463121326Sharti SSCOP_AASIG(sscf, SSCOP_RELEASE_request, m, 0); 464121326Sharti break; 465121326Sharti 466121326Sharti case SSCFU_AWAITING_RELEASE: 467121326Sharti if (m) 468121326Sharti MBUF_FREE(m); 469121326Sharti goto badsig; 470121326Sharti 471121326Sharti case SSCFU_ESTABLISHED: 472121326Sharti set_state(sscf, SSCFU_AWAITING_RELEASE); 473121326Sharti SSCOP_AASIG(sscf, SSCOP_RELEASE_request, m, 0); 474121326Sharti break; 475121326Sharti 476121326Sharti case SSCFU_RESYNC: 477121326Sharti set_state(sscf, SSCFU_AWAITING_RELEASE); 478121326Sharti SSCOP_AASIG(sscf, SSCOP_RELEASE_request, m, 0); 479121326Sharti break; 480121326Sharti } 481121326Sharti break; 482121326Sharti 483121326Sharti case SAAL_DATA_request: 484121326Sharti /* arg is DATA */ 485121326Sharti switch (sscf->state) { 486121326Sharti 487121326Sharti case SSCFU_RELEASED: 488121326Sharti case SSCFU_AWAITING_ESTABLISH: 489121326Sharti case SSCFU_AWAITING_RELEASE: 490121326Sharti MBUF_FREE(m); 491121326Sharti goto badsig; 492121326Sharti 493121326Sharti case SSCFU_ESTABLISHED: 494121326Sharti SSCOP_AASIG(sscf, SSCOP_DATA_request, m, 0); 495121326Sharti break; 496121326Sharti 497121326Sharti case SSCFU_RESYNC: 498121326Sharti MBUF_FREE(m); 499121326Sharti goto badsig; 500121326Sharti } 501121326Sharti break; 502121326Sharti 503121326Sharti case SAAL_UDATA_request: 504121326Sharti /* arg is UDATA */ 505121326Sharti SSCOP_AASIG(sscf, SSCOP_UDATA_request, m, 0); 506121326Sharti break; 507121326Sharti 508121326Sharti case SAAL_ESTABLISH_indication: 509121326Sharti case SAAL_ESTABLISH_confirm: 510121326Sharti case SAAL_RELEASE_confirm: 511121326Sharti case SAAL_RELEASE_indication: 512121326Sharti case SAAL_DATA_indication: 513121326Sharti case SAAL_UDATA_indication: 514121326Sharti ASSERT(0); 515121326Sharti break; 516121326Sharti } 517121326Sharti return; 518121326Sharti 519121326Sharti badsig: 520121326Sharti VERBOSE(sscf, SSCFU_DBG_ERR, (sscf, sscf->aarg, 521121326Sharti "bad signal %s in state %s", sscf_sigs[sig], 522121326Sharti sscf_states[sscf->state])); 523121326Sharti} 524121326Sharti 525121326Sharti/* 526121326Sharti * Handle user signal. 527121326Sharti */ 528121326Shartiint 529121326Shartisscfu_saalsig(struct sscfu *sscf, enum saal_sig sig, struct SSCFU_MBUF_T *m) 530121326Sharti{ 531121326Sharti struct sscfu_sig *s; 532121326Sharti 533121326Sharti if (sscf->inhand) { 534121326Sharti VERBOSE(sscf, SSCFU_DBG_EXEC, (sscf, sscf->aarg, 535121326Sharti "queuing user signal %s(%s)", 536121326Sharti sscf_sigs[sig], sscf_states[sscf->state])); 537121326Sharti SIG_ALLOC(s); 538121326Sharti if (s == NULL) 539121326Sharti return (ENOMEM); 540121326Sharti s->sig = sig; 541121326Sharti s->m = m; 542121326Sharti SIGQ_APPEND(&sscf->sigs, s); 543121326Sharti return (0); 544121326Sharti } 545121326Sharti 546121326Sharti sscf->inhand = 1; 547121326Sharti sscfu_dosig(sscf, sig, m); 548121326Sharti sscfu_unqueue(sscf); 549121326Sharti return (0); 550121326Sharti} 551121326Sharti 552121326Sharti/* 553121326Sharti * Unqueue all qeueued signals. Must be called with inhand==1. 554121326Sharti */ 555121326Shartistatic void 556121326Shartisscfu_unqueue(struct sscfu *sscf) 557121326Sharti{ 558121326Sharti struct sscfu_sig *s; 559121326Sharti 560121326Sharti while ((s = SIGQ_GET(&sscf->sigs)) != NULL) { 561121326Sharti sscfu_dosig(sscf, s->sig, s->m); 562121326Sharti SIG_FREE(s); 563121326Sharti } 564121326Sharti sscf->inhand = 0; 565121326Sharti} 566121326Sharti 567121326Shartivoid 568121326Shartisscfu_setdebug(struct sscfu *sscf, u_int n) 569121326Sharti{ 570121326Sharti sscf->debug = n; 571121326Sharti} 572121326Sharti 573121326Shartiu_int 574121326Shartisscfu_getdebug(const struct sscfu *sscf) 575121326Sharti{ 576121326Sharti return (sscf->debug); 577121326Sharti} 578