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

📄 udphdr.c

📁 用于底层开发的TCPIP协议栈源代码
💻 C
字号:
/* UDP header conversion routines
 * 
 */
#include "global.h"
#include "mbuf.h"
#include "ip.h"
#include "internet.h"
#include "udp.h"

/* Convert UDP header in internal format to an mbuf in external format */
void
htonudp(
struct udp *udp,
struct mbuf **bpp,
struct pseudo_header *ph
){
	register uint8 *cp;
	uint16 checksum;

	/* Allocate UDP protocol header and fill it in */
	pushdown(bpp,NULL,UDPHDR);
	cp = (*bpp)->data;
	cp = put16(cp,udp->source);	/* Source port */
	cp = put16(cp,udp->dest);	/* Destination port */
	cp = put16(cp,udp->length);	/* Length */
	*cp++ = 0;			/* Clear checksum */
	*cp-- = 0;

	/* All zeros and all ones is equivalent in one's complement arithmetic;
	 * the spec requires us to change zeros into ones to distinguish an
 	 * all-zero checksum from no checksum at all
	 */
	if((checksum = cksum(ph,*bpp,ph->length)) == 0)
		checksum = 0xffff;
	put16(cp,checksum);
}
/* Convert UDP header in mbuf to internal structure */
int
ntohudp(
struct udp *udp,
struct mbuf **bpp
){
	uint8 udpbuf[UDPHDR];

	if(pullup(bpp,udpbuf,UDPHDR) != UDPHDR)
		return -1;
	udp->source = get16(&udpbuf[0]);
	udp->dest = get16(&udpbuf[2]);
	udp->length = get16(&udpbuf[4]);
	udp->checksum = get16(&udpbuf[6]);
	return 0;
}
/* Extract UDP checksum value from a network-format header without
 * disturbing the header
 */
uint16
udpcksum(
struct mbuf *bp
){
	struct mbuf *dup;

	if(dup_p(&dup,bp,6,2) != 2)
		return 0;
	return pull16(&dup);
}

⌨️ 快捷键说明

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