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

📄 extension.c

📁 linux下traceroute的实现
💻 C
字号:
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include "traceroute.h"struct icmp_ext_header {#if __BYTE_ORDER == __BIG_ENDIAN	unsigned int version:4;	unsigned int reserved:4;#else	unsigned int reserved:4;	unsigned int version:4;#endif	u_int8_t reserved1;	u_int16_t checksum;} __attribute__ ((packed));struct icmp_ext_object {	u_int16_t length;	u_int8_t class;	u_int8_t c_type;	u_int8_t data[0];};#define MPLS_CLASS 1#define MPLS_C_TYPE 1static int try_extension (probe *pb, char *buf, size_t len) {	struct icmp_ext_header *iext = (struct icmp_ext_header *) buf;	char str[1024];	char *curr = str;	char *end = str + sizeof (str) / sizeof (*str);		/*  a check for len >= 8 already done for all cases   */	if (iext->version != 2)  return -1;	if (iext->checksum &&	    in_csum (iext, len) != (u_int16_t) ~0	)  return -1;	buf += sizeof (*iext);	len -= sizeof (*iext);	while (len >= sizeof (struct icmp_ext_object)) {	    struct icmp_ext_object *obj = (struct icmp_ext_object *) buf;	    size_t objlen = ntohs (obj->length);	    size_t data_len;	    u_int32_t *ui = (u_int32_t *) obj->data;	    int i, n;	    if (objlen < sizeof (*obj) ||		objlen > len	    )  return -1;	    data_len = objlen - sizeof (*obj);	    if (data_len % sizeof (u_int32_t))		    return -1;	/*  must be 32bit rounded...  */	    n = data_len / sizeof (*ui);	    if (curr > (char *) str && curr < end)		    *curr++ = ';';	/*  a separator   */	    if (obj->class == MPLS_CLASS &&		obj->c_type == MPLS_C_TYPE &&		n >= 1	    ) {    /*  people prefer MPLS to be parsed...  */		curr += snprintf (curr, end - curr, "MPLS:");		for (i = 0; i < n; i++, ui++) {		    u_int32_t mpls = ntohl (*ui);		    curr += snprintf (curr, end - curr, "%sL=%u,E=%u,S=%u,T=%u",					i ? "/" : "",					mpls >> 12,					(mpls >> 9) & 0x7,					(mpls >> 8) & 0x1,					mpls & 0xff);		}	    }	    else {	/*  common case...  */		curr += snprintf (curr, end - curr, "%u/%u:",						obj->class, obj->c_type);		for (i = 0; i < n && curr < end; i++, ui++)		    curr += snprintf (curr, end - curr, "%s%08x",						i ? "," : "", ntohl (*ui));	    }	    buf += objlen;	    len -= objlen;	}	if (len)  return -1;	pb->ext = strdup (str);	return 0;}void handle_extensions (probe *pb, char *buf, int len, int step) {	if (!step)	    try_extension (pb, buf, len);	else {	    for ( ; len >= 8; buf += step, len -= step)		if (try_extension (pb, buf, len) == 0)			break;	}	return;}

⌨️ 快捷键说明

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