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

📄 icmp.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include <u.h>#include <libc.h>#include <ip.h>#include "dat.h"#include "protos.h"typedef struct Hdr	Hdr;struct Hdr{	uchar	type;	uchar	code;	uchar	cksum[2];	/* Checksum */	uchar	data[1];};enum{	ICMPLEN=	4,};enum{	Ot,	/* type */	Op,	/* next protocol */};static Field p_fields[] = {	{"t",		Fnum,	Ot,	"type",	} ,	{0}};enum{	EchoRep=	0,	Unreachable=	3,	SrcQuench=	4,	Redirect=	5,	EchoReq=	8,	TimeExceed=	11,	ParamProb=	12,	TSreq=		13,	TSrep=		14,	InfoReq=	15,	InfoRep=	16,};static Mux p_mux[] ={	{"ip",	Unreachable, },	{"ip",	SrcQuench, },	{"ip",	Redirect, },	{"ip",	TimeExceed, },	{"ip",	ParamProb, },	{0},};char *icmpmsg[256] ={[EchoRep]	"EchoRep",[Unreachable]	"Unreachable",[SrcQuench]	"SrcQuench",[Redirect]	"Redirect",[EchoReq]	"EchoReq",[TimeExceed]	"TimeExceed",[ParamProb]	"ParamProb",[TSreq]		"TSreq",[TSrep]		"TSrep",[InfoReq]	"InfoReq",[InfoRep]	"InfoRep",};static voidp_compile(Filter *f){	if(f->op == '='){		compile_cmp(icmp.name, f, p_fields);		return;	}	if(strcmp(f->s, "ip") == 0){		f->pr = p_mux->pr;		f->subop = Op;		return;	}	sysfatal("unknown icmp field or protocol: %s", f->s);}static intp_filter(Filter *f, Msg *m){	Hdr *h;	if(m->pe - m->ps < ICMPLEN)		return 0;	h = (Hdr*)m->ps;	m->ps += ICMPLEN;	switch(f->subop){	case Ot:		if(h->type == f->ulv)			return 1;		break;	case Op:		switch(h->type){		case Unreachable:		case TimeExceed:		case SrcQuench:		case Redirect:		case ParamProb:			m->ps += 4;			return 1;		}	}	return 0;}static intp_seprint(Msg *m){	Hdr *h;	char *tn;	char *p = m->p;	char *e = m->e;	ushort cksum2, cksum;	h = (Hdr*)m->ps;	m->ps += ICMPLEN;	m->pr = &dump;	if(m->pe - m->ps < ICMPLEN)		return -1;	tn = icmpmsg[h->type];	if(tn == nil)		p = seprint(p, e, "t=%ud c=%d ck=%4.4ux", h->type,			h->code, (ushort)NetS(h->cksum));	else		p = seprint(p, e, "t=%s c=%d ck=%4.4ux", tn,			h->code, (ushort)NetS(h->cksum));	if(Cflag){		cksum = NetS(h->cksum);		h->cksum[0] = 0;		h->cksum[1] = 0;		cksum2 = ~ptclbsum((uchar*)h, m->pe - m->ps + ICMPLEN) & 0xffff;		if(cksum != cksum2)			p = seprint(p,e, " !ck=%4.4ux", cksum2);	}	switch(h->type){	case EchoRep:	case EchoReq:		m->ps += 4;		p = seprint(p, e, " id=%ux seq=%ux",			NetS(h->data), NetS(h->data+2));		break;	case TSreq:	case TSrep:		m->ps += 12;		p = seprint(p, e, " orig=%ud rcv=%ux xmt=%ux",			NetL(h->data), NetL(h->data+4),			NetL(h->data+8));		m->pr = nil;		break;	case InfoReq:	case InfoRep:		break;	case Unreachable:	case TimeExceed:	case SrcQuench:		m->ps += 4;		m->pr = &ip;		break;	case Redirect:		m->ps += 4;		m->pr = &ip;		p = seprint(p, e, "gw=%V", h->data);		break;	case ParamProb:		m->ps += 4;		m->pr = &ip;		p = seprint(p, e, "ptr=%2.2ux", h->data[0]);		break;	}	m->p = p;	return 0;}Proto icmp ={	"icmp",	p_compile,	p_filter,	p_seprint,	p_mux,	"%lud",	p_fields,	defaultframer,};

⌨️ 快捷键说明

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