亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? ax25.c

?? 這是新華龍(www.xhl.xom.xn)開發(fā)的
?? C
字號(hào):
/* Low level AX.25 code:
 */
#include <stdio.h>
#include "global.h"
#include "mbuf.h"
#include "iface.h"
#include "arp.h"
#include "slip.h"
#include "ax25.h"
#include "lapb.h"
#include "netrom.h"
#include "ip.h"
#include "devparam.h"
#include <ctype.h>

/* List of AX.25 multicast addresses in network format (shifted ascii).
 * Only the first entry is used for transmission, but an incoming
 * packet with any one of these destination addresses is recognized
 * as a multicast.
 */
uint8 Ax25multi[][AXALEN] = {
	'Q'<<1, 'S'<<1, 'T'<<1, ' '<<1, ' '<<1, ' '<<1, '0'<<1,	/* QST */
	'M'<<1, 'A'<<1, 'I'<<1, 'L'<<1, ' '<<1, ' '<<1, '0'<<1,	/* MAIL */
	'N'<<1, 'O'<<1, 'D'<<1, 'E'<<1, 'S'<<1, ' '<<1, '0'<<1,	/* NODES */
	'I'<<1, 'D'<<1, ' '<<1, ' '<<1, ' '<<1, ' '<<1, '0'<<1,	/* ID */
	'O'<<1, 'P'<<1, 'E'<<1, 'N'<<1, ' '<<1, ' '<<1, '0'<<1,	/* OPEN */
	'C'<<1, 'Q'<<1, ' '<<1, ' '<<1, ' '<<1, ' '<<1, '0'<<1,	/* CQ */
	'B'<<1, 'E'<<1, 'A'<<1, 'C'<<1, 'O'<<1, 'N'<<1, '0'<<1,	/* BEACON */
	'R'<<1, 'M'<<1, 'N'<<1, 'C'<<1, ' '<<1, ' '<<1, '0'<<1,	/* RMNC */
	'A'<<1, 'L'<<1, 'L'<<1, ' '<<1, ' '<<1, ' '<<1, '0'<<1,	/* ALL */
	'\0',
};
uint8 Mycall[AXALEN];
struct ax_route *Ax_routes;	/* Routing table header */
int Digipeat = 1;	/* Controls digipeating */

int
axi_send(
struct mbuf **bpp,
struct iface *iface,
int32 gateway,
uint8 tos
){
	return axui_send(bpp,iface,gateway,tos);
}

/* Send IP datagrams across an AX.25 link */
int
axui_send(
struct mbuf **bpp,
struct iface *iface,
int32 gateway,
uint8 tos
){
	struct mbuf *tbp;
	uint8 *hw_addr;
	struct ax25_cb *axp;

	if((hw_addr = res_arp(iface,ARP_AX25,gateway,bpp)) == NULL)
		return 0;	/* Wait for address resolution */

	/* UI frames are used for any one of the following three conditions:
	 * 1. The "low delay" bit is set in the type-of-service field.
	 * 2. The "reliability" TOS bit is NOT set and the interface is in
	 *    datagram mode.
	 * 3. The destination is the broadcast address (this is helpful
	 *    when broadcasting on an interface that's in connected mode).
	 */
	if((tos & IP_COS) == DELAY
	 || ((tos & IP_COS) != RELIABILITY && (iface->send == axui_send))
	 || addreq(hw_addr,Ax25multi[0])){
		/* Use UI frame */
		return (*iface->output)(iface,hw_addr,iface->hwaddr,PID_IP,bpp);
	}
	/* Reliability is needed; use I-frames in AX.25 connection */
	if((axp = find_ax25(hw_addr)) == NULL){
		/* Open a new connection */
		axp = open_ax25(iface,iface->hwaddr,hw_addr,
		 AX_ACTIVE,Axwindow,s_arcall,s_atcall,s_ascall,-1);
		if(axp == NULL){
			free_p(bpp);
			return -1;
		}
	}
	if(axp->state == LAPB_DISCONNECTED){
		est_link(axp);
		lapbstate(axp,LAPB_SETUP);
	}
	/* Insert the PID */
	pushdown(bpp,NULL,1);
	(*bpp)->data[0] = PID_IP;
	if((tbp = segmenter(bpp,axp->paclen)) == NULL){
		free_p(bpp);
		return -1;
	}
	return send_ax25(axp,&tbp,-1);
}
/* Add header and send connectionless (UI) AX.25 packet.
 * Note that the calling order here must match enet_output
 * since ARP also uses it.
 */
int
ax_output(
struct iface *iface,	/* Interface to use; overrides routing table */
uint8 *dest,		/* Destination AX.25 address (7 bytes, shifted) */
uint8 *source,		/* Source AX.25 address (7 bytes, shifted) */
uint16 pid,		/* Protocol ID */
struct mbuf **bpp	/* Data field (follows PID) */
){
	/* Prepend pid to data */
	pushdown(bpp,NULL,1);
	(*bpp)->data[0] = (uint8)pid;
	return axsend(iface,dest,source,LAPB_COMMAND,UI,bpp);
}
/* Common subroutine for sendframe() and ax_output() */
int
axsend(
struct iface *iface,	/* Interface to use; overrides routing table */
uint8 *dest,		/* Destination AX.25 address (7 bytes, shifted) */
uint8 *source,		/* Source AX.25 address (7 bytes, shifted) */
int cmdrsp,		/* Command/response indication */
int ctl,		/* Control field */
struct mbuf **bpp	/* Data field (includes PID) */
){
	struct ax25 addr;
	struct ax_route *axr;
	uint8 *idest;
	int rval;

	/* If the source addr is unspecified, use the interface address */
	if(source[0] == '\0')
		source = iface->hwaddr;

	/* If there's a digipeater route, get it */
	axr = ax_lookup(dest);

	memcpy(addr.dest,dest,AXALEN);
	memcpy(addr.source,source,AXALEN);
	addr.cmdrsp = cmdrsp;

	if(axr != NULL){
		memcpy(addr.digis,axr->digis,axr->ndigis*AXALEN);
		addr.ndigis = axr->ndigis;
		idest = addr.digis[0];
	} else {
		addr.ndigis = 0;
		idest = dest;
	}
	addr.nextdigi = 0;

	/* Allocate mbuf for control field, and fill in */
	pushdown(bpp,NULL,1);
	(*bpp)->data[0] = ctl;

	htonax25(&addr,bpp);
	/* This shouldn't be necessary because redirection has already been
	 * done at the IP router layer, but just to be safe...
	 */
	if(iface->forw != NULL){
		logsrc(iface->forw,iface->forw->hwaddr);
		logdest(iface->forw,idest);
		rval = (*iface->forw->raw)(iface->forw,bpp);
	} else {
		logsrc(iface,iface->hwaddr);
		logdest(iface,idest);
		rval = (*iface->raw)(iface,bpp);
	}
	return rval;
}
/* Process incoming AX.25 packets.
 * After optional tracing, the address field is examined. If it is
 * directed to us as a digipeater, repeat it.  If it is addressed to
 * us or to QST-0, kick it upstairs depending on the protocol ID.
 */
void
ax_recv(
struct iface *iface,
struct mbuf **bpp
){
	uint8 control;
	struct ax25 hdr;
	struct ax25_cb *axp;
	struct ax_route *axr;
	uint8 (*mpp)[AXALEN];
	int mcast;
	uint8 *isrc,*idest;	/* "immediate" source and destination */

	/* Pull header off packet and convert to host structure */
	if(ntohax25(&hdr,bpp) < 0){
		/* Something wrong with the header */
		free_p(bpp);
		return;
	}
	/* If there were digis in this packet and at least one has
	 * been passed, then the last passed digi is the immediate source.
	 * Otherwise it is the original source.
	 */
	if(hdr.ndigis != 0 && hdr.nextdigi != 0)
		isrc = hdr.digis[hdr.nextdigi-1];
	else
		isrc = hdr.source;

	/* If there are digis in this packet and not all have been passed,
	 * then the immediate destination is the next digi. Otherwise it
	 * is the final destination.
	 */
	if(hdr.ndigis != 0 && hdr.nextdigi != hdr.ndigis)
		idest = hdr.digis[hdr.nextdigi];
	else
		idest = hdr.dest;

	/* Don't log our own packets if we overhear them, as they're
	 * already logged by axsend() and by the digipeater code.
	 */
	if(!addreq(isrc,iface->hwaddr)){
		logsrc(iface,isrc);
		logdest(iface,idest);
	}
	/* Examine immediate destination for a multicast address */
	mcast = 0;
	for(mpp = Ax25multi;(*mpp)[0] != '\0';mpp++){
		if(addreq(idest,*mpp)){
			mcast = 1;
			break;
		}
	}
	if(!mcast && !addreq(idest,iface->hwaddr)){
		/* Not a broadcast, and not addressed to us. Inhibit
		 * transmitter to avoid colliding with addressed station's
		 * response, and discard packet.
		 */
		if(iface->ioctl != NULL)
			(*iface->ioctl)(iface,PARAM_MUTE,1,-1);
		free_p(bpp);
		return;
	}
	if(!mcast && iface->ioctl != NULL){
		/* Packet was sent to us; abort transmit inhibit */
		(*iface->ioctl)(iface,PARAM_MUTE,1,0);
	}
	/* At this point, packet is either addressed to us, or is
	 * a multicast.
	 */
	if(hdr.nextdigi < hdr.ndigis){
		/* Packet requests digipeating. See if we can repeat it. */
		if(Digipeat && !mcast){
			/* Yes, kick it back out. htonax25 will set the
			 * repeated bit.
			 */
			hdr.nextdigi++;
			htonax25(&hdr,bpp);
			if(iface->forw != NULL){
				logsrc(iface->forw,iface->forw->hwaddr);
				logdest(iface->forw,hdr.digis[hdr.nextdigi]);
				(*iface->forw->raw)(iface->forw,bpp);
			} else {
				logsrc(iface,iface->hwaddr);
				logdest(iface,hdr.digis[hdr.nextdigi]);
				(*iface->raw)(iface,bpp);
			}
		}
		free_p(bpp);	/* Dispose if not forwarded */
		return;
	}
	/* If we reach this point, then the packet has passed all digis,
	 * and is either addressed to us or is a multicast.
	 */
	if(*bpp == NULL)
		return;		/* Nothing left */

	/* If there's no locally-set entry in the routing table and
	 * this packet has digipeaters, create or update it. Leave
	 * local routes alone.
	 */
	if(((axr = ax_lookup(hdr.source)) == NULL || axr->type == AX_AUTO)
	 && hdr.ndigis > 0){
		uint8 digis[MAXDIGIS][AXALEN];
		int i,j;

		/* Construct reverse digipeater path */
		for(i=hdr.ndigis-1,j=0;i >= 0;i--,j++){
			memcpy(digis[j],hdr.digis[i],AXALEN);
			digis[j][ALEN] &= ~(E|REPEATED);
		}
		ax_add(hdr.source,AX_AUTO,digis,hdr.ndigis);
	}
	/* Sneak a peek at the control field. This kludge is necessary because
	 * AX.25 lacks a proper protocol ID field between the address and LAPB
	 * sublayers; a control value of UI indicates that LAPB is to be
	 * bypassed.
	 */
	control = *(*bpp)->data & ~PF;

	if(control == UI){
		int pid;
		struct axlink *ipp;

		(void) PULLCHAR(bpp);
		if((pid = PULLCHAR(bpp)) == -1)
			return;		/* No PID */
		/* Find network level protocol and hand it off */
		for(ipp = Axlink;ipp->funct != NULL;ipp++){
			if(ipp->pid == pid)
				break;
		}
		if(ipp->funct != NULL)
			(*ipp->funct)(iface,NULL,hdr.source,hdr.dest,bpp,mcast);
		else
			free_p(bpp);
		return;
	}
	/* Everything from here down is connected-mode LAPB, so ignore
	 * multicasts
	 */
	if(mcast){
		free_p(bpp);
		return;
	}
	/* Find the source address in hash table */
	if((axp = find_ax25(hdr.source)) == NULL){
		/* Create a new ax25 entry for this guy,
		 * insert into hash table keyed on his address,
		 * and initialize table entries
		 */
		if((axp = cr_ax25(hdr.source)) == NULL){
			free_p(bpp);
			return;
		}
		/* Swap source and destination */
		memcpy(axp->remote,hdr.source,AXALEN);
		memcpy(axp->local,hdr.dest,AXALEN);
		axp->iface = iface;
	}
	if(hdr.cmdrsp == LAPB_UNKNOWN)
		axp->proto = V1;	/* Old protocol in use */

	lapb_input(axp,hdr.cmdrsp,bpp);
}
/* Find a route for an AX.25 address */
struct ax_route *
ax_lookup(
uint8 *target
){
	register struct ax_route *axr;
	struct ax_route *axlast = NULL;

	for(axr = Ax_routes; axr != NULL; axlast=axr,axr = axr->next){
		if(addreq(axr->target,target)){
			if(axr != Ax_routes){
				/* Move entry to top of list to speed
				 * future searches
				 */
				axlast->next = axr->next;
				axr->next = Ax_routes;
				Ax_routes = axr;

			}
			return axr;
		}
	}
	return axr;
}
/* Add an entry to the AX.25 routing table */
struct ax_route *
ax_add(
uint8 *target,
int type,
uint8 digis[][AXALEN],
int ndigis
){
	register struct ax_route *axr;

	if(ndigis < 0 || ndigis > MAXDIGIS)
		return NULL;

	if((axr = ax_lookup(target)) == NULL){
		axr = (struct ax_route *)callocw(1,sizeof(struct ax_route));
		axr->next = Ax_routes;
		Ax_routes = axr;
		memcpy(axr->target,target,AXALEN);
		axr->ndigis = ndigis;
	}
	axr->type = type;
	if(axr->ndigis != ndigis)
		axr->ndigis = ndigis;

	memcpy(axr->digis,digis[0],ndigis*AXALEN);
	return axr;
}
int
ax_drop(
uint8 *target
){
	register struct ax_route *axr;
	struct ax_route *axlast = NULL;

	for(axr = Ax_routes;axr != NULL;axlast=axr,axr=axr->next)
		if(memcmp(axr->target,target,AXALEN) == 0)
			break;
	if(axr == NULL)
		return -1;	/* Not in table! */
	if(axlast != NULL)
		axlast->next = axr->next;
	else
		Ax_routes = axr->next;
	
	free(axr);
	return 0;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧洲激情一区二区| 日韩午夜激情av| 日韩精品成人一区二区三区| 精品国产乱码久久久久久闺蜜| 成人av手机在线观看| 天天综合天天综合色| 中文字幕永久在线不卡| 欧美成人精精品一区二区频| 色综合天天综合在线视频| 韩国欧美国产1区| 亚洲成人你懂的| 亚洲欧美日韩综合aⅴ视频| 精品精品欲导航| 欧美三级电影在线看| 99久久免费精品高清特色大片| 麻豆免费看一区二区三区| 一区二区三区四区乱视频| 亚洲精品在线网站| 欧美一区二视频| 欧美视频完全免费看| av不卡免费在线观看| 国产一二精品视频| 免费精品视频在线| 免费看精品久久片| 日韩成人精品在线观看| 午夜欧美一区二区三区在线播放| 亚洲欧美在线aaa| 国产婷婷色一区二区三区在线| 日韩欧美一区在线| 在线不卡欧美精品一区二区三区| 色综合av在线| 在线观看亚洲一区| 欧美在线你懂得| 色婷婷激情一区二区三区| 99re亚洲国产精品| 91在线国产观看| 91免费国产在线观看| av午夜一区麻豆| 97aⅴ精品视频一二三区| 成人av在线看| 99精品视频在线观看| 91丨九色porny丨蝌蚪| 不卡欧美aaaaa| 色视频一区二区| 色诱视频网站一区| 欧美日韩在线播放三区四区| 欧美亚洲国产一区在线观看网站| 在线观看免费亚洲| 欧美日产在线观看| 日韩欧美专区在线| 久久精品视频免费| 国产精品久久久久国产精品日日| 国产精品视频看| 一区二区三区在线免费视频| 亚洲免费av观看| 日韩1区2区3区| 精品无人区卡一卡二卡三乱码免费卡| 久久激五月天综合精品| 国产成人午夜精品5599| 成人黄色片在线观看| 99视频一区二区| 欧美偷拍一区二区| 日韩一区二区在线观看| 久久久久亚洲蜜桃| 国产精品传媒在线| 亚洲第一会所有码转帖| 男人的j进女人的j一区| 国产麻豆一精品一av一免费| 9人人澡人人爽人人精品| 欧美亚洲日本一区| 日韩欧美一卡二卡| 国产精品久久精品日日| 一区av在线播放| 狠狠色丁香久久婷婷综合丁香| 高清在线成人网| 91猫先生在线| 欧美大尺度电影在线| 国产无一区二区| 亚洲va欧美va人人爽| 国产一区二区三区四区五区入口| 99精品视频在线观看免费| 欧美日韩一区二区欧美激情| 精品国产第一区二区三区观看体验| 国产精品亲子伦对白| 亚洲成人黄色影院| 粉嫩嫩av羞羞动漫久久久 | 国产免费成人在线视频| 综合婷婷亚洲小说| 美女一区二区三区| 91麻豆国产福利精品| 欧美一区二区免费观在线| 国产精品福利电影一区二区三区四区| 亚洲国产日韩精品| 成人免费视频免费观看| 日韩一区二区三区四区| 亚洲精选一二三| 精品一区二区三区免费播放| 在线精品亚洲一区二区不卡| 久久久欧美精品sm网站| 日韩综合小视频| 色香色香欲天天天影视综合网| 欧美精品一区二| 午夜精彩视频在线观看不卡| 成人av在线一区二区三区| 欧美不卡一区二区三区| 亚洲午夜在线电影| 成人免费va视频| 精品国产3级a| 视频在线在亚洲| 色婷婷久久一区二区三区麻豆| 国产亚洲短视频| 一区二区三区精品在线| 久久er精品视频| 欧美性猛交xxxx黑人交| 91精品国产综合久久福利软件| 精品国产麻豆免费人成网站| 亚洲一本大道在线| 91在线一区二区三区| 国产亚洲精品bt天堂精选| 蜜臀a∨国产成人精品| 在线亚洲一区二区| 自拍偷拍亚洲欧美日韩| 不卡av免费在线观看| 久久影院视频免费| 美国三级日本三级久久99| 欧美精品1区2区| 香蕉成人啪国产精品视频综合网| 色婷婷久久久亚洲一区二区三区| 中文久久乱码一区二区| 国产99精品国产| 久久综合久久综合九色| 麻豆91在线观看| 日韩欧美三级在线| 久久66热偷产精品| 91精品一区二区三区久久久久久| 亚洲自拍偷拍图区| 色香色香欲天天天影视综合网| 亚洲日本成人在线观看| 91亚洲精华国产精华精华液| 日韩理论在线观看| 色吊一区二区三区| 亚洲伦理在线精品| 欧美日韩一区二区不卡| 亚洲国产综合色| 欧美军同video69gay| 日日噜噜夜夜狠狠视频欧美人| 欧美日韩精品二区第二页| 视频在线观看一区| 欧美v国产在线一区二区三区| 国产主播一区二区| 国产精品乱码人人做人人爱| av毛片久久久久**hd| 亚洲综合一区在线| 欧美肥妇bbw| 久久精品国产在热久久| 国产欧美日韩在线视频| 99久久夜色精品国产网站| 亚洲最大成人综合| 4438x亚洲最大成人网| 紧缚奴在线一区二区三区| 国产日韩欧美一区二区三区乱码 | 秋霞成人午夜伦在线观看| 欧美一区二区视频在线观看 | 欧美自拍丝袜亚洲| 日韩av不卡一区二区| 精品国产伦一区二区三区观看方式| 国产乱妇无码大片在线观看| 国产精品―色哟哟| 欧美日韩卡一卡二| 国产寡妇亲子伦一区二区| 亚洲三级视频在线观看| 777精品伊人久久久久大香线蕉| 极品美女销魂一区二区三区| 欧美高清在线一区| 欧美三级日韩在线| 国产主播一区二区三区| 亚洲精品欧美在线| 欧美岛国在线观看| 色狠狠色噜噜噜综合网| 久久超碰97中文字幕| 亚洲欧美偷拍另类a∨色屁股| 91精品国产综合久久久久久漫画| 国产一区二区三区观看| 亚洲欧美日韩国产中文在线| 欧美一级一区二区| www.在线成人| 久久精品国产一区二区三区免费看| 国产精品污www在线观看| 欧美喷水一区二区| av电影天堂一区二区在线 | 免费成人在线观看视频| 国产精品精品国产色婷婷| 欧美高清性hdvideosex| 成人性生交大合| 免费在线观看日韩欧美| 亚洲人成伊人成综合网小说| 欧美xingq一区二区| 欧美日韩一二三区| eeuss鲁片一区二区三区| 麻豆精品新av中文字幕|