diff --git a/sys/netinet/tcp_log_buf.c b/sys/netinet/tcp_log_buf.c --- a/sys/netinet/tcp_log_buf.c +++ b/sys/netinet/tcp_log_buf.c @@ -1808,94 +1808,76 @@ log_buf = &log_entry->tlm_buf; log_verbose = &log_entry->tlm_v; - /* Basic entries. */ - if (itv == NULL) - microuptime(&log_buf->tlb_tv); - else - memcpy(&log_buf->tlb_tv, itv, sizeof(struct timeval)); - log_buf->tlb_ticks = ticks; - log_buf->tlb_sn = logsn; - log_buf->tlb_stackid = tp->t_fb->tfb_id; - log_buf->tlb_eventid = eventid; - log_buf->tlb_eventflags = 0; - log_buf->tlb_errno = errornum; - - /* Socket buffers */ - if (rxbuf != NULL) { - log_buf->tlb_eventflags |= TLB_FLAG_RXBUF; - log_buf->tlb_rxbuf.tls_sb_acc = rxbuf->sb_acc; - log_buf->tlb_rxbuf.tls_sb_ccc = rxbuf->sb_ccc; - log_buf->tlb_rxbuf.tls_sb_spare = 0; - } else { - log_buf->tlb_rxbuf.tls_sb_acc = 0; - log_buf->tlb_rxbuf.tls_sb_ccc = 0; - } - if (txbuf != NULL) { - log_buf->tlb_eventflags |= TLB_FLAG_TXBUF; - log_buf->tlb_txbuf.tls_sb_acc = txbuf->sb_acc; - log_buf->tlb_txbuf.tls_sb_ccc = txbuf->sb_ccc; - log_buf->tlb_txbuf.tls_sb_spare = 0; - } else { - log_buf->tlb_txbuf.tls_sb_acc = 0; - log_buf->tlb_txbuf.tls_sb_ccc = 0; - } - /* Copy values from tp to the log entry. */ - log_buf->tlb_state = tp->t_state; - log_buf->tlb_starttime = tp->t_starttime; - log_buf->tlb_iss = tp->iss; - log_buf->tlb_flags = tp->t_flags; - log_buf->tlb_snd_una = tp->snd_una; - log_buf->tlb_snd_max = tp->snd_max; - log_buf->tlb_snd_cwnd = tp->snd_cwnd; - log_buf->tlb_snd_nxt = tp->snd_nxt; - log_buf->tlb_snd_recover = tp->snd_recover; - log_buf->tlb_snd_wnd = tp->snd_wnd; - log_buf->tlb_snd_ssthresh = tp->snd_ssthresh; - log_buf->tlb_srtt = tp->t_srtt; - log_buf->tlb_rttvar = tp->t_rttvar; - log_buf->tlb_rcv_up = tp->rcv_up; - log_buf->tlb_rcv_adv = tp->rcv_adv; - log_buf->tlb_flags2 = tp->t_flags2; - log_buf->tlb_rcv_nxt = tp->rcv_nxt; - log_buf->tlb_rcv_wnd = tp->rcv_wnd; - log_buf->tlb_dupacks = tp->t_dupacks; - log_buf->tlb_segqlen = tp->t_segqlen; - log_buf->tlb_snd_numholes = tp->snd_numholes; - log_buf->tlb_flex1 = 0; - log_buf->tlb_flex2 = 0; - log_buf->tlb_fbyte_in = tp->t_fbyte_in; - log_buf->tlb_fbyte_out = tp->t_fbyte_out; - log_buf->tlb_snd_scale = tp->snd_scale; - log_buf->tlb_rcv_scale = tp->rcv_scale; - log_buf->_pad[0] = 0; - log_buf->_pad[1] = 0; - log_buf->_pad[2] = 0; - /* Copy stack-specific info. */ - if (stackinfo != NULL) { - memcpy(&log_buf->tlb_stackinfo, stackinfo, - sizeof(log_buf->tlb_stackinfo)); - log_buf->tlb_eventflags |= TLB_FLAG_STACKINFO; - } - - /* The packet */ - log_buf->tlb_len = len; - if (th) { - int optlen; - - log_buf->tlb_eventflags |= TLB_FLAG_HDR; - log_buf->tlb_th = *th; - if (th_hostorder) - tcp_fields_to_net(&log_buf->tlb_th); - optlen = (th->th_off << 2) - sizeof (struct tcphdr); - if (optlen > 0) - memcpy(log_buf->tlb_opts, th + 1, optlen); - } else { - memset(&log_buf->tlb_th, 0, sizeof(*th)); - } + *log_buf = (struct tcp_log_buffer){ + /* Basic entries. */ + .tlb_tv = itv == NULL ? (struct timeval){} : *itv, + .tlb_ticks = ticks, + .tlb_sn = logsn, + .tlb_stackid = tp->t_fb->tfb_id, + .tlb_eventid = eventid, + .tlb_errno = errornum, + .tlb_eventflags = + (rxbuf != NULL ? TLB_FLAG_RXBUF : 0) | + (txbuf != NULL ? TLB_FLAG_TXBUF : 0) | + (stackinfo != NULL ? TLB_FLAG_STACKINFO : 0) | + (th != NULL ? TLB_FLAG_HDR : 0) | + (func != NULL ? TLB_FLAG_VERBOSE : 0), + /* Socket buffers */ + .tlb_rxbuf.tls_sb_acc = rxbuf != NULL ? rxbuf->sb_acc : 0, + .tlb_rxbuf.tls_sb_ccc = rxbuf != NULL ? rxbuf->sb_ccc : 0, + .tlb_txbuf.tls_sb_acc = txbuf != NULL ? txbuf->sb_acc : 0, + .tlb_txbuf.tls_sb_ccc = txbuf != NULL ? txbuf->sb_ccc : 0, + /* Copy values from tp to the log entry. */ + .tlb_state = tp->t_state, + .tlb_starttime = tp->t_starttime, + .tlb_iss = tp->iss, + .tlb_flags = tp->t_flags, + .tlb_flags2 = tp->t_flags2, + .tlb_snd_una = tp->snd_una, + .tlb_snd_max = tp->snd_max, + .tlb_snd_cwnd = tp->snd_cwnd, + .tlb_snd_nxt = tp->snd_nxt, + .tlb_snd_recover = tp->snd_recover, + .tlb_snd_wnd = tp->snd_wnd, + .tlb_snd_ssthresh = tp->snd_ssthresh, + .tlb_srtt = tp->t_srtt, + .tlb_rttvar = tp->t_rttvar, + .tlb_rcv_up = tp->rcv_up, + .tlb_rcv_adv = tp->rcv_adv, + .tlb_rcv_nxt = tp->rcv_nxt, + .tlb_rcv_wnd = tp->rcv_wnd, + .tlb_dupacks = tp->t_dupacks, + .tlb_segqlen = tp->t_segqlen, + .tlb_snd_numholes = tp->snd_numholes, + .tlb_fbyte_in = tp->t_fbyte_in, + .tlb_fbyte_out = tp->t_fbyte_out, + .tlb_snd_scale = tp->snd_scale, + .tlb_rcv_scale = tp->rcv_scale, + /* Copy stack-specific info. */ + .tlb_stackinfo = (stackinfo != NULL) ? *stackinfo : + (union tcp_log_stackspecific) {}, + /* The packet */ + .tlb_len = len, + .tlb_th = (th != NULL) ? + (th_hostorder ? (struct tcphdr){ + .th_sport = th->th_sport, + .th_dport = th->th_dport, + .th_seq = htonl(th->th_seq), + .th_ack = htonl(th->th_ack), + .th_off = th->th_off, + .th_flags = th->th_flags, + .th_win = htons(th->th_win), + .th_sum = th->th_sum, + .th_urp = htons(th->th_urp) + } : *th ) : (struct tcphdr){}, + }; + + if (th != NULL && (th->th_off << 2) - sizeof(struct tcphdr) > 0) + memcpy(log_buf->tlb_opts, th + 1, + (th->th_off << 2) - sizeof(struct tcphdr)); /* Verbose information */ if (func != NULL) { - log_buf->tlb_eventflags |= TLB_FLAG_VERBOSE; if (output_caller != NULL) strlcpy(log_verbose->tlv_snd_frm, output_caller, TCP_FUNC_LEN);