PERFORCE change 119589 for review
Fredrik Lindberg
fli at FreeBSD.org
Wed May 9 19:03:08 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=119589
Change 119589 by fli at 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));
}
More information about the p4-projects
mailing list