From owner-p4-projects@FreeBSD.ORG Wed May 9 19:03:07 2007 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id BA63A16A405; Wed, 9 May 2007 19:03:07 +0000 (UTC) X-Original-To: perforce@FreeBSD.org Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 8057616A403 for ; Wed, 9 May 2007 19:03:07 +0000 (UTC) (envelope-from fli@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [69.147.83.41]) by mx1.freebsd.org (Postfix) with ESMTP id 7041613C480 for ; Wed, 9 May 2007 19:03:07 +0000 (UTC) (envelope-from fli@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.8/8.13.8) with ESMTP id l49J37E6040718 for ; Wed, 9 May 2007 19:03:07 GMT (envelope-from fli@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.8/8.13.8/Submit) id l49J37Bh040704 for perforce@freebsd.org; Wed, 9 May 2007 19:03:07 GMT (envelope-from fli@FreeBSD.org) Date: Wed, 9 May 2007 19:03:07 GMT Message-Id: <200705091903.l49J37Bh040704@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to fli@FreeBSD.org using -f From: Fredrik Lindberg To: Perforce Change Reviews Cc: Subject: PERFORCE change 119589 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 09 May 2007 19:03:08 -0000 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)); }