📄 pfilstream.c
字号:
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 + -