- else
- bzero((caddr_t)&td->td_cb, sizeof (*tp));
- if (ip) {
-#if INET6
- if (isipv6)
- td->td_ip6 = *(struct ip6_hdr *)ip;
- else
- td->td_ip = *(struct ip *)ip;
-#else /* INET6 */
- td->td_ip = *ip;
-#endif /* INET6 */
- } else
-#if INET6
- bzero((caddr_t)&td->_td_ipx, sizeof (td->_td_ipx));
-#else /* INET6 */
- bzero((caddr_t)&td->td_ip, sizeof (*ip));
-#endif /* INET6 */
- if (th)
- td->td_th = *th;
-
+ } else {
+ bzero((caddr_t)&td->td_cb, sizeof(*tp));
+ }
+ if (ipgen) {
+ switch (td->td_family) {
+ case AF_INET:
+ bcopy((caddr_t)ipgen, (caddr_t)&td->td_ti.ti_i,
+ sizeof(td->td_ti.ti_i));
+ bzero((caddr_t)td->td_ip6buf, sizeof(td->td_ip6buf));
+ break;
+ case AF_INET6:
+ bcopy((caddr_t)ipgen, (caddr_t)td->td_ip6buf,
+ sizeof(td->td_ip6buf));
+ bzero((caddr_t)&td->td_ti.ti_i,
+ sizeof(td->td_ti.ti_i));
+ break;
+ default:
+ bzero((caddr_t)td->td_ip6buf, sizeof(td->td_ip6buf));
+ bzero((caddr_t)&td->td_ti.ti_i,
+ sizeof(td->td_ti.ti_i));
+ break;
+ }
+ } else {
+ bzero((caddr_t)&td->td_ti.ti_i, sizeof(td->td_ti.ti_i));
+ bzero((caddr_t)td->td_ip6buf, sizeof(td->td_ip6buf));
+ }
+ if (th) {
+ switch (td->td_family) {
+ case AF_INET:
+ td->td_ti.ti_t = *th;
+ bzero((caddr_t)&td->td_ti6.th, sizeof(td->td_ti6.th));
+ break;
+ case AF_INET6:
+ td->td_ti6.th = *th;
+ bzero((caddr_t)&td->td_ti.ti_t,
+ sizeof(td->td_ti.ti_t));
+ break;
+ default:
+ bzero((caddr_t)&td->td_ti.ti_t,
+ sizeof(td->td_ti.ti_t));
+ bzero((caddr_t)&td->td_ti6.th, sizeof(td->td_ti6.th));
+ break;
+ }
+ } else {
+ bzero((caddr_t)&td->td_ti.ti_t, sizeof(td->td_ti.ti_t));
+ bzero((caddr_t)&td->td_ti6.th, sizeof(td->td_ti6.th));
+ }