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

📄 snap_interp.c

📁 一个学习SNMP项目:tmoerlan.
💻 C
📖 第 1 页 / 共 5 页
字号:
    /* integer arithmetic operators */    case MOD: INTOP(int,%,"MOD");    case MODI: INTIMMOP(int,%,"MODI");    case XOR: INTOP(int,^,"XOR");    case XORI: INTIMMOP(int,^,"XORI");    case NOT: {      value_t *top = p->sp - 1;      int result;      DYNCHECK(top >= p->stack_min);      DYNCHECK_TAG(*top,INTV);      result = !(GET_INT(*top));      d_printf(10,"%s:%d: pc=%d: NOT: %d -> %d\n",__FILE__,__LINE__,	       (p->pc - p->code_min),GET_INT(*top),result);      SET_TAG(*top,INTV);      SET_INT(*top,result);      p->pc++;      break;    }    case LNOT: {      value_t *top = p->sp - 1;      int result;      DYNCHECK(top >= p->stack_min);      DYNCHECK_TAG(*top,INTV);      result = ~(GET_INT(*top));      d_printf(10,"%s:%d: pc=%d: LNOT: 0x%x -> 0x%x\n",__FILE__,__LINE__,	       (p->pc - p->code_min),GET_INT(*top),result);      SET_TAG(*top,INTV);      SET_INT(*top,result);      p->pc++;      break;    }    case AND: INTOP(int,&,"AND");    case ANDI: INTIMMOP(int,&,"ANDI");    case OR: INTOP(int,|,"OR");    case ORI: INTIMMOP(int,|,"ORI");    case LSHL: INTOP(int,<<,"LSHL");    case LSHLI: INTIMMOP(int,<<,"LSHLI");    case RSHL: INTOP(uint32,>>,"RSHL");    case RSHLI: INTIMMOP(uint32,>>,"RSHLI");    case RSHA: INTOP(int,>>,"RSHA");    case RSHAI: INTIMMOP(int,>>,"RSHAI");    case SNET: {      value_t *top1 = p->sp - 1;      value_t *top2 = p->sp - 2;      uint32 result, a1, a2;      d_printf(100,"%s:%d: interp: SNET\n",__FILE__,__LINE__);      ENSURE_HEAP_ROOM(p,iph);      top1 = p->sp - 1;      top2 = p->sp - 2;      DYNCHECK(top2 >= p->stack_min);      DYNCHECK_TAG(*top1,ADDRV);      DYNCHECK_TAG(*top2,ADDRV);      GET_ADDR(a1,p->heap_min,*top1);      GET_ADDR(a2,p->heap_min,*top2);      result = a1 & a2;      d_printf(10,"%s:%d: pc=%d: SNET %d.%d.%d.%d %d.%d.%d.%d = %d.%d.%d.%d\n",	       __FILE__,__LINE__,(p->pc - p->code_min),	       NIPQUAD(GET_ADDR_VAL(p->heap_min,*top1)),	       NIPQUAD(GET_ADDR_VAL(p->heap_min,*top2)),	       NIPQUAD(result));      SET_TAG(*top2,ADDRV);      SET_ADDR(*top2,result,p);      p->sp--;      p->pc++;      break;    }    case SNETI: {      value_t *top = p->sp - 1;      uint32 a1, a2, result;      ENSURE_HEAP_ROOM(p,iph);      top = p->sp - 1;      DYNCHECK(top >= p->stack_min);      DYNCHECK_TAG(*top,ADDRV);#ifndef ADDR_IN_HEAP      DYNCHECK_TAG(p->pc->arg,ADDRV);	  GET_ADDR(a1      GET_ADDR(a2,p->heap_min,p->pc->arg);#else      { 	value_t v = ZERO_VALUE_T;	COPY_LIT(v,ADDRV,*p->pc);	GET_ADDR(a2,p->heap_min,v);      }#endif      GET_ADDR(a1,p->heap_min,*top);      result = a1 & a2;      d_printf(10,"%s:%d: pc=%d: SNETI [%d.%d.%d.%d] %d.%d.%d.%d = %d.%d.%d.%d\n",	       __FILE__,__LINE__,(p->pc - p->code_min),	       NIPQUAD(a1),	       NIPQUAD(a2),	       NIPQUAD(result));      SET_TAG(*top,ADDRV);      SET_ADDR(*top,result,p);      p->pc++;      break;    }    case BCAST: {      value_t *top1 = p->sp - 1;      value_t *top2 = p->sp - 2;      uint32 a1, a2, result;      d_printf(100,"%s:%d: interp: BCAST\n",__FILE__,__LINE__);      ENSURE_HEAP_ROOM(p,iph);      top1 = p->sp - 1;      top2 = p->sp - 2;      DYNCHECK(top2 >= p->stack_min);      DYNCHECK_TAG(*top1,ADDRV);      DYNCHECK_TAG(*top2,ADDRV);      GET_ADDR(a1,p->heap_min,*top1);      GET_ADDR(a2,p->heap_min,*top2);      result = a1 | ~a2;      d_printf(10,"%s:%d: pc=%d: BCAST %d.%d.%d.%d %d.%d.%d.%d = %d.%d.%d.%d\n",	       __FILE__,__LINE__,(p->pc - p->code_min),	       NIPQUAD(a1),	       NIPQUAD(a2),	       NIPQUAD(result));      SET_TAG(*top2,ADDRV);      SET_ADDR(*top2,result,p);      p->sp--;      p->pc++;      break;    }    case BCASTI: {      value_t *top = p->sp - 1;      uint32 a1, a2, result;      ENSURE_HEAP_ROOM(p,iph);      top = p->sp - 1;      DYNCHECK(top >= p->stack_min);      DYNCHECK_TAG(*top,ADDRV);#ifndef ADDR_IN_HEAP      DYNCHECK_TAG(p->pc->arg,ADDRV);      GET_ADDR(a2,p->heap_min,p->pc->arg);#else      { 	value_t v = ZERO_VALUE_T;	COPY_LIT(v,ADDRV,*p->pc);	GET_ADDR(a2,p->heap_min,v);      }#endif      GET_ADDR(a1,p->heap_min,*top);      result = a1 | ~a2;      d_printf(10,"%s:%d: pc=%d: BCASTI [%d.%d.%d.%d] %d.%d.%d.%d = %d.%d.%d.%d\n",	       __FILE__,__LINE__,(p->pc - p->code_min),	       NIPQUAD(a1),	       NIPQUAD(a2),	       NIPQUAD(result));      SET_TAG(*top,ADDRV);      SET_ADDR(*top,result,p);      p->pc++;      break;    }    case ISX: { /* unlike other ops, does not blow away top stack		   value */      value_t *top = p->sp - 1;      int result;      ENSURE_STACK_ROOM(p,iph);      top = p->sp - 1;      DYNCHECK(top >= p->stack_min);      result = (GET_TAG(*top) == EXCV);      DYNCHECK(p->sp < p->stack_max);      d_printf(10,"%s:%d: pc=%d: ISX: (%s)\n",__FILE__,__LINE__,	       (p->pc - p->code_min),(result?"yes":"no"));      SET_TAG(*p->sp,INTV);      SET_INT(*p->sp,result);      p->sp++;      p->pc++;      break;    }    case GETRB: {      ENSURE_STACK_ROOM(p,iph);      DYNCHECK(p->sp < p->stack_max);      SET_TAG(*p->sp,INTV);      SET_INT(*p->sp, p->rb);      d_printf(10,"%s:%d: pc=%d: GETRB = %d\n",__FILE__,__LINE__,	       (p->pc - p->code_min),p->rb);      p->sp++;      p->pc++;      break;    }    case GETSRC: {      ENSURE_HEAP_ROOM(p,iph);      DYNCHECK(p->sp < p->stack_max);      SET_TAG(*p->sp,ADDRV);      SET_ADDR(*p->sp,p->hdr->saddr,p);      d_printf(10,"%s:%d: pc=%d: GETSRC = %d.%d.%d.%d\n",	       __FILE__,__LINE__,(p->pc - p->code_min),	       NIPQUAD(p->iph->saddr));      p->sp++;      p->pc++;      break;    }    case GETDST: {      ENSURE_HEAP_ROOM(p,iph);      DYNCHECK(p->sp < p->stack_max);      SET_TAG(*p->sp,ADDRV);      SET_ADDR(*p->sp,p->hdr->daddr,p);      d_printf(10,"%s:%d: pc=%d: GETDST = %d.%d.%d.%d\n",	       __FILE__,__LINE__,(p->pc - p->code_min),	       NIPQUAD(p->hdr->daddr));      p->sp++;      p->pc++;      break;    }    case GETSPT: {      ENSURE_STACK_ROOM(p,iph);      DYNCHECK(p->sp < p->stack_max);      SET_TAG(*p->sp,INTV);      SET_INT(*p->sp,ntohs(p->hdr->sport));      d_printf(10,"%s:%d: pc=%d: GETSPT = %d\n",__FILE__,__LINE__,	       (p->pc - p->code_min),GET_INT(*p->sp));      p->sp++;      p->pc++;      break;    }#if 0    case GETLD: {#define LOAD_INT(x) ((x) >> FSHIFT)#define LOAD_FRAC(x) LOAD_INT(((x) & (FIXED_1-1)) * 100)      int loadint = avenrun[0] + (FIXED_1/200);      float loadavg = LOAD_INT(loadint) + (LOAD_FRAC(loadint) / 100.0);      ENSURE_HEAP_ROOM(p,iph);      DYNCHECK(p->sp < p->stack_max);      d_printf(10,"%s:%d: pc=%d: GETLD = loadavg is %d.%0d\n",	       __FILE__,__LINE__,(p->pc - p->code_min),	       LOAD_INT(loadint),LOAD_FRAC(loadint));      SET_TAG(*p->sp,FLOATV);      SET_FLOAT(*p->sp,loadavg,p);      p->sp++;      p->pc++;      break;#undef LOAD_INT#undef LOAD_FRAC    }#endif    case SETXH: {      value_t *top = p->sp - 1;      int newhandler_offs = -1;      instr_t *newhandler;            DYNCHECK(top >= p->stack_min);      DYNCHECK_TAG(*top,INTV);      newhandler_offs = GET_INT(*top);      newhandler = p->code_min + newhandler_offs;      /* now check that handler falls within bounds */      DYNCHECK(newhandler > p->pc);      DYNCHECK(newhandler <= p->code_max);      p->handler = newhandler;      d_printf(10,"%s:%d: pc=%d: SETXH = new handler at pc=%d\n",	       __FILE__,__LINE__,(p->pc - p->code_min),	       newhandler_offs);      p->sp--;			/* pop */      p->pc++;      break;    }    case RAISEX: {      /* all control transfers must go forward */      DYNCHECK(p->handler > p->pc);      p->pc = p->handler;      d_printf(10,"%s:%d: pc=%d: RAISEX = throwing to pc=%d\n",	       __FILE__,__LINE__,(p->pc - p->code_min),	       (p->handler - p->code_min));      break;    }    case HERE: {      __u32 myaddr;      ENSURE_HEAP_ROOM(p,iph);      DYNCHECK(p->sp < p->stack_max);      SET_TAG(*p->sp,ADDRV);      if (snap_here(&myaddr, p)) {	warn("%s:%d: HERE failed!\n",__FILE__,__LINE__);	return -1;      }      SET_ADDR(*p->sp,myaddr,p);      d_printf(10,"%s:%d: pc=%d: HERE = %d.%d.%d.%d\n",__FILE__,__LINE__,	       (p->pc - p->code_min),NIPQUAD(GET_ADDR_VAL(p->heap_min,							  *p->sp)));      p->sp++;      p->pc++;      break;    }    case ISHERE: {      value_t *top = p->sp - 1;      uint32 addr;      int result;      DYNCHECK(top >= p->stack_min);      DYNCHECK_TAG(*top,ADDRV);      GET_ADDR(addr,p->heap_min,*top);      print_timer(1,"interp_packet");#ifdef __KERNEL__      result = ishere(addr,p->skb);#else      result = ishere(addr,p);#endif /* __KERNEL__ */      print_anti_timer(1,"interp_packet");      d_printf(10,"%s:%d: pc=%d: ISHERE [%d.%d.%d.%d]: (%s)\n",	       __FILE__,__LINE__,(p->pc - p->code_min),	       NIPQUAD(GET_ADDR_VAL(p->heap_min,*top)),	       (result?"yes":"no"));      SET_TAG(*top,INTV);      SET_INT(*top,result);      p->pc++;      break;    }    case ROUTE: {      value_t *top = p->sp - 1;      uint32 *ret,addr;#ifdef __KERNEL__      struct rtable *rt;#endif      __u32 hop = 0;      ENSURE_HEAP_ROOM(p,iph);      top = p->sp - 1;      DYNCHECK(top >= p->stack_min);      DYNCHECK_TAG(*top,ADDRV);      GET_ADDR(addr,p->heap_min,*top);      print_timer(1,"interp_packet");#ifdef __KERNEL__      if (next_hop(&rt,addr,p->skb->nh.iph->tos)) {#else      if (next_hop(&hop,addr,p->iph->tos)) {#endif	/* no route found */	hop = 0;	ret = &hop;      } else {	ret = &hop;      }      print_anti_timer(1,"interp_packet");      DYNCHECK(ret != NULL);      if (*ret != 0) {	d_printf(10,"%s:%d: pc=%d: ROUTE [%d.%d.%d.%d] = %d.%d.%d.%d\n",		 __FILE__,__LINE__,(p->pc - p->code_min),		 NIPQUAD(GET_ADDR_VAL(p->heap_min,*top)),		 NIPQUAD(*ret));	SET_TAG(*top,ADDRV);	SET_ADDR(*top,*ret,p);      }      else {	d_printf(10,"%s:%d: pc=%d: ROUTE [%d.%d.%d.%d] -> E_NO_ROUTE!!!\n",		 __FILE__,__LINE__,(p->pc - p->code_min),		 NIPQUAD(GET_ADDR_VAL(p->heap_min,*top)));	SET_TAG(*top,EXCV);	SET_INT(*top,E_NO_ROUTE);      }      p->pc++;      break;    }    case RTDEV: {      value_t *top = p->sp - 1;      int err;      uint32 addr;      __u32 hop;      int hop_out_if;      ENSURE_HEAP_ROOM(p,iph);      top = p->sp - 1;      DYNCHECK(top >= p->stack_min);      DYNCHECK(p->sp < p->stack_max);      DYNCHECK_TAG(*top,ADDRV);      GET_ADDR(addr,p->heap_min,*top);      err = next_hop_and_dev(&hop,&hop_out_if,addr);      if (err == 0) {	d_printf(10,"%s:%d: pc=%d: RTDEV [%d.%d.%d.%d] = (%d.%d.%d.%d,%d)\n",		 __FILE__,__LINE__,(p->pc - p->code_min),		 NIPQUAD(GET_ADDR_VAL(p->heap_min,*top)),		 NIPQUAD(hop), hop_out_if);	SET_TAG(*top,ADDRV);	SET_ADDR(*top,hop,p);	SET_TAG(*p->sp,INTV);	SET_INT(*p->sp,hop_out_if);	p->sp++;      } else {	d_printf(10,"%s:%d: pc=%d: RTDEV [%d.%d.%d.%d] -> E_NO_ROUTE!!!\n",		 __FILE__,__LINE__,(p->pc - p->code_min),		 NIPQUAD(GET_ADDR_VAL(p->heap_min,*top)));	SET_TAG(*top,EXCV);	SET_INT(*top,E_NO_ROUTE);      }      p->pc++;      break;    }    case SEND:	case DSEND: {      value_t *top1 = p->sp - 1; /* dest addr */      value_t *top2 = p->sp - 2; /* RB to use */

⌨️ 快捷键说明

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