Date: Thu, 15 Feb 2007 15:33:36 GMT From: Paolo Pisati <piso@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 114561 for review Message-ID: <200702151533.l1FFXaaI087890@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=114561 Change 114561 by piso@piso_newluxor on 2007/02/15 15:33:28 o Teach mbuf to skinny. o Axe an useless var. Affected files ... .. //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_skinny.c#13 edit Differences ... ==== //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_skinny.c#13 (text+ko) ==== @@ -63,7 +63,7 @@ if (ah->dport == NULL || ah->sport == NULL || ah->lnk == NULL) return (-1); if (la->skinnyPort != 0 && (ntohs(*ah->sport) == la->skinnyPort || - ntohs(*ah->dport) == la->skinnyPort)) + ntohs(*ah->dport) == la->skinnyPort)) return (0); return (-1); } @@ -305,10 +305,13 @@ size_t hlen, tlen, dlen; struct ip *pip; struct tcphdr *tc; - u_int32_t msgId, t, len, lip; + u_int32_t msgId, len, lip; struct skinny_header *sd; size_t orig_len, skinny_hdr_len = sizeof(struct skinny_header); ConvDirection direction; +#ifdef _KERNEL + struct mbuf *m, *tmp_m; +#endif PULLUP_TCPHDR(pip, ptr); if (pip == NULL) @@ -318,8 +321,16 @@ tlen = ntohs(pip->ip_len); dlen = tlen - hlen; - // XXX broken +#ifdef _KERNEL + m = m_split(*ptr, hlen, M_TRYWAIT); + *ptr = m_pullup(*ptr, hlen); + pip = mtod(*ptr, struct ip *); + tc = (struct tcphdr *)ip_next(pip); + m = m_pullup(m, sizeof(struct skinny_header)); + sd = mtod(m, struct skinny_header *); +#else sd = (struct skinny_header *)tcp_next(tc); +#endif /* * XXX This direction is reserved for future use. I still need to @@ -335,7 +346,7 @@ fprintf(stderr, "PacketAlias/Skinny: Invalid port number, not a Skinny packet\n"); #endif - return; + goto getout; } orig_len = dlen; @@ -349,14 +360,23 @@ while (dlen >= skinny_hdr_len) { len = (sd->len); msgId = (sd->msgId); - t = len; - if (t > orig_len || t > dlen) { +#ifdef _KERNEL + /* + * After this pullup, we'll have a contiguos Skinny Packet + * Header + len of data. + */ + m = m_pullup(m, skinny_hdr_len + len); + if (m == NULL) + goto getout; + sd = mtod(m, struct skinny_header *); +#endif + if (len > orig_len || len > dlen) { #ifdef LIBALIAS_DEBUG fprintf(stderr, "PacketAlias/Skinny: Not a skinny packet, invalid length \n"); #endif - return; + goto getout; } switch (msgId) { case REG_MSG: { @@ -367,7 +387,7 @@ fprintf(stderr, "PacketAlias/Skinny: Not a skinny packet, bad registration message\n"); #endif - return; + goto getout; } reg_mesg = (struct RegisterMessage *)&sd->msgId; #ifdef LIBALIAS_DEBUG @@ -385,7 +405,7 @@ fprintf(stderr, "PacketAlias/Skinny: Not a skinny packet, port message\n"); #endif - return; + goto getout; } #ifdef LIBALIAS_DEBUG fprintf(stderr, @@ -403,7 +423,7 @@ fprintf(stderr, "PacketAlias/Skinny: Not a skinny packet, packet,OpnRcvChnAckMsg\n"); #endif - return; + goto getout; } #ifdef LIBALIAS_DEBUG fprintf(stderr, @@ -421,7 +441,7 @@ fprintf(stderr, "PacketAlias/Skinny: Not a skinny packet,StartMediaTx Message\n"); #endif - return; + goto getout; } #ifdef LIBALIAS_DEBUG fprintf(stderr, @@ -436,6 +456,19 @@ } /* Place the pointer at the next message in the packet. */ dlen -= len + (skinny_hdr_len - sizeof(msgId)); +#ifdef _KERNEL + /* Trim from the beginning of mbuf the data we already used */ + tmp_m = m_split(m, skinny_hdr_len + len, M_TRYWAIT); + m_cat(*ptr, m); + m = tmp_m; + sd = mtod(m, struct skinny_header *); +#else sd = (struct skinny_header *)(((char *)&sd->msgId) + len); +#endif } +getout: +#ifdef _KERNEL + m_cat(*ptr, m); +#endif + return; }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200702151533.l1FFXaaI087890>