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

📄 ndd.c

📁 pfil src. solaris, freebsd
💻 C
字号:
/* * Copyright (C) 2003 by Darren Reed. * * See the IPFILTER.LICENCE file for details on licencing. * * Copyright 2003 Sun Microsystems, Inc.  All rights reserved. * Use is subject to license terms. */#include <sys/types.h>#include <sys/cmn_err.h>#include <sys/stream.h>#include <sys/errno.h>#include <sys/socket.h>#include <net/if.h>#include <netinet/in.h>#include <netinet/in_systm.h>#include <netinet/ip.h>#include "compat.h"#include "qif.h"#include "pfil.h"caddr_t	pfil_nd;#if !defined(sun) || SOLARIS2 <= 8static int qif_report(queue_t *, mblk_t *, caddr_t);static int qif_ipmp_report(queue_t *, mblk_t *, caddr_t);static int qif_ipmp_set(queue_t *, mblk_t *, char *, caddr_t);static int pfil_hl_set(queue_t *, mblk_t *, char *, caddr_t);extern int pfil_report(queue_t *, mblk_t *, caddr_t);#elsestatic int qif_report(queue_t *, mblk_t *, caddr_t, cred_t *);static int qif_ipmp_report(queue_t *, mblk_t *, caddr_t, cred_t *);static int qif_ipmp_set(queue_t *, mblk_t *, char *, caddr_t , cred_t *);static int pfil_hl_set(queue_t *, mblk_t *, char *, caddr_t , cred_t *);extern int pfil_report(queue_t *, mblk_t *, caddr_t, cred_t *);#endif/* ------------------------------------------------------------------------ *//* Function:    pfil_nd_get                                                 *//* Returns:     int     - 0 == success                                      *//* Parameters:  q(I)    - pointer to queue                                  *//*              mp(I)   - pointer to mblk                                   *//*              ptr(I)  - pointer to value to retrieve                      *//*              cred(I) - pointer to credential information                 *//*                                                                          *//* Given a pointer "ptr" to some data to return, copy it into the mblk that *//* has been provided.                                                       *//* ------------------------------------------------------------------------ */#if !defined(sun) || SOLARIS2 <= 8/*ARGSUSED*/int pfil_nd_get(queue_t *q, mblk_t *mp, caddr_t ptr)#else/*ARGSUSED*/int pfil_nd_get(queue_t *q, mblk_t *mp, caddr_t ptr, cred_t *cred)#endif{	int *ip;	/* LINTED: E_CONSTANT_CONDITION */	PRINT(2,(CE_CONT, "pfil_nd_get(0x%lx,0x%lx,0x%lx)\n",		 (u_long)q, (u_long)mp, (u_long)ptr));	ip = (int *)ptr;	(void) mi_mpprintf(mp, "%d", *ip);	return 0;}/* ------------------------------------------------------------------------ *//* Function:    pfil_nd_set                                                 *//* Returns:     int     - 0 == success, > 0 error occurred                  *//* Parameters:  q(I)    - pointer to queue                                  *//*              mp(I)   - pointer to mblk                                   *//*              str(I)  - pointer to new value as a string                  *//*              ptr(I)  - pointer to value to be stored                     *//*              cred(I) - pointer to credential information                 *//*                                                                          *//* Given a pointer "ptr" to a location to store the new value represented   *//* by the string "str", check to see if we allow setting that variable and  *//* if the new value is within the definable ranges understood for it.       *//* ------------------------------------------------------------------------ */#if !defined(sun) || SOLARIS2 <= 8/*ARGSUSED*/int pfil_nd_set(queue_t *q, mblk_t *mp, char *str, caddr_t ptr)#else/*ARGSUSED*/int pfil_nd_set(queue_t *q, mblk_t *mp, char *str, caddr_t ptr, cred_t *cred)#endif{	char *end;	int i;	/* LINTED: E_CONSTANT_CONDITION */	PRINT(2, (CE_CONT, "pfil_nd_set(0x%lx,0x%lx,%s[0x%lx],0x%lx)\n",		  (u_long)q, (u_long)mp, str, (u_long)str, (u_long)ptr));	i =  mi_strtol(str, &end, 10);	if (ptr == (caddr_t)&pfildebug) {#ifdef	PFILDEBUG		if ((end == str) || (i < 0) || (i > 100))#endif			return EINVAL;	} else if (ptr == (caddr_t)&qif_verbose) {		if ((end == str) || (i < 0) || (i > 1))			return EINVAL;	}	*((int *)ptr) = i;	return 0;}/* ------------------------------------------------------------------------ *//* Function:    pfil_ioctl_nd                                               *//* Returns:     int - B_TRUE == success, B_FALSE == getset error            *//* Parameters:  q(I)    - pointer to queue                                  *//*              mp(I)   - pointer to mblk                                   *//*                                                                          *//* Handle both incoming ndd set and get requests but only if they're not    *//* destined for another STREAMS module (ie. there is no next queue for this *//* message.)                                                                *//* ------------------------------------------------------------------------ */int pfil_ioctl_nd(queue_t *q, mblk_t *mp){	return (nd_getset(q, pfil_nd, mp));}/* ------------------------------------------------------------------------ *//* Function:    pfil_nd_init                                                *//* Returns:     int   - 0 == success, -1 == error                           *//* Parameters:  None.                                                       *//*                                                                          *//* Perform any initialisation required for processing ndd ioctl messages.   *//* ------------------------------------------------------------------------ */int pfil_nd_init(){#ifdef PFILDEBUG	if (!nd_load(&pfil_nd, "pfildebug", pfil_nd_get, pfil_nd_set,		      (caddr_t)&pfildebug)) {		nd_free(&pfil_nd);		return -1;	}#endif	if (!nd_load(&pfil_nd, "pfil_delayed_copy", pfil_nd_get, pfil_nd_set,		     (caddr_t)&pfil_delayed_copy)) {		nd_free(&pfil_nd);		return -1;	}	if (!nd_load(&pfil_nd, "pfil_interface", pfil_nd_get, NULL,		     (caddr_t)&pfilinterface)) {		nd_free(&pfil_nd);		return -1;	}	if (!nd_load(&pfil_nd, "qif_status", qif_report, NULL, NULL)) {		nd_free(&pfil_nd);		return -1;	}	if (!nd_load(&pfil_nd, "qif_ipmp_status", qif_ipmp_report, NULL,		     NULL)) {		nd_free(&pfil_nd);		return -1;	}	if (!nd_load(&pfil_nd, "qif_ipmp_set", NULL, qif_ipmp_set, NULL)) {		nd_free(&pfil_nd);		return -1;	}	if (!nd_load(&pfil_nd, "qif_verbose", pfil_nd_get, pfil_nd_set,		     (caddr_t)&qif_verbose)) {		nd_free(&pfil_nd);		return -1;	}	if (!nd_load(&pfil_nd, "pfil_inet4", pfil_report, NULL,		     (void *)&pfh_inet4)) {		nd_free(&pfil_nd);		return -1;	}	if (!nd_load(&pfil_nd, "pfil_inet6", pfil_report, NULL,		     (void *)&pfh_inet6)) {		nd_free(&pfil_nd);		return -1;	}	if (!nd_load(&pfil_nd, "pfil_sync", pfil_report, NULL,		     (void *)&pfh_sync)) {		nd_free(&pfil_nd);		return -1;	}	if (!nd_load(&pfil_nd, "pfil_hl", NULL, pfil_hl_set, NULL)) {		nd_free(&pfil_nd);		return -1;	}	return 0;}/* ------------------------------------------------------------------------ *//* Function:    pfil_nd_fini                                                *//* Returns:     void                                                        *//* Parameters:  None.                                                       *//*                                                                          *//* Clean up any data structures related to ndd processing in preparation    *//* for the module being unloaded.                                           *//* ------------------------------------------------------------------------ */void pfil_nd_fini(){	nd_free(&pfil_nd);}/* ------------------------------------------------------------------------ *//* Function:    qif_report                                                  *//* Returns:     int                                                         *//* Parameters:  q(I)    - pointer to queue                                  *//*              mp(I)   - pointer to mblk                                   *//*              ptr(I)  - pointer to value to retrieve                      *//*              cred(I) - pointer to credential information                 *//*                                                                          *//* Fills the mblk with any qif data that happens to be currently available. *//* ------------------------------------------------------------------------ */#if !defined(sun) || SOLARIS2 <= 8/*ARGSUSED*/static int qif_report(queue_t *q, mblk_t *mp, caddr_t arg)#else/*ARGSUSED*/static int qif_report(queue_t *q, mblk_t *mp, caddr_t arg, cred_t *cred)#endif{	qif_t *qif;	(void) mi_mpprintf(mp,		   "ifname ill q OTHERQ ipmp num sap hl nr nw bad copy copyfail drop notip nodata notdata");	READ_ENTER(&pfil_rw);	for (qif = qif_head ; qif; qif = qif->qf_next)		(void) mi_mpprintf(mp,			"%s 0x%lx 0x%lx 0x%lx 0x%lx %d %x %d %lu %lu %lu %lu %lu %lu %lu %lu %lu",				   qif->qf_name, (u_long)qif->qf_ill,				   (u_long)qif->qf_q, (u_long)qif->qf_oq,				   (u_long)qif->qf_ipmp, qif->qf_num,				   qif->qf_sap, (int)qif->qf_hl,				   qif->qf_nr, qif->qf_nw, qif->qf_bad,				   qif->qf_copy, qif->qf_copyfail,				   qif->qf_drop, qif->qf_notip,				   qif->qf_nodata, qif->qf_notdata);	RW_EXIT(&pfil_rw);	return 0;}/* ------------------------------------------------------------------------ *//* Function:    qif_ipmp_report                                             *//* Returns:     int                                                         *//* Parameters:  q(I)    - pointer to queue                                  *//*              mp(I)   - pointer to mblk                                   *//*              ptr(I)  - pointer to value to retrieve                      *//*              cred(I) - pointer to credential information                 *//*                                                                          *//* Fills the mblk with any qif data that happens to be currently available. *//* ------------------------------------------------------------------------ */#if !defined(sun) || SOLARIS2 <= 8/*ARGSUSED*/static int qif_ipmp_report(queue_t *q, mblk_t *mp, caddr_t arg)#else/*ARGSUSED*/static int qif_ipmp_report(queue_t *q, mblk_t *mp, caddr_t arg, cred_t *cred)#endif{	qif_t *qif;	(void) mi_mpprintf(mp, "ifname members");	READ_ENTER(&pfil_rw);	for (qif = qif_head ; qif; qif = qif->qf_next) {		if ((qif->qf_flags & QF_IPMP) == 0)			continue;		(void) mi_mpprintf(mp, "%s %s", qif->qf_name, qif->qf_members);	}	RW_EXIT(&pfil_rw);	return 0;}/* ------------------------------------------------------------------------ *//* Function:    qif_ipmp_set                                                *//* Returns:     int     - 0 == success, > 0 error occurred                  *//* Parameters:  q(I)    - pointer to queue                                  *//*              mp(I)   - pointer to mblk                                   *//*              str(I)  - pointer to new value as a string                  *//*              ptr(I)  - pointer to value to be stored                     *//*              cred(I) - pointer to credential information                 *//*                                                                          *//* This function is a wrapper for qif_ipmp_update(), providing a run-time   *//* interactive way to configure the IPMP configuration for pfil without     *//* needing to load/unload the module to reread the config file (or is there *//* a way to do that once loaded, anyway?)                                   *//* ------------------------------------------------------------------------ */#if !defined(sun) || SOLARIS2 <= 8/*ARGSUSED*/static int qif_ipmp_set(queue_t *q, mblk_t *mp, char *str, caddr_t ptr)#else/*ARGSUSED*/static int qif_ipmp_set(queue_t *q, mblk_t *mp, char *str, caddr_t ptr,			cred_t *cred)#endif{	char *s, *t;	/* LINTED: E_CONSTANT_CONDITION */	PRINT(2, (CE_CONT, "qif_ipmp_set(0x%lx,0x%lx,0x%lx[%s],0x%lx)\n",		  (u_long)q, (u_long)mp, str, (u_long)str, (u_long)ptr));	t = NULL;	s = str;	do {		if (t != NULL)			s = t + 1;		t = strchr(s, ';');		if (t != NULL)			*t = '\0';		qif_ipmp_update(s);	} while (t != NULL);	return 0;}/* ------------------------------------------------------------------------ *//* Function:    pfil_hl_set                                                 *//* Returns:     int     - 0 == success, > 0 error occurred                  *//* Parameters:  q(I)    - pointer to queue                                  *//*              mp(I)   - pointer to mblk                                   *//*              str(I)  - pointer to new value as a string                  *//*              ptr(I)  - pointer to value to be stored                     *//*              cred(I) - pointer to credential information                 *//*                                                                          *//* Explicitly set the header length (hl) field of the qif structure.  This  *//* is used in situations where pfil cannot, for some reason, automatically  *//* determine it via either ioctl snooping or looking at passing messages.   *//* ndd -set /dev/pfil pfil_hl ipmp0=14  or v4:ipmp0=14                      *//* ------------------------------------------------------------------------ */#if !defined(sun) || SOLARIS2 <= 8/*ARGSUSED*/static int pfil_hl_set(queue_t *q, mblk_t *mp, char *str, caddr_t ptr)#else/*ARGSUSED*/static int pfil_hl_set(queue_t *q, mblk_t *mp, char *str, caddr_t ptr,			cred_t *cred)#endif{	char *s, *t;	/* LINTED: E_CONSTANT_CONDITION */	PRINT(2, (CE_CONT, "pfil_hl_set(0x%lx,0x%lx,0x%lx[%s],0x%lx)\n",		  (u_long)q, (u_long)mp, str, (u_long)str, (u_long)ptr));	t = NULL;	s = str;	do {		if (t != NULL)			s = t + 1;		t = strchr(s, ';');		if (t != NULL)			*t = '\0';		qif_hl_set(s);	} while (t != NULL);	return 0;}

⌨️ 快捷键说明

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