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

📄 diag.c

📁 mobile ipv6协议Linux实现源代码
💻 C
字号:
/* *	Diagnostics functions * *	Authors: *	Antti Tuominen          <ajtuomin@tml.hut.fi> * *	$Id: s.diag.c 1.7 03/04/08 11:05:15+03:00 anttit@jon.mipl.mediapoli.com $ * *	This program is free software; you can redistribute it and/or *	modify it under the terms of the GNU General Public License *	as published by the Free Software Foundation; either version *	2 of the License, or (at your option) any later version. * */#include <stdlib.h>#include <stdio.h>#include <errno.h>#include <string.h>#include "diag.h"#include "mip6.h"bc_t *get_bc(void){	FILE *bcache;	bc_t *bc, *e;	int n = 1, ret = 0;	bcache = fopen("/proc/net/mip6_bcache", "r");	if (bcache == NULL)		return NULL;	bc = malloc(sizeof(bc_t));	memset(bc, 0, sizeof(bc_t));	e = bc;	while (!feof(bcache)) {		long int callback_time = 0;		int type = 0;		struct in6_addr ha, coa;		ret = fscanf(bcache, "%8x%8x%8x%8x %8x%8x%8x%8x %ld %d\n",		       &ha.s6_addr32[0], &ha.s6_addr32[1],		       &ha.s6_addr32[2], &ha.s6_addr32[3],		       &coa.s6_addr32[0], &coa.s6_addr32[1],		       &coa.s6_addr32[2], &coa.s6_addr32[3],		       &callback_time, &type);		if (ret == 0) {			fclose(bcache);			return NULL;		}		if (ret < 0)			continue;		e->homeaddr.s6_addr32[0] = htonl(ha.s6_addr32[0]);		e->homeaddr.s6_addr32[1] = htonl(ha.s6_addr32[1]);		e->homeaddr.s6_addr32[2] = htonl(ha.s6_addr32[2]);		e->homeaddr.s6_addr32[3] = htonl(ha.s6_addr32[3]);		e->careofaddr.s6_addr32[0] = htonl(coa.s6_addr32[0]);		e->careofaddr.s6_addr32[1] = htonl(coa.s6_addr32[1]);		e->careofaddr.s6_addr32[2] = htonl(coa.s6_addr32[2]);		e->careofaddr.s6_addr32[3] = htonl(coa.s6_addr32[3]);		e->expires = callback_time;		e->type = type;		bc = realloc(bc, ++n * sizeof(bc_t));		e = bc + (n - 1);		memset(e, 0, sizeof(bc_t));	}	fclose(bcache);	return bc;}void free_bc(bc_t *bc){	if (bc == NULL) return;	free(bc);}bu_t *get_bu(void){	FILE *bulist;	bu_t *bul, *e;	int n = 1, ret = 0;	bulist = fopen("/proc/net/mip6_bul", "r");	if (bulist == NULL)		return NULL;	bul = malloc(sizeof(bu_t));	memset(bul, 0, sizeof(bu_t));	e = bul;	while (!feof(bulist)) {		int seq = 0, sta = 0, del = 0, mdl = 0;		long int exp = 0, cbs = 0;		struct in6_addr cna, ha, coa;		ret = fscanf(bulist, "%8x%8x%8x%8x %8x%8x%8x%8x %8x%8x%8x%8x\n%ld %d %d %d %d %ld\n",			     &cna.s6_addr32[0], &cna.s6_addr32[1],			     &cna.s6_addr32[2], &cna.s6_addr32[3],			     &ha.s6_addr32[0], &ha.s6_addr32[1],			     &ha.s6_addr32[2], &ha.s6_addr32[3],			     &coa.s6_addr32[0], &coa.s6_addr32[1],			     &coa.s6_addr32[2], &coa.s6_addr32[3],			     &exp, &seq, &sta, &del, &mdl, &cbs);		if (ret == 0) {			fclose(bulist);			return NULL;		}		if (ret < 0)			continue;		e->rcptaddr.s6_addr32[0] = htonl(cna.s6_addr32[0]);		e->rcptaddr.s6_addr32[1] = htonl(cna.s6_addr32[1]);		e->rcptaddr.s6_addr32[2] = htonl(cna.s6_addr32[2]);		e->rcptaddr.s6_addr32[3] = htonl(cna.s6_addr32[3]);		e->homeaddr.s6_addr32[0] = htonl(ha.s6_addr32[0]);		e->homeaddr.s6_addr32[1] = htonl(ha.s6_addr32[1]);		e->homeaddr.s6_addr32[2] = htonl(ha.s6_addr32[2]);		e->homeaddr.s6_addr32[3] = htonl(ha.s6_addr32[3]);		e->careofaddr.s6_addr32[0] = htonl(coa.s6_addr32[0]);		e->careofaddr.s6_addr32[1] = htonl(coa.s6_addr32[1]);		e->careofaddr.s6_addr32[2] = htonl(coa.s6_addr32[2]);		e->careofaddr.s6_addr32[3] = htonl(coa.s6_addr32[3]);		e->expires = exp;		e->seq = seq;		e->state = sta;		e->delay = del;		e->maxdelay = mdl;		e->cb_time = cbs;		bul = realloc(bul, ++n * sizeof(bu_t));		e = bul + (n - 1);		memset(e, 0, sizeof(bu_t));	}	fclose(bulist);	return bul;}void free_bu(bu_t *bu){	if (bu == NULL) return;	free(bu);}stat_t *get_stat(void){	stat_t *stat, *e;	FILE *stats;	int n = 1, ret = 0;	stats = fopen("/proc/net/mip6_stat", "r");	if (stats == NULL)		return NULL;	stat = malloc(sizeof(stat_t));	if (stat == NULL)		return NULL;	memset(stat, 0, sizeof(stat_t));	e = stat;	while (!feof(stats)) {		ret = fscanf(stats, "%s = %lu\n", e->name, &e->value);		if (ret == 0) {			fclose(stats);			return NULL;		}		if (ret < 0)			continue;		stat = realloc(stat, ++n * sizeof(stat_t));		if (stat == NULL)			return NULL;		e = stat + (n - 1);		memset(e, 0, sizeof(stat_t));	}	fclose(stats);	return stat;}void free_stat(stat_t *stat){	if (stat == NULL) return;	free(stat);}ha_t *get_ha(void){	FILE *hal;	ha_t *ha, *e;	int n = 1, ret = 0;	hal = fopen("/proc/net/mip6_home_agents", "r");	if (hal == NULL)		return NULL;	ha = malloc(sizeof(ha_t));	memset(ha, 0, sizeof(ha_t));	e = ha;	while (!feof(hal)) {		struct in6_addr gl, ll;		ret = fscanf(hal, "%d %8x%8x%8x%8x %8x%8x%8x%8x %d %ld\n",		       &e->ifindex, 		       &gl.s6_addr32[0], &gl.s6_addr32[1], 		       &gl.s6_addr32[2], &gl.s6_addr32[3],		       &ll.s6_addr32[0], &ll.s6_addr32[1], 		       &ll.s6_addr32[2], &ll.s6_addr32[3],		       &e->preference, &e->expire);		if (ret == 0) {			fclose(hal);			return NULL;		}		if (ret < 0)			continue;		e->global_addr.s6_addr32[0] = htonl(gl.s6_addr32[0]);		e->global_addr.s6_addr32[1] = htonl(gl.s6_addr32[1]);		e->global_addr.s6_addr32[2] = htonl(gl.s6_addr32[2]);		e->global_addr.s6_addr32[3] = htonl(gl.s6_addr32[3]);		e->link_local_addr.s6_addr32[0] = htonl(ll.s6_addr32[0]);		e->link_local_addr.s6_addr32[1] = htonl(ll.s6_addr32[1]);		e->link_local_addr.s6_addr32[2] = htonl(ll.s6_addr32[2]);		e->link_local_addr.s6_addr32[3] = htonl(ll.s6_addr32[3]);		ha = realloc(ha, ++n * sizeof(ha_t));		e = ha + (n - 1);		memset(e, 0, sizeof(ha_t));	}	fclose(hal);	return ha;}void free_ha(ha_t *ha){	if (ha == NULL) return;	free(ha);}struct mn_info_ext *get_mninfo(void){	FILE *mns;	struct mn_info_ext *mn, *e;	int n = 1, ret = 0;	mns = fopen("/proc/net/mip6_mninfo", "r");	if (mns == NULL)		return NULL;	mn = malloc(sizeof(*mn));	if (mn == NULL)		return NULL;	memset(mn, 0, sizeof(*mn));	e = mn;	while (!feof(mns)) {		struct in6_addr h, ha;		int p, ho, r;		ret = fscanf(mns, "%d %8x%8x%8x%8x %x %8x%8x%8x%8x %d %d\n",			     &e->ifindex,			     &h.s6_addr32[0], &h.s6_addr32[1], 			     &h.s6_addr32[2], &h.s6_addr32[3], &p,			     &ha.s6_addr32[0], &ha.s6_addr32[1], 			     &ha.s6_addr32[2], &ha.s6_addr32[3],			     &ho, &r);		if (ret == 0) {			fclose(mns);			return NULL;		}		if (ret < 0)			continue;		e->home_plen = p;		e->is_at_home = ho;		e->has_home_reg = r;		e->home_addr.s6_addr32[0] = htonl(h.s6_addr32[0]);		e->home_addr.s6_addr32[1] = htonl(h.s6_addr32[1]);		e->home_addr.s6_addr32[2] = htonl(h.s6_addr32[2]);		e->home_addr.s6_addr32[3] = htonl(h.s6_addr32[3]);		e->ha.s6_addr32[0] = htonl(ha.s6_addr32[0]);		e->ha.s6_addr32[1] = htonl(ha.s6_addr32[1]);		e->ha.s6_addr32[2] = htonl(ha.s6_addr32[2]);		e->ha.s6_addr32[3] = htonl(ha.s6_addr32[3]);		mn = realloc(mn, ++n * sizeof(struct mn_info_ext));		e = mn + (n - 1);		memset(e, 0, sizeof(struct mn_info_ext));	}	fclose(mns);	return mn;}void free_mninfo(struct mn_info_ext *mn){	if (mn == NULL) return;	free(mn);}struct ma_if_info *get_iface(void){	FILE *ifs;	struct ma_if_info *iface, *e;	int flag_r = 0, flag_c = 0;	int n = 1, ret = 0;	ifs = fopen("/proc/net/mip6_iface", "r");	if (ifs == NULL)		return NULL;	iface = malloc(sizeof(struct ma_if_info));	if (iface == NULL)		return NULL;	memset(iface, 0, sizeof(struct ma_if_info));	e = iface;		while (!feof(ifs)) {		ret = fscanf(ifs, "%02d %010d %1d %1d\n", &e->interface_id,			     &e->preference, &flag_r, &flag_c);		e->status |= flag_r ? MA_IFACE_HAS_ROUTER : 0;		e->status |= flag_c ? MA_IFACE_CURRENT : 0;		if (ret == 0) {			fclose(ifs);			return NULL;		}		if (ret < 0)			continue;		iface = realloc(iface, ++n * sizeof(struct ma_if_info));		if (iface == NULL)			return NULL;		e = iface + (n - 1);		memset(e, 0, sizeof(struct ma_if_info));	}	fclose(ifs);	return iface;}void free_iface(struct ma_if_info *iface){	if (iface == NULL) return;	free(iface);}int dump_ha(void (*format)(ha_t *entry)){	ha_t *hal, *e;	hal = get_ha();	if (hal == NULL)		return -ENOENT;	e = hal;	while (e->ifindex > 0) {		format(e++);	}	free_ha(hal);	hal = e = NULL;	return 0;}int dump_bc(void (*format)(bc_t *entry)){	bc_t *bcache, *e;	bcache = get_bc();	if (bcache == NULL)		return -ENOENT;	e = bcache;	while (!IN6_IS_ADDR_UNSPECIFIED(&e->homeaddr)) {		format(e++);	}	free_bc(bcache);	bcache = e = NULL;	return 0;}int dump_bu(void (*format)(bu_t *entry)){	bu_t *bul, *e;	bul = get_bu();	if (bul == NULL) 		return -ENOENT;	e = bul;	while (!IN6_IS_ADDR_UNSPECIFIED(&e->rcptaddr)) {		format(e++);	}	free_bu(bul);	bul = e = NULL;	return 0;}int dump_mninfo(void (*format)(struct mn_info_ext *entry)){	struct mn_info_ext *mn, *e;	mn = get_mninfo();	if (mn == NULL)		return -ENOENT;	e = mn;	while (!IN6_IS_ADDR_UNSPECIFIED(&e->home_addr)) {		format(e++);	}	free_mninfo(mn);	mn = e = NULL;	return 0;}int dump_stat(void (*format)(stat_t *entry)){	stat_t *stats, *e;	stats = get_stat();	if (stats == NULL) 		return -ENOENT;	e = stats;	while (strlen(e->name) > 0) {		format(e++);	}	free_stat(stats);	stats = e = NULL;	return 0;}int dump_iface(void (*format)(struct ma_if_info *entry)){	struct ma_if_info *ifaces, *e;	ifaces = get_iface();	if (ifaces == NULL)		return -ENOENT;	e = ifaces;	while (e->interface_id > 0) {		format(e++);	}	free_iface(ifaces);	ifaces = e = NULL;	return 0;}

⌨️ 快捷键说明

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