⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pfilstream.c

📁 pfil src. solaris, freebsd
💻 C
📖 第 1 页 / 共 2 页
字号:
			miocnak(q, mp, 0, EINVAL);		}		return;		break;#endif	default :		break;	}	putnext(q, mp);	return;}/************************************************************************ * STREAMS device functions *//* ------------------------------------------------------------------------ *//* Function:    pfilwput                                                    *//* Returns:     void                                                        *//* Parameters:  q(I)  - pointer to queue                                    *//*              mp(I) - pointer to STREAMS message                          *//*                                                                          *//* This is only called for interaction with pfil itself, as the driver      *//* /dev/pfil, not the STREAMS module pushed on another queue.  As it does   *//* not do any IO, this should never be called except to handle ioctl's and  *//* so all other messages are free'd and no reply sent back.                 *//* The only ioctls handled by the driver are ND_GET/ND_SET.                 *//*                                                                          *//* NOTE: HP-UX does not need or have pfil implemented as a STREAMS device.  *//* ------------------------------------------------------------------------ */#ifdef sunvoid pfilwput(queue_t *q, mblk_t *mp){	struct iocblk *iocp;# ifdef PFILDEBUG	/* LINTED: E_CONSTANT_CONDITION */	PRINT(9,(CE_CONT, "!pfilwput(0x%lx,0x%lx) [%s] qif 0x%lx\n",		 (u_long)q, (u_long)mp, QTONM(q), (u_long)q->q_ptr));# endif	switch (MTYPE(mp))	{	case M_IOCTL:		iocp = (struct iocblk *)mp->b_rptr;		switch (iocp->ioc_cmd)		{		case ND_SET :		case ND_GET :			if (pfil_ioctl_nd(q, mp)) {				if (iocp->ioc_error)					iocp->ioc_count = 0;				mp->b_datap->db_type = M_IOCACK;				qreply(q, mp);			} else {				miocnak(q, mp, 0, EINVAL);			}			break;		default :			miocnak(q, mp, 0, EINVAL);			break;		}		return;	default :		break;	}	freemsg(mp);}#endif/************************************************************************ * STREAMS module functions *//* ------------------------------------------------------------------------ *//* Function:    pfilmodwput                                                 *//* Returns:     void                                                        *//* Parameters:  q(I)  - pointer to queue                                    *//*              mp(I) - pointer to STREAMS message                          *//*                                                                          *//* This function is called as part of the STREAMS module message processing *//* for messages going down to the device drivers.                           *//* ------------------------------------------------------------------------ */void pfilmodwput(queue_t *q, mblk_t *mp){	union DL_primitives *dl;	qif_t *qif;	qif = q->q_ptr;	/* LINTED: E_CONSTANT_CONDITION */	PRINT(9,(CE_CONT,		 "!pfilmodwput(0x%lx,0x%lx) T:%d [%s,%s] qif 0x%lx 0x%lx\n",		 (u_long)q, (u_long)mp, MTYPE(mp), QTONM(q), QTONM(OTHERQ(q)),		 (u_long)qif, (u_long)qif->qf_ill));	switch (MTYPE(mp))	{	case M_PROTO :	case M_PCPROTO :		dl = (union DL_primitives *)mp->b_rptr;		/* LINTED: E_CONSTANT_CONDITION */		PRINT(7,(CE_CONT,			 "!pfilmodwput: 0x%lx dl_primitive:%d qif 0x%lx\n",			 (u_long)mp, dl->dl_primitive, (u_long)qif));		if ((MLEN(mp) < sizeof(dl_unitdata_req_t)) ||		    (dl->dl_primitive != DL_UNITDATA_REQ)) {			break;		}		/*FALLTHROUGH*/	case M_DATA :		atomic_add_long(&qif->qf_nw, 1);		if (qif->qf_ill != NULL) {			int i;			i = pfil_precheck(q, &mp, PFIL_OUT, qif);			/* LINTED: E_CONSTANT_CONDITION */			PRINT(9, (CE_CONT, "!%s: pfil_precheck=%d mp 0x%lx\n",				  "pfilmodwput", i, (u_long)mp));			if (mp == NULL)				return;			else if (i > 0) {				freemsg(mp);				return;			}		}		break;	case M_IOCTL:		pfilwput_ioctl(q, mp);		return;	default :		break;	}	putnext(q, mp);	return;}/* ------------------------------------------------------------------------ *//* Function:    pfilmodrput                                                 *//* Returns:     void                                                        *//* Parameters:  q(I)  - pointer to queue                                    *//*              mp(I) - pointer to STREAMS message                          *//*                                                                          *//* This function is called as part of the STREAMS module message processing *//* for messages going up to the protocol stack.                             *//* ------------------------------------------------------------------------ */void pfilmodrput(queue_t *q, mblk_t *mp){	union DL_primitives *dl;	dl_bind_ack_t *b;	int i, flags;	qif_t *qif;	flags = 0;	qif = q->q_ptr;	/* LINTED: E_CONSTANT_CONDITION */	PRINT(9,(CE_CONT,		 "!pfilmodrput(0x%lx,0x%lx) T:%d [%s,%s] qif 0x%lx 0x%lx\n",		 (u_long)q, (u_long)mp, mp->b_datap->db_type, QTONM(q),		 QTONM(OTHERQ(q)), (u_long)qif, (u_long)qif->qf_ill));	switch (MTYPE(mp))	{#ifdef	DL_IOC_HDR_INFO	case M_IOCACK :	{		struct iocblk *iocp = (struct iocblk *)mp->b_rptr;		if (iocp->ioc_cmd == DL_IOC_HDR_INFO) {			WRITE_ENTER(&pfil_rw);			qif_update(qif, mp);			RW_EXIT(&pfil_rw);		}		/*FALLTHROUGH*/	}#endif	/* DL_IOC_HDR_INFO */#ifdef	PFILDEBUG	case M_IOCNAK :	case M_IOCTL :		pfil_printioctl(mp);#endif		break;	case M_PROTO :	case M_PCPROTO :		dl = (union DL_primitives *)mp->b_rptr;		/* LINTED: E_CONSTANT_CONDITION */		PRINT(7,(CE_CONT, "!mp:0x%lx pfilmodrput:dl_primitive:%d\n",			 (u_long)mp, dl->dl_primitive));		switch (dl->dl_primitive)		{		case DL_UNITDATA_IND :			if ((MLEN(mp) >= sizeof(dl_unitdata_ind_t)) &&			    (dl->unitdata_ind.dl_group_address))				flags |= PFIL_GROUP;			break;		case DL_SUBS_BIND_ACK :			if (qif->qf_waitack > 0) { 				dl_subs_bind_ack_t *c;				c = (dl_subs_bind_ack_t *)dl;				if (qif->qf_sap == 0) {#if 0					qif->qf_sap = c->dl_sap;					if (qif->qf_sap < 0)						qif->qf_sap = -qif->qf_sap;#else					cmn_err(CE_NOTE, "c:off %u len %u",						c->dl_subs_sap_offset,						c->dl_subs_sap_length);#endif				}				(void) pfilbind(q);				if (qif->qf_waitack > 0)					qif->qf_waitack--;			}			break;		case DL_BIND_ACK :			b = (dl_bind_ack_t *)dl;			if (qif->qf_sap == 0) {				qif->qf_sap = b->dl_sap;				if (qif->qf_sap < 0)					qif->qf_sap = -qif->qf_sap;			}			if (b->dl_sap == IEEESAP_SNAP) {				qif->qf_waitack++;				break;			}			if (!b->dl_sap || b->dl_sap == IP_DL_SAP)				(void) pfilbind(q);			break;		default :			break;		}		if ((MLEN(mp) < sizeof(dl_unitdata_ind_t)) ||		    (dl->dl_primitive != DL_UNITDATA_IND))			break;		/*FALLTHROUGH*/	case M_DATA :		atomic_add_long(&qif->qf_nr, 1);		if (qif->qf_ill != NULL) {			flags |= PFIL_IN;			i = pfil_precheck(q, &mp, flags, qif);			/* LINTED: E_CONSTANT_CONDITION */			PRINT(9, (CE_CONT,				  "!pfilmodrput: mp 0x%lx pfil_precheck=%d\n",				  (u_long)mp, i));			if (mp == NULL)				return;			else if (i > 0) {				freemsg(mp);				return;			}		}		break;	default :		break;	}	putnext(q, mp);}/* ------------------------------------------------------------------------ *//* Function:    pfil_drv_priv                                               *//* Returns:     int   - 0 == success, EPERM for error.                      *//* Parameters:  cr(I) - pointer to credential information                   *//*                                                                          *//* Checks to see if the caller has enough credentials.                      *//* ------------------------------------------------------------------------ */static int pfil_drv_priv(cred_t *cr){#if SOLARIS2 >= 10	return (secpolicy_net_config(cr, B_TRUE));#else# ifdef sun	return (suser(cr) ? 0 : EPERM);# else	return (suser() ? 0 : EPERM);# endif#endif}/************************************************************************ * kernel module initialization *//* ------------------------------------------------------------------------ *//* Function:    pfil_startup                                                *//* Returns:     void                                                        *//* Parameters:  None.                                                       *//*                                                                          *//* Initialise pfil data strutures.                                          *//* ------------------------------------------------------------------------ */void pfil_startup(){	pfil_init(&pfh_inet4);	pfil_init(&pfh_inet6);	pfil_init(&pfh_sync);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -