亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
国产米奇在线777精品观看| 亚洲成人一二三| 国内成人精品2018免费看| 日韩欧美色电影| 国产剧情av麻豆香蕉精品| 久久久亚洲欧洲日产国码αv| 国产精品99久久久久久似苏梦涵| 精品国产乱码久久| 国产精品自拍网站| 国产精品午夜在线| 欧洲视频一区二区| 久久99久久久久| 久久精品视频一区二区三区| 99久久精品免费看国产免费软件| 一区二区三区高清| 日韩视频在线观看一区二区| 国产99久久久国产精品潘金| 亚洲欧美精品午睡沙发| 欧美巨大另类极品videosbest | 欧美男生操女生| 麻豆精品新av中文字幕| 中文字幕av一区 二区| 91九色最新地址| 久久精品国产99久久6| 国产精品伦一区二区三级视频| 欧美色倩网站大全免费| 国产精品一区二区三区四区| 中文字幕制服丝袜一区二区三区| 欧美三级中文字幕在线观看| 国产伦精一区二区三区| 亚洲精品一二三| 日韩女优制服丝袜电影| 不卡的看片网站| 男人的j进女人的j一区| 中文字幕一区二区三区不卡在线| 欧美一级日韩免费不卡| 99re视频这里只有精品| 日本不卡不码高清免费观看| 日韩毛片视频在线看| 欧美电影免费观看高清完整版在| 99久久精品99国产精品 | 亚洲天堂久久久久久久| 欧美一级一区二区| 欧洲一区二区三区在线| 国产成人精品一区二| 免费在线观看成人| 亚洲一区二区三区四区在线免费观看| 国产亚洲精品aa午夜观看| 欧美精品成人一区二区三区四区| 99re亚洲国产精品| 国产精品一级片| 美女尤物国产一区| 性感美女极品91精品| 亚洲欧美另类在线| 国产欧美一区二区精品仙草咪| 欧美少妇性性性| 91蜜桃免费观看视频| 国产成人精品影视| 寂寞少妇一区二区三区| 日韩成人精品在线| 亚洲国产精品久久艾草纯爱| 国产精品二区一区二区aⅴ污介绍| 精品少妇一区二区| 在线播放国产精品二区一二区四区| 91在线精品一区二区三区| 国产精品一区二区在线观看不卡| 奇米四色…亚洲| 午夜国产精品影院在线观看| 亚洲一区在线观看网站| 亚洲婷婷国产精品电影人久久| 亚洲精品在线观| 久久一二三国产| 久久久国产一区二区三区四区小说 | 国产精品欧美一区二区三区| 久久九九影视网| 国产日韩欧美一区二区三区综合| 久久综合色鬼综合色| 日韩欧美电影一区| 精品奇米国产一区二区三区| 欧美一级xxx| 日韩精品一区二区三区三区免费 | 2021国产精品久久精品| 欧美不卡激情三级在线观看| 日韩欧美的一区| 欧美成人aa大片| 国产亚洲欧美在线| 中文天堂在线一区| 亚洲欧洲成人精品av97| 亚洲精品成人天堂一二三| 一区二区三区国产精品| 日韩一区欧美二区| 激情五月激情综合网| 国产成人综合在线| 91在线播放网址| 欧美日韩在线电影| 日韩精品一区二区在线观看| 久久综合久久综合亚洲| 中文字幕中文字幕在线一区| 亚洲激情一二三区| 日本特黄久久久高潮| 国产乱码字幕精品高清av| 成人ar影院免费观看视频| 色88888久久久久久影院按摩| 欧美日韩精品免费观看视频| 精品国产乱码久久久久久久| 国产精品美女久久久久久久久久久 | 91久久线看在观草草青青| 欧美日韩亚洲综合一区| 久久婷婷色综合| 亚洲美女少妇撒尿| 久久超碰97中文字幕| 成人国产在线观看| 9191成人精品久久| 中文字幕高清不卡| 视频一区视频二区在线观看| 国产精品一二一区| 色婷婷av一区二区| 久久综合狠狠综合久久综合88| 亚洲欧洲精品一区二区精品久久久 | 成人黄色综合网站| 欧美性猛交xxxxxx富婆| 精品国产乱码久久久久久久| 一区二区三区中文在线观看| 精品一区二区三区视频在线观看| 91麻豆高清视频| 久久影视一区二区| 亚洲成a人片在线观看中文| 国产精品456| 91精品国产美女浴室洗澡无遮挡| 中文字幕中文乱码欧美一区二区| 视频一区欧美精品| 色天使色偷偷av一区二区| 精品免费视频一区二区| 亚洲电影一级片| 色婷婷av一区二区三区gif| 99re成人在线| 欧美色图在线观看| 精品国产一区二区精华| 一区二区三区四区在线| 国产精品91一区二区| 欧美肥妇毛茸茸| 亚洲444eee在线观看| 成人晚上爱看视频| 成人av在线网站| 成人欧美一区二区三区| 在线精品观看国产| 亚洲综合一区二区三区| 欧美高清性hdvideosex| 蜜芽一区二区三区| 久久一留热品黄| 成人黄色软件下载| 一区二区三区精密机械公司| 欧美日韩精品一区视频| 美国欧美日韩国产在线播放| 久久久99久久| av一区二区不卡| 一区二区三区自拍| 欧美精品一二三| 国模一区二区三区白浆| 日本一二三四高清不卡| 在线精品视频免费播放| 日本午夜精品一区二区三区电影| 精品免费日韩av| 91无套直看片红桃| 香蕉久久一区二区不卡无毒影院| 欧美大片在线观看一区| 国产成人一区在线| 亚洲欧美日韩一区二区| 91精品欧美综合在线观看最新| 美腿丝袜亚洲三区| 欧美激情一区不卡| 色狠狠色噜噜噜综合网| 日韩电影在线免费看| 欧美激情一区二区三区全黄| 欧美性欧美巨大黑白大战| 久久成人综合网| 亚洲美女免费在线| 日韩精品在线看片z| 色综合一区二区三区| 另类人妖一区二区av| 中文字幕一区二区5566日韩| 欧美一区二区三区啪啪| jlzzjlzz欧美大全| 日日嗨av一区二区三区四区| 欧美韩日一区二区三区| 欧美视频一区二区三区在线观看| 美女网站在线免费欧美精品| 亚洲免费在线视频一区 二区| 欧美sm极限捆绑bd| 91成人在线精品| 成人一级片在线观看| 日韩和欧美一区二区三区| 国产精品传媒在线| 久久综合九色综合欧美就去吻| 色94色欧美sute亚洲线路二| 国内精品嫩模私拍在线| 亚洲成人免费视| 亚洲欧洲精品天堂一级| 久久久久久久久免费| 6080午夜不卡|