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

📄 debug.c

📁 ATM 网 络 协 议 实 现 源 代 码
💻 C
字号:
/* debug.c - Simple debugging "switch" *//* Written 1998-2000 by Werner Almesberger, EPFL DI-ICA */#if HAVE_CONFIG_H#include <config.h>#endif#include <stdlib.h>#include <atm.h>#include <atmd.h>#include "uni.h"#include "../fab.h"#define COMPONENT "FAB(debug)"#define PRV(call) ((FAB *) (call)->fab)typedef struct _fab {    CALL *next; /* relay.c may not keep track of calls, but WE are */} FAB;static CALL *calls;void fab_option(const char *name,const char *value){    diag(COMPONENT,DIAG_FATAL,"unrecognized fabric option \"%s\"",name);}void fab_start(void (*port_notify)(int number,int up)){    sig_start_all(port_notify);}void fab_init(CALL *call){    PRV(call) = alloc_t(FAB);    PRV(call)->next = calls;    calls = call;}void fab_destroy(CALL *call){    CALL **walk;    for (walk = &calls; *walk; walk = &PRV(*walk)->next)	if (*walk == call) break;    if (!*walk)	diag(COMPONENT,DIAG_FATAL,"fab_destroy: call %p not found",call);    *walk = PRV(call)->next;    free(PRV(call));    PRV(call) = NULL;}/* * This function is rather simple-minded, because it only considers a single * port. Should go directly to the fabric control. @@@ */static int vci_exists(int vci,int threshold){    CALL *call;    int found;    found = 0;    for (call = calls; call; call = PRV(call)->next)	if (call->in.pvc.sap_addr.vci == vci ||	  call->out.pvc.sap_addr.vci == vci)	    if (++found > threshold) return 1;    return 0;}static int check_ci(struct sockaddr_atmpvc *pvc){    int vci;    if (pvc->sap_addr.vpi == ATM_VPI_ANY) pvc->sap_addr.vpi = 0;	/* that was easy :-) */    for (vci = ATM_NOT_RSV_VCI; pvc->sap_addr.vci == ATM_VCI_ANY; vci++)	if (!vci_exists(vci,0)) pvc->sap_addr.vci = vci;    return !vci_exists(vci,1);}void fab_op(CALL *call,int op,const struct atm_qos *qos,  void (*callback)(CALL *call,int cause,void *more,void *user),void *user){    diag(COMPONENT,DIAG_INFO,"fab_op%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",      !op ? " FREE" : "",op & RM_RSV(_RM_ANY) ? " RM_RSV:" : "",      op & RM_IN_TX ? " IN_TX" : "",op & RM_IN_RX ? " IN_RX" : "",      op & RM_OUT_TX ? " OUT_TX" : "",op & RM_OUT_RX ? " OUT_RX" : "",      op & RM_PATH_TX ? " PATH_TX" : "",op & RM_PATH_RX ? " PATH_RX" : "",      op & RM_CLAIM(_RM_ANY) ? " RM_CLAIM:" : "",      op & _RM_SHIFT(RM_IN_TX) ? " IN_TX" : "",      op & _RM_SHIFT(RM_IN_RX) ? " IN_RX" : "",      op & _RM_SHIFT(RM_OUT_TX) ? " OUT_TX" : "",      op & _RM_SHIFT(RM_OUT_RX) ? " OUT_RX" : "",      op & _RM_SHIFT(RM_PATH_TX) ? " PATH_TX" : "",      op & _RM_SHIFT(RM_PATH_RX) ? " PATH_RX" : "");    if (op & (RM_RSV(RM_IN) | RM_CLAIM(RM_IN)))	if (!check_ci(&call->in.pvc)) {	    callback(call,ATM_CV_CI_UNAVAIL,NULL,user);	    return;	}    if (op & (RM_RSV(RM_OUT) | RM_CLAIM(RM_OUT)))	if (!check_ci(&call->out.pvc)) {	    callback(call,ATM_CV_CI_UNAVAIL,NULL,user);	    return;	}    callback(call,0,NULL,user);}

⌨️ 快捷键说明

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