Home | History | Annotate | Download | only in sppp
      1 /*
      2  * s_common.c - common utilities for Solaris PPP
      3  *
      4  * Copyright (c) 2000 by Sun Microsystems, Inc.
      5  * All rights reserved.
      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 
     19 #pragma ident	"%Z%%M%	%I%	%E% SMI"
     20 #define	RCSID	"$Id: s_common.c,v 1.0 2000/05/08 01:10:12 masputra Exp $"
     21 
     22 #include <sys/types.h>
     23 #include <sys/debug.h>
     24 #include <sys/param.h>
     25 #include <sys/stat.h>
     26 #include <sys/stream.h>
     27 #include <sys/stropts.h>
     28 #include <sys/errno.h>
     29 #include <sys/ioccom.h>
     30 #include <sys/cmn_err.h>
     31 #include <sys/ddi.h>
     32 #include <sys/sunddi.h>
     33 #include <sys/strsun.h>
     34 #include <net/ppp_defs.h>
     35 #include <net/pppio.h>
     36 #include "s_common.h"
     37 
     38 /*
     39  * putctl4()
     40  *
     41  * Description:
     42  *    Create and send a 4-byte message.
     43  */
     44 int
     45 putctl4(queue_t *q, uchar_t type, uchar_t code, uint16_t val)
     46 {
     47 	mblk_t	*mp;
     48 
     49 	if ((mp = allocb(4, BPRI_HI)) == NULL) {
     50 		return (0);
     51 	}
     52 	MTYPE(mp) = type;
     53 	mp->b_wptr[0] = code;
     54 	((uint16_t *)mp->b_wptr)[1] = val;
     55 	mp->b_wptr += 4;
     56 
     57 	putnext(q, mp);
     58 	return (1);
     59 }
     60 
     61 /*
     62  * putctl8()
     63  *
     64  * Description:
     65  *    Create and send a 8-byte message.
     66  */
     67 int
     68 putctl8(queue_t *q, uchar_t type, uchar_t code, uint32_t val)
     69 {
     70 	mblk_t	*mp;
     71 
     72 	if ((mp = allocb(8, BPRI_HI)) == NULL) {
     73 		return (0);
     74 	}
     75 	MTYPE(mp) = type;
     76 	mp->b_wptr[0] = code;
     77 	((uint32_t *)mp->b_wptr)[1] = val;
     78 	mp->b_wptr += 8;
     79 
     80 	putnext(q, mp);
     81 	return (1);
     82 }
     83 
     84 /*
     85  * msg_byte()
     86  *
     87  * Description:
     88  *    Helper routine to return a specific byte off a data buffer.
     89  */
     90 int
     91 msg_byte(mblk_t *mp, unsigned int i)
     92 {
     93 	while (mp != NULL) {
     94 		if (i < MBLKL(mp)) {
     95 			break;
     96 		}
     97 		i -= MBLKL(mp);
     98 		mp = mp->b_cont;
     99 	}
    100 	if (mp == NULL) {
    101 		return (-1);
    102 	}
    103 	return (mp->b_rptr[i]);
    104 }
    105 
    106 /*
    107  * sppp_create_lsmsg()
    108  *
    109  * Description:
    110  *    Create a PPP link status message.
    111  */
    112 mblk_t *
    113 create_lsmsg(enum LSstat ls_type)
    114 {
    115 	mblk_t		*mp;
    116 	struct ppp_ls	*plt;
    117 
    118 	if ((mp = allocb(sizeof (*plt), BPRI_HI)) == NULL) {
    119 		return (NULL);
    120 	}
    121 	/*
    122 	 * Make sure that this message is a control message, and contains
    123 	 * a notification that the link has been terminated.
    124 	 */
    125 	MTYPE(mp) = M_PROTO;
    126 	mp->b_wptr += sizeof (*plt);
    127 	plt = (struct ppp_ls *)mp->b_rptr;
    128 	plt->magic = PPPLSMAGIC;
    129 	plt->ppp_message = ls_type;
    130 
    131 	return (mp);
    132 }
    133