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

📄 pcap-dlpi.c

📁 该软件根据网络数据生成NetFlow记录。NetFlow可用于网络规划、负载均衡、安全监控等
💻 C
📖 第 1 页 / 共 2 页
字号:
	*/	ss = snaplen;#ifdef HAVE_SOLARIS	release = get_release(&osmajor, &osminor, &osmicro);	if (osmajor == 5 && (osminor <= 2 || (osminor == 3 && osmicro < 2)) &&	    getenv("BUFMOD_FIXED") == NULL) {		fprintf(stderr,		"WARNING: bufmod is broken in SunOS %s; ignoring snaplen.\n",		    release);		ss = 0;	}#endif	if (ss > 0 &&	    strioctl(p->fd, SBIOCSSNAP, sizeof(ss), (char *)&ss) != 0) {		sprintf(ebuf, "SBIOCSSNAP: %s", pcap_strerror(errno));		goto bad;	}	/*	** Set up the bufmod flags	*/	if (strioctl(p->fd, SBIOCGFLAGS, sizeof(flag), (char *)&flag) < 0) {		sprintf(ebuf, "SBIOCGFLAGS: %s", pcap_strerror(errno));		goto bad;	}	flag |= SB_NO_DROPS;	if (strioctl(p->fd, SBIOCSFLAGS, sizeof(flag), (char *)&flag) != 0) {		sprintf(ebuf, "SBIOCSFLAGS: %s", pcap_strerror(errno));		goto bad;	}	/*	** Set up the bufmod timeout	*/	if (to_ms != 0) {		struct timeval to;		to.tv_sec = to_ms / 1000;		to.tv_usec = (to_ms * 1000) % 1000000;		if (strioctl(p->fd, SBIOCSTIME, sizeof(to), (char *)&to) != 0) {			sprintf(ebuf, "SBIOCSTIME: %s", pcap_strerror(errno));			goto bad;		}	}#endif	/*	** As the last operation flush the read side.	*/	if (ioctl(p->fd, I_FLUSH, FLUSHR) != 0) {		sprintf(ebuf, "FLUSHR: %s", pcap_strerror(errno));		goto bad;	}	/* Allocate data buffer */	p->bufsize = MAXDLBUF * sizeof(bpf_u_int32);	p->buffer = (u_char *)malloc(p->bufsize + p->offset);	return (p);bad:	free(p);	return (NULL);}intpcap_setfilter(pcap_t *p, struct bpf_program *fp){	p->fcode = *fp;	return (0);}static intsend_request(int fd, char *ptr, int len, char *what, char *ebuf){	struct	strbuf	ctl;	int	flags;	ctl.maxlen = 0;	ctl.len = len;	ctl.buf = ptr;	flags = 0;	if (putmsg(fd, &ctl, (struct strbuf *) NULL, flags) < 0) {		sprintf(ebuf, "send_request: putmsg \"%s\": %s",		    what, pcap_strerror(errno));		return (-1);	}	return (0);}static intrecv_ack(int fd, int size, const char *what, char *bufp, char *ebuf){	union	DL_primitives	*dlp;	struct	strbuf	ctl;	int	flags;	ctl.maxlen = MAXDLBUF;	ctl.len = 0;	ctl.buf = bufp;	flags = 0;	if (getmsg(fd, &ctl, (struct strbuf*)NULL, &flags) < 0) {		sprintf(ebuf, "recv_ack: %s getmsg: %s",		    what, pcap_strerror(errno));		return (-1);	}	dlp = (union DL_primitives *) ctl.buf;	switch (dlp->dl_primitive) {	case DL_INFO_ACK:	case DL_BIND_ACK:	case DL_OK_ACK:#ifdef DL_HP_PPA_ACK	case DL_HP_PPA_ACK:#endif		/* These are OK */		break;	case DL_ERROR_ACK:		switch (dlp->error_ack.dl_errno) {		case DL_BADPPA:			sprintf(ebuf, "recv_ack: %s bad ppa (device unit)",			    what);			break;		case DL_SYSERR:			sprintf(ebuf, "recv_ack: %s: %s",			    what, pcap_strerror(dlp->error_ack.dl_unix_errno));			break;		case DL_UNSUPPORTED:			sprintf(ebuf,			    "recv_ack: %s: Service not supplied by provider",			    what);			break;		default:			sprintf(ebuf, "recv_ack: %s error 0x%x",			    what, (bpf_u_int32)dlp->error_ack.dl_errno);			break;		}		return (-1);	default:		sprintf(ebuf, "recv_ack: %s unexpected primitive ack 0x%x ",		    what, (bpf_u_int32)dlp->dl_primitive);		return (-1);	}	if (ctl.len < size) {		sprintf(ebuf, "recv_ack: %s ack too small (%d < %d)",		    what, ctl.len, size);		return (-1);	}	return (ctl.len);}static intdlattachreq(int fd, bpf_u_int32 ppa, char *ebuf){	dl_attach_req_t	req;	req.dl_primitive = DL_ATTACH_REQ;	req.dl_ppa = ppa;	return (send_request(fd, (char *)&req, sizeof(req), "attach", ebuf));}static intdlbindreq(int fd, bpf_u_int32 sap, char *ebuf){	dl_bind_req_t	req;	memset((char *)&req, 0, sizeof(req));	req.dl_primitive = DL_BIND_REQ;#ifdef DL_HP_RAWDLS	req.dl_max_conind = 1;			/* XXX magic number */	/* 22 is INSAP as per the HP-UX DLPI Programmer's Guide */	req.dl_sap = 22;	req.dl_service_mode = DL_HP_RAWDLS;#else	req.dl_sap = sap;#ifdef DL_CLDLS	req.dl_service_mode = DL_CLDLS;#endif#endif	return (send_request(fd, (char *)&req, sizeof(req), "bind", ebuf));}static intdlbindack(int fd, char *bufp, char *ebuf){	return (recv_ack(fd, DL_BIND_ACK_SIZE, "bind", bufp, ebuf));}static intdlpromisconreq(int fd, bpf_u_int32 level, char *ebuf){	dl_promiscon_req_t req;	req.dl_primitive = DL_PROMISCON_REQ;	req.dl_level = level;	return (send_request(fd, (char *)&req, sizeof(req), "promiscon", ebuf));}static intdlokack(int fd, const char *what, char *bufp, char *ebuf){	return (recv_ack(fd, DL_OK_ACK_SIZE, what, bufp, ebuf));}static intdlinforeq(int fd, char *ebuf){	dl_info_req_t req;	req.dl_primitive = DL_INFO_REQ;	return (send_request(fd, (char *)&req, sizeof(req), "info", ebuf));}static intdlinfoack(int fd, char *bufp, char *ebuf){	return (recv_ack(fd, DL_INFO_ACK_SIZE, "info", bufp, ebuf));}#ifdef HAVE_SYS_BUFMOD_Hstatic intstrioctl(int fd, int cmd, int len, char *dp){	struct strioctl str;	int rc;	str.ic_cmd = cmd;	str.ic_timout = -1;	str.ic_len = len;	str.ic_dp = dp;	rc = ioctl(fd, I_STR, &str);	if (rc < 0)		return (rc);	else		return (str.ic_len);}#endif#if defined(HAVE_SOLARIS) && defined(HAVE_SYS_BUFMOD_H)static char *get_release(bpf_u_int32 *majorp, bpf_u_int32 *minorp, bpf_u_int32 *microp){	char *cp;	static char buf[32];	*majorp = 0;	*minorp = 0;	*microp = 0;	if (sysinfo(SI_RELEASE, buf, sizeof(buf)) < 0)		return ("?");	cp = buf;	if (!isdigit(*cp))		return (buf);	*majorp = strtol(cp, &cp, 10);	if (*cp++ != '.')		return (buf);	*minorp =  strtol(cp, &cp, 10);	if (*cp++ != '.')		return (buf);	*microp =  strtol(cp, &cp, 10);	return (buf);}#endif#ifdef DL_HP_PPA_ACK_OBS/* * Under HP-UX 10, we can ask for the ppa *//* Determine ppa number that specifies ifname */static intget_dlpi_ppa(register int fd, register const char *device, register int unit,    register char *ebuf){	register dl_hp_ppa_ack_t *ap;	register dl_hp_ppa_info_t *ip;	register int i;	register u_long majdev;	dl_hp_ppa_req_t	req;	struct stat statbuf;	bpf_u_int32 buf[MAXDLBUF];	if (stat(device, &statbuf) < 0) {		sprintf(ebuf, "stat: %s: %s", device, pcap_strerror(errno));		return (-1);	}	majdev = major(statbuf.st_rdev);	memset((char *)&req, 0, sizeof(req));	req.dl_primitive = DL_HP_PPA_REQ;	memset((char *)buf, 0, sizeof(buf));	if (send_request(fd, (char *)&req, sizeof(req), "hpppa", ebuf) < 0 ||	    recv_ack(fd, DL_HP_PPA_ACK_SIZE, "hpppa", (char *)buf, ebuf) < 0)		return (-1);	ap = (dl_hp_ppa_ack_t *)buf;	ip = (dl_hp_ppa_info_t *)((u_char *)ap + ap->dl_offset);        for(i = 0; i < ap->dl_count; i++) {                if (ip->dl_mjr_num == majdev && ip->dl_instance_num == unit)                        break;                ip = (dl_hp_ppa_info_t *)((u_char *)ip + ip->dl_next_offset);        }        if (i == ap->dl_count) {                sprintf(ebuf, "can't find PPA for %s", device);		return (-1);        }        if (ip->dl_hdw_state == HDW_DEAD) {                sprintf(ebuf, "%s: hardware state: DOWN\n", device);		return (-1);        }        return ((int)ip->dl_ppa);}#endif#ifdef HAVE_HPUX9/* * Under HP-UX 9, there is no good way to determine the ppa. * So punt and read it from /dev/kmem. */static struct nlist nl[] = {#define NL_IFNET 0	{ "ifnet" },	{ "" }};static char path_vmunix[] = "/hp-ux";/* Determine ppa number that specifies ifname */static intget_dlpi_ppa(register int fd, register const char *ifname, register int unit,    register char *ebuf){	register const char *cp;	register int kd;	void *addr;	struct ifnet ifnet;	char if_name[sizeof(ifnet.if_name)], tifname[32];	cp = strrchr(ifname, '/');	if (cp != NULL)		ifname = cp + 1;	if (nlist(path_vmunix, &nl) < 0) {		sprintf(ebuf, "nlist %s failed", path_vmunix);		return (-1);	}	if (nl[NL_IFNET].n_value == 0) {		sprintf(ebuf, "could't find %s kernel symbol",		    nl[NL_IFNET].n_name);		return (-1);	}	kd = open("/dev/kmem", O_RDONLY);	if (kd < 0) {		sprintf(ebuf, "kmem open: %s", pcap_strerror(errno));		return (-1);	}	if (dlpi_kread(kd, nl[NL_IFNET].n_value,	    &addr, sizeof(addr), ebuf) < 0) {		close(kd);		return (-1);	}	for (; addr != NULL; addr = ifnet.if_next) {		if (dlpi_kread(kd, (off_t)addr,		    &ifnet, sizeof(ifnet), ebuf) < 0 ||		    dlpi_kread(kd, (off_t)ifnet.if_name,		    if_name, sizeof(if_name), ebuf) < 0) {			(void)close(kd);			return (-1);		}		sprintf(tifname, "%.*s%d",		    (int)sizeof(if_name), if_name, ifnet.if_unit);		if (strcmp(tifname, ifname) == 0)			return (ifnet.if_index);	}	sprintf(ebuf, "Can't find %s", ifname);	return (-1);}static intdlpi_kread(register int fd, register off_t addr,    register void *buf, register u_int len, register char *ebuf){	register int cc;	if (lseek(fd, addr, SEEK_SET) < 0) {		sprintf(ebuf, "lseek: %s", pcap_strerror(errno));		return (-1);	}	cc = read(fd, buf, len);	if (cc < 0) {		sprintf(ebuf, "read: %s", pcap_strerror(errno));		return (-1);	} else if (cc != len) {		sprintf(ebuf, "short read (%d != %d)", cc, len);		return (-1);	}	return (cc);}#endif

⌨️ 快捷键说明

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