Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 9 May 2007 19:03:07 GMT
From:      Fredrik Lindberg <fli@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 119589 for review
Message-ID:  <200705091903.l49J37Bh040704@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=119589

Change 119589 by fli@fli_genesis on 2007/05/09 19:02:07

	o Remove old debugging code
	o Fix automatic packet and buffer segmentation 

Affected files ...

.. //depot/projects/soc2007/fli-mdns_sd/mdnsd/stack_packet.c#3 edit

Differences ...

==== //depot/projects/soc2007/fli-mdns_sd/mdnsd/stack_packet.c#3 (text+ko) ====

@@ -40,20 +40,6 @@
 #include "stack_mdns.h"
 #include "hash.h"
 
-#ifdef DEBUG
-# define HEXDUMP(_hdbuf, _hdlen) do { \
-  { \
-        int __hd_tmp; \
-		char *__hd_buf = (char *)(_hdbuf); \
-        for (__hd_tmp = 0; __hd_tmp < (int)(_hdlen); __hd_tmp++) \
-                printf("%.2x ", (unsigned char)__hd_buf[__hd_tmp]); \
-    printf("\n"); \
-  } \
-} while(0)
-#else
-# define HEXDUMP(_hdbuf, _hdlen)
-#endif
-
 static ssize_t utf8_encode(wchar_t *, char *, size_t);
 static ssize_t utf8_decode(char *, size_t, wchar_t *, size_t);
 static inline char * skipname(char *, char *);
@@ -580,32 +566,42 @@
 	char nam[MDNS_RECORD_LEN + 1], namc[MDNS_RECORD_LEN];
 	struct mdns_packet *pkg, *hpkg;
 	struct mdns_bufpool *bp;
-	struct mdns_buf *buf, *buf2;
+	struct mdns_buf *buf;
 	struct mdns_header *h;
 	struct mdns_qsec qsec;
 	ssize_t qname_len, namlen, namlen2;
 	int i, error, flags;
 	uint16_t class;
 
+	bp = pc->pc_md->md_bp;
 	pkg = pc->pc_pkg;
 	if (pkg == NULL) {
 		errno = EINVAL;
 		return (-1);
 	}
 
+	if (pkg->p_bufseg(p_questions) == NULL) {
+		pkg->p_bufseg(p_questions) = mdns_buf_alloc(bp, &pkg->p_buflist, 0, 0);
+		pkg->p_buf(p_questions) = MDNS_BUF(pkg->p_bufseg(p_questions));
+	}
+	buf = pkg->p_bufseg(p_questions);
+
 	qname_len = wcslen(qs->q_name);
 	i = qname_len + 1 + MDNS_QSET_HLEN;
-	buf = MDNS_BUFH(&pkg->p_buflist);
-	bp = pc->pc_md->md_bp;
 
 	/*
-	 * Expand packet chain or buffer chain if needed
+	 * Expand packet chains, buffer chains and buffers if needed
 	 */
-	if ((i + MDNS_BUFLEN(buf)) > MDNS_BUFSZ(buf)) {
-		if (pc->pc_flags & MDNS_PC_CONT) {
-			buf = mdns_buf_alloc(bp, &pkg->p_buflist, 0, 0);
+	if (pc->pc_flags & MDNS_PC_CONT) {
+		if ((i + MDNS_BUFLEN(buf)) > MDNS_BUFSZ(buf)) {
+			error = mdns_buf_expand(buf, 0);
+			if (error != 0)
+				return (-1);
+			pkg->p_buf(p_questions) = MDNS_BUF(buf);
 		}
-		else {
+	}
+	else {
+		if (pkg->p_len + i > pc->pc_md->md_maxpkgsz) {
 			h = (struct mdns_header *)pkg->p_buf(p_hdr);
 			h->h_tc = 1;
 			pkg = pkg_alloc(pc);
@@ -614,6 +610,14 @@
 				flags |= MDNS_HEAD_AA;
 			mdns_pkg_sethdr(pc, 0, flags);
 			buf = mdns_buf_alloc(pc->pc_md->md_bp, &pkg->p_buflist, 0, 0);
+			pkg->p_bufseg(p_questions) = buf;
+			pkg->p_buf(p_questions) = MDNS_BUF(buf);
+		}
+		else if ((i + MDNS_BUFLEN(buf)) > MDNS_BUFSZ(buf)) {
+			error = mdns_buf_expand(buf, 0);
+			if (error != 0)
+				return (-1);
+			pkg->p_buf(p_questions) = MDNS_BUF(buf);
 		}
 	}
 
@@ -629,29 +633,24 @@
 	}
 
 	namlen2 = MDNS_RECORD_LEN;
-	error = name_compress(pkg->p_nc_tbl, nam, namlen, namc, &namlen2, pkg->p_len);
+	error = name_compress(pkg->p_nc_tbl, nam, namlen, namc, &namlen2,
+		pkg->p_len);
 	if (error != 0) {
 		return (-1);
 	}
 	namlen = namlen2;
 
-	if (pkg->p_bufseg(p_questions) == NULL) {
-		pkg->p_bufseg(p_questions) = mdns_buf_alloc(bp, &pkg->p_buflist, 0, 0);
-		pkg->p_buf(p_questions) = MDNS_BUF(pkg->p_bufseg(p_questions));
-	}
+	memcpy(MDNS_BUFPOS(buf), namc, namlen);
+	MDNS_BUFLEN(buf) += namlen;
 
-	buf2 = pkg->p_bufseg(p_questions);
-	memcpy(MDNS_BUFPOS(buf2), namc, namlen);
-	MDNS_BUFLEN(buf2) += namlen;
-
 	class = qs->q_class;
 	if (unicast)
 		class |= 0x8000;
 	qsec.qs_class = ntohs(class);
 	qsec.qs_type = htons(qs->q_type);
 
-	memcpy(MDNS_BUFPOS(buf2), &qsec, sizeof(struct mdns_qsec));
-	MDNS_BUFLEN(buf2) += MDNS_QSET_HLEN;
+	memcpy(MDNS_BUFPOS(buf), &qsec, sizeof(struct mdns_qsec));
+	MDNS_BUFLEN(buf) += MDNS_QSET_HLEN;
 	pkg->p_len += MDNS_QSET_HLEN + namlen;
 	
 	if (pc->pc_flags & MDNS_PC_CONT)
@@ -717,92 +716,84 @@
 	char nam[MDNS_RECORD_LEN + 1], namc[MDNS_RECORD_LEN];
 	struct mdns_packet *pkg;
 	struct mdns_bufpool *bp;
-	struct mdns_buf *buf, *buf2;
+	struct mdns_buf *buf;
 	struct mdns_header *h;
-	ssize_t name_len, namlen, namlen2;
+	ssize_t namlen, namlen2;
 	int i, error, flags;
 	uint16_t class;
 	struct mdns_rsec rsec;
 
 	pkg = pc->pc_pkg;
-	name_len = wcslen(rs->r_name);
-	i = name_len + 1 + MDNS_RRSET_HLEN + rs->r_datalen;
-	buf = MDNS_BUFH(&pkg->p_buflist);
+	namlen = wcslen(rs->r_name);
+	i = namlen + 1 + MDNS_RRSET_HLEN + rs->r_datalen;
 	bp = pc->pc_md->md_bp;
 
+	if (section == SEC_ANSWERS)
+		buf = pkg->p_bufseg(p_answers);
+	else if (section == SEC_AUTHORITY)
+		buf = pkg->p_bufseg(p_auths);
+	else {
+		errno = EINVAL;
+		return (-1);
+	}
+
 	/*
-	 * Expand packet chain or buffer chain if needed
+	 * Expand packet chains, buffer chains and buffers if needed
 	 */
-	if ((i + MDNS_BUFLEN(buf)) > MDNS_BUFSZ(buf)) {
-		if (pc->pc_flags & MDNS_PC_CONT) {
-			buf = mdns_buf_alloc(bp, &pkg->p_buflist, 0, 0);
+	if (buf != NULL && (pc->pc_flags & MDNS_PC_CONT)) {
+		if ((i + MDNS_BUFLEN(buf)) > MDNS_BUFSZ(buf)) {
+			error = mdns_buf_expand(buf, 0);
+			if (error != 0)
+				return (-1);
+			pkg->p_data[section].bufptr = MDNS_BUF(buf);
 		}
-		else {
+	}
+	else {
+		if (pkg->p_len + i > pc->pc_md->md_maxpkgsz) {
 			h = (struct mdns_header *)pkg->p_buf(p_hdr);
 			h->h_tc = 1;
 			pkg = pkg_alloc(pc);
-			flags = MDNS_HEAD_QUERY;
+			flags = MDNS_HEAD_RESP;
 			if (h->h_aa)
 				flags |= MDNS_HEAD_AA;
 			mdns_pkg_sethdr(pc, 0, flags);
-			buf = mdns_buf_alloc(bp, &pkg->p_buflist, 0, 0);
+			buf = NULL;
+		}
+		else if (buf != NULL && (i + MDNS_BUFLEN(buf)) > MDNS_BUFSZ(buf)) {
+			error = mdns_buf_expand(buf, 0);
+			if (error != 0)
+				return (-1);
+			pkg->p_data[section].bufptr = MDNS_BUF(buf);
 		}
 	}
 
-	namlen = utf8_encode(rs->r_name, nam, MDNS_RECORD_LEN);	
-	if (namlen < 0) {
-		errno = EINVAL;
-		return (-1);
-	}
-
-	if (pkg->p_nc_tbl == NULL) {
-		pkg->p_nc_tbl = malloc(sizeof(struct hashtbl));
-		hashtbl_init(pkg->p_nc_tbl, 128);
-	}
-
-	namlen2 = MDNS_RECORD_LEN;
-	error = name_compress(pkg->p_nc_tbl, nam, name_len, namc, &namlen2,
-		pkg->p_len);
-	if (error != 0) {
-		errno = EINVAL;
-		return (-1);
-	}
-	name_len = namlen2;
-
-	if (section == SEC_ANSWERS) {
-		buf2 = pkg->p_bufseg(p_answers);
-	}
-	else if (section == SEC_AUTHORITY) {
-		buf2 = pkg->p_bufseg(p_auths);
-	}
-	else {
-		errno = EINVAL;
-		return (-1);
-	}
-
-	if (buf2 == NULL) {
+	/*
+	 * If no buffer segments exists for this section, allocate one and
+	 * any segments that may preceed them.
+	 */
+	if (buf == NULL) {
 		switch (section) {
 		case SEC_QUESTIONS:
 			if (pkg->p_bufseg(p_questions) == NULL) {
-				buf2 = mdns_buf_alloc(bp, &pkg->p_buflist, 0, 0);
-				pkg->p_bufseg(p_questions) = buf2;
-				pkg->p_buf(p_questions) = MDNS_BUF(buf2);
+				buf = mdns_buf_alloc(bp, &pkg->p_buflist, 0, 0);
+				pkg->p_bufseg(p_questions) = buf;
+				pkg->p_buf(p_questions) = MDNS_BUF(buf);
 				if (section == SEC_QUESTIONS)
 					break;
 			}
 		case SEC_ANSWERS:
 			if (pkg->p_bufseg(p_answers) == NULL) {
-				buf2 = mdns_buf_alloc(bp, &pkg->p_buflist, 0, 0);
-				pkg->p_bufseg(p_answers) = buf2;
-				pkg->p_buf(p_answers) = MDNS_BUF(buf2);
+				buf = mdns_buf_alloc(bp, &pkg->p_buflist, 0, 0);
+				pkg->p_bufseg(p_answers) = buf;
+				pkg->p_buf(p_answers) = MDNS_BUF(buf);
 				if (section == SEC_ANSWERS)
 					break;
 			}
 		case SEC_AUTHORITY:
 			if (pkg->p_bufseg(p_auths) == NULL) {
-				buf2 = mdns_buf_alloc(bp, &pkg->p_buflist, 0, 0);
-				pkg->p_bufseg(p_auths) = buf2;
-				pkg->p_buf(p_auths) = MDNS_BUF(buf2);
+				buf = mdns_buf_alloc(bp, &pkg->p_buflist, 0, 0);
+				pkg->p_bufseg(p_auths) = buf;
+				pkg->p_buf(p_auths) = MDNS_BUF(buf);
 				if (section == SEC_AUTHORITY)
 					break;
 			}
@@ -813,8 +804,28 @@
 		}
 	}
 
-	memcpy(MDNS_BUFPOS(buf2), namc, namlen);
-	MDNS_BUFLEN(buf2) += namlen;
+	namlen = utf8_encode(rs->r_name, nam, MDNS_RECORD_LEN);	
+	if (namlen < 0) {
+		errno = EINVAL;
+		return (-1);
+	}
+
+	if (pkg->p_nc_tbl == NULL) {
+		pkg->p_nc_tbl = malloc(sizeof(struct hashtbl));
+		hashtbl_init(pkg->p_nc_tbl, 128);
+	}
+
+	namlen2 = MDNS_RECORD_LEN;
+	error = name_compress(pkg->p_nc_tbl, nam, namlen, namc, &namlen2,
+		pkg->p_len);
+	if (error != 0) {
+		errno = EINVAL;
+		return (-1);
+	}
+	namlen = namlen2;
+
+	memcpy(MDNS_BUFPOS(buf), namc, namlen);
+	MDNS_BUFLEN(buf) += namlen;
 
 	rsec.rs_type = htons(rs->r_type);
 	class = rs->r_class;
@@ -824,11 +835,11 @@
 	rsec.rs_ttl = htonl(rs->r_ttl);
 	rsec.rs_rdlen = htons(rs->r_datalen);
 
-	memcpy(MDNS_BUFPOS(buf2), &rsec, MDNS_RRSET_HLEN);
-	MDNS_BUFLEN(buf2) += MDNS_RRSET_HLEN;
+	memcpy(MDNS_BUFPOS(buf), &rsec, MDNS_RRSET_HLEN);
+	MDNS_BUFLEN(buf) += MDNS_RRSET_HLEN;
 
-	memcpy(MDNS_BUFPOS(buf2), rs->r_data, rs->r_datalen);
-	MDNS_BUFLEN(buf2) += rs->r_datalen;
+	memcpy(MDNS_BUFPOS(buf), rs->r_data, rs->r_datalen);
+	MDNS_BUFLEN(buf) += rs->r_datalen;
 
 	pkg->p_len += namlen + MDNS_RRSET_HLEN + rs->r_datalen;
 
@@ -886,7 +897,8 @@
 	if (pkg->p_buf(p_questions) == NULL) {	
 		pkg->p_bufseg(p_questions) = hbuf;
 		pkg->p_buf(p_questions) = MDNS_BUF(hbuf) + MDNS_HEADER_LEN;
-		pkg->p_secoff(p_questions) = malloc(sizeof(char *) * ntohs(h->h_qcount));
+		pkg->p_secoff(p_questions) =
+			malloc(sizeof(char *) * ntohs(h->h_qcount));
 		bzero(pkg->p_secoff(p_questions), sizeof(char *) * ntohs(h->h_qcount));
 	}
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200705091903.l49J37Bh040704>