gen_info
lm_tcp_con_rx_gen_info_t * gen_info = &rx_con->u.rx.gen_info;
(gen_info->peninsula_nbytes == 0) &&
lm_tcp_con_rx_gen_info_t gen_info;
gen_info->current_isle = isle;
d_list_add_tail(&gen_info->dpc_peninsula_list, &gen_buf_list);
gen_info->dpc_peninsula_nbytes += isle_nbytes;
gen_info->isle_nbytes -= isle_nbytes;
if (!d_list_is_empty(&con->u.rx.gen_info.dpc_peninsula_list)) {
if (lm_tcp_next_entry_dpc_active_list(con) && con->u.rx.gen_info.dpc_peninsula_nbytes && con->dpc_info.dpc_comp_blocked) {
DbgBreakIf(!d_list_is_empty(&con->u.rx.gen_info.peninsula_list));
con->u.rx.gen_info.bytes_copied_cnt_in_comp += lm_tcp_rx_peninsula_to_rq(pdev, tcp, 0xffffffff,NON_EXISTENT_SB_IDX);
DbgBreakIf(!d_list_is_empty(&con->u.rx.gen_info.dpc_peninsula_list) && curr_tcp_buf && con->dpc_info.dpc_comp_blocked);
if (!d_list_is_empty(&con->u.rx.gen_info.dpc_peninsula_list) && !curr_tcp_buf) {
d_list_add_tail(&con->u.rx.gen_info.peninsula_list, &con->u.rx.gen_info.dpc_peninsula_list);
con->u.rx.gen_info.peninsula_nbytes += con->u.rx.gen_info.dpc_peninsula_nbytes;
con->u.rx.gen_info.dpc_peninsula_nbytes = 0;
if (((lm_tcp_gen_buf_t *)d_list_peek_tail(&con->u.rx.gen_info.peninsula_list))->placed_bytes == 0) {
gen_buf = (lm_tcp_gen_buf_t *)d_list_pop_tail(&con->u.rx.gen_info.peninsula_list);
d_list_init(&con->u.rx.gen_info.dpc_peninsula_list, &gen_buf->link, &gen_buf->link, 1);
d_list_clear(&con->u.rx.gen_info.dpc_peninsula_list);
lm_tcp_con_rx_gen_info_t * gen_info;
if (!d_list_is_empty(&con->u.rx.gen_info.peninsula_list) && _lm_tcp_ok_to_indicate(con)) {
add_sws_bytes += tcp->rx_con->u.rx.gen_info.add_sws_bytes; /* any bytes we need to update will be aggregated here during indicate */
tcp->rx_con->u.rx.gen_info.add_sws_bytes = 0;
gen_info = &tcp->rx_con->u.rx.gen_info;
isles_cnt = (u8_t)d_list_entry_cnt(&gen_info->isles_list);
&& d_list_entry_cnt(&tcp->rx_con->u.rx.gen_info.first_isle.isle_gen_bufs_list_head)) {
gen_buf = (lm_tcp_gen_buf_t *)d_list_peek_tail(&tcp->rx_con->u.rx.gen_info.dpc_peninsula_list);
DbgBreakIf(!d_list_is_empty(&tcp->rx_con->u.rx.gen_info.peninsula_list));
DbgBreakIf(tcp->rx_con->rq_nbytes <= tcp->rx_con->u.rx.gen_info.dpc_peninsula_nbytes+tcp->rx_con->u.rx.skp_bytes_copied); // we got a RQ completion here... so peninsula CAN;T cover RQ!!!
lm_tcp_rx_skp_process(pdev, tcp, tcp->rx_con->u.rx.gen_info.dpc_peninsula_nbytes+tcp->rx_con->u.rx.skp_bytes_copied, sb_idx);
d_list_remove_entry(&gen_info->isles_list, &isle->isle_link);
d_list_remove_entry(&gen_info->isles_list, &new_current_isle->isle_link);
d_list_push_head(&gen_info->isles_list, &isle->isle_link);
new_current_isle = &gen_info->first_isle;
gen_info->current_isle = new_current_isle;
gen_info->current_isle_number = new_current_isle_num;
lm_tcp_con_rx_gen_info_t * gen_info;
gen_info = &rx_con->u.rx.gen_info;
if ( gen_info->peninsula_nbytes ) {
tcp->cid, tcp_buf, frag_list ? frag_list->size : 0, tcp_buf ? tcp_buf->flags : 0, rx_con->u.rx.gen_info.peninsula_nbytes);
gen_info->bytes_copied_cnt_in_post += copied_bytes;
if (gen_info->peninsula_nbytes && _lm_tcp_ok_to_indicate(rx_con)) {
add_sws_bytes += gen_info->add_sws_bytes; /* any bytes we need to update will be aggregated here during indicate */
gen_info->add_sws_bytes = 0;
tcp->cid, tcp_buf, frag_list->size, tcp_buf->flags, rx_con->u.rx.gen_info.peninsula_nbytes);
lm_tcp_con_rx_gen_info_t * gen_info;
gen_info = &rx_con->u.rx.gen_info;
num_bufs_to_indicate = d_list_entry_cnt(&gen_info->peninsula_list);
DbgBreakIf(((lm_tcp_gen_buf_t *)d_list_peek_tail(&gen_info->peninsula_list))->placed_bytes == 0);
*frag_list = gen_info->frag_list;
(*frag_list)->cnt = gen_info->max_frag_count;
num_bufs_to_indicate = gen_info->max_frag_count;
gen_info->num_non_full_indications++;
dont_send_to_system_more_then_rwin = (u8_t)gen_info->dont_send_to_system_more_then_rwin;
entry = d_list_pop_head(&gen_info->peninsula_list);
d_list_push_head(&gen_info->peninsula_list, entry);
ind_nbytes -= gen_info->first_buf_offset;
DbgBreakIf(gen_info->peninsula_nbytes < ind_nbytes);
gen_info->peninsula_nbytes -= ind_nbytes;
gen_offset = gen_info->first_buf_offset;
lm_tcp_con_rx_gen_info_t * gen_info;
gen_info = &rx_con->u.rx.gen_info;
DbgBreakIf(!d_list_is_empty(&gen_info->peninsula_list) &&
(((lm_tcp_gen_buf_t *)d_list_peek_tail(&gen_info->peninsula_list))->placed_bytes == 0));
if (gen_info->peninsula_nbytes == 0) {
gen_info->dont_send_to_system_more_then_rwin = FALSE;
if ((buff_cnt = (u16_t)d_list_entry_cnt(&gen_info->peninsula_list)) > gen_info->max_frag_count) {
tcp->cid, buff_cnt, gen_info->max_frag_count);
if (possible_frag_count > gen_info->max_frag_count) {
decreased_count = (u16_t)gen_info->max_frag_count;
temp_gen_buf = (lm_tcp_gen_buf_t*)d_list_peek_tail(&gen_info->peninsula_list);
unwanted_gen_buf = (lm_tcp_gen_buf_t*)d_list_peek_head(&gen_info->peninsula_list);
unwanted_gen_buf = (lm_tcp_gen_buf_t*)d_list_peek_head(&gen_info->peninsula_list);
d_list_clear(&gen_info->peninsula_list);
gen_info->num_bytes_indicated += (u32_t)(*frag_list)->size;
gen_info->first_buf_offset = 0;
gen_info->num_buffers_indicated += (*gen_buf)->ind_nbufs;
gen_info->peninsula_blocked = TRUE;
lm_tcp_con_rx_gen_info_t * gen_info;
gen_info = &rx_con->u.rx.gen_info;
DbgBreakIf(gen_info->peninsula_blocked == TRUE); /* terminate was already called */
if (gen_info->peninsula_nbytes == 0 || (rx_con->flags & TCP_RX_IND_BLOCKED)) {
if (gen_info->update_window_mode == LM_TOE_UPDATE_MODE_LONG_LOOP) {
gen_info->pending_indicated_bytes += (*gen_buf)->ind_bytes;
gen_info->pending_return_indications++;
lm_tcp_con_rx_gen_info_t * gen_info = &tcp->rx_con->u.rx.gen_info;
DbgBreakIf(gen_info->peninsula_blocked == TRUE); /* terminate was already called */
gen_info->num_bytes_indicated += accepted_bytes;
gen_info->first_buf_offset = 0;
if (gen_info->update_window_mode == LM_TOE_UPDATE_MODE_SHORT_LOOP) {
gen_info->add_sws_bytes += accepted_bytes;
gen_info->num_success_indicates++;
gen_info->bytes_indicated_accepted += accepted_bytes;
gen_info->peninsula_nbytes += gen_buf->ind_bytes - accepted_bytes;
gen_info->num_failed_indicates++;
gen_info->bytes_indicated_accepted+= accepted_bytes;
gen_info->bytes_indicated_rejected+= gen_buf->ind_bytes - accepted_bytes;
gen_info->add_sws_bytes += accepted_bytes;
gen_info->pending_return_indications--;
gen_info->pending_indicated_bytes-=gen_buf->ind_bytes;
nbytes = ((lm_tcp_gen_buf_t *)curr_gen_buf)->placed_bytes - gen_info->first_buf_offset;
gen_info->num_buffers_indicated++;
gen_info->first_buf_offset = 0;
gen_info->first_buf_offset += (u16_t)accepted_bytes;
gen_info->bufs_indicated_rejected++;
d_list_add_head(&gen_info->peninsula_list, &return_to_peninsula_list);
tcp->rx_con->u.rx.gen_info.pending_return_indications--;
tcp->rx_con->u.rx.gen_info.pending_indicated_bytes -= gen_buf->ind_bytes;
if (tcp->rx_con->u.rx.gen_info.pending_return_indications == 0) {
(tcp->rx_con->u.rx.gen_info.peninsula_nbytes != 0) &&
lm_tcp_con_rx_gen_info_t * gen_info = &rx_con->u.rx.gen_info;
u16_t buffers_number = (u16_t)d_list_entry_cnt(&gen_info->peninsula_list);
if ((adjust_number * gen_buff_size) >= gen_info->peninsula_nbytes) {
gen_buf_copy_to = (lm_tcp_gen_buf_t*)d_list_peek_head(&gen_info->peninsula_list);
d_list_remove_entry(&gen_info->peninsula_list, &gen_buf_copy_from->link);
gen_buf_copy_to = (lm_tcp_gen_buf_t*)d_list_peek_head(&gen_info->peninsula_list);
gen_buf_offset = gen_info->first_buf_offset;
gen_buf_offset = gen_info->first_buf_offset = 0;
gen_info->peninsula_nbytes, buffers_number, adjust_number, gen_buff_size);
lm_tcp_con_rx_gen_info_t * gen_info;
gen_info = &tcp_state->rx_con->u.rx.gen_info;
while ((isle_cnt = (u8_t)d_list_entry_cnt(&gen_info->isles_list))) {
DbgBreakIf(!d_list_is_empty(&rx_con->u.rx.gen_info.peninsula_list));
DbgBreakIf(!d_list_is_empty(&rx_con->u.rx.gen_info.dpc_peninsula_list));
DbgBreakIf(!d_list_is_empty(&rx_con->u.rx.gen_info.peninsula_list));
DbgBreakIfAll(d_list_is_empty(&rx_con->u.rx.gen_info.dpc_peninsula_list));
DbgBreakIf(((lm_tcp_gen_buf_t *)d_list_peek_head(&rx_con->u.rx.gen_info.dpc_peninsula_list))->placed_bytes == 0);
rx_con->u.rx.gen_info.bytes_copied_cnt_in_process += lm_tcp_rx_peninsula_to_rq(pdev, tcp, bytes_skipped,sb_idx);
lm_tcp_con_rx_gen_info_t * gen_info;
gen_info = &rx_con->u.rx.gen_info;
DbgBreakIf(isle_nbytes > gen_info->isle_nbytes);
gen_info->isle_nbytes -= isle_nbytes;
lm_tcp_con_rx_gen_info_t * gen_info;
gen_info = &tcp->rx_con->u.rx.gen_info;
peninsula = &gen_info->dpc_peninsula_list;
peninsula = &gen_info->peninsula_list;
ncopy = curr_gen_buf->placed_bytes - gen_info->first_buf_offset;
curr_gen_buf->buf_virt + gen_info->first_buf_offset, /* start of data in generic buffer */
gen_info->copy_gen_buf_dmae_cnt++;
gen_info->first_buf_offset, /* start of data in generic buffer */
gen_info->copy_gen_buf_fail_cnt++;
gen_info->copy_gen_buf_fail_cnt++;
gen_info->first_buf_offset += (u16_t)ncopy;
if (curr_gen_buf->placed_bytes == gen_info->first_buf_offset) {
gen_info->first_buf_offset = 0;
gen_info->num_buffers_copied_grq++;
gen_info->dpc_peninsula_nbytes -= bytes_copied;
gen_info->peninsula_nbytes -= bytes_copied;
lm_tcp_con_rx_gen_info_t * gen_info;
gen_info = &tcp->rx_con->u.rx.gen_info;
DbgBreakIf(gen_info->peninsula_blocked == TRUE); /* terminate was already called - no copying should be done */
while (max_num_bytes_to_copy && gen_info->dpc_peninsula_nbytes && curr_tcp_buf) {
lm_tcp_con_rx_gen_info_t * gen_info;
gen_info = &rx_con->u.rx.gen_info;
gen_info->dpc_peninsula_nbytes += nbytes;
last_gen_buf = (lm_tcp_gen_buf_t *)d_list_peek_tail(&gen_info->dpc_peninsula_list);
d_list_push_tail(&gen_info->dpc_peninsula_list, &gen_buf->link);
lm_tcp_con_rx_gen_info_t * gen_info;
gen_info = &rx_con->u.rx.gen_info;
isles_cnt = (u8_t)d_list_entry_cnt(&gen_info->isles_list);
lm_tcp_con_rx_gen_info_t * gen_info;
current_isle = &gen_info->first_isle;
if (current_isle != &gen_info->first_isle) {
*current_isle = gen_info->first_isle;
d_list_init(&gen_info->first_isle.isle_gen_bufs_list_head, NULL, NULL, 0);
d_list_push_head(&gen_info->first_isle.isle_gen_bufs_list_head, &gen_buf->link);
gen_info->first_isle.isle_nbytes = 0;
isle_entry_prev = &gen_info->first_isle.isle_link;
isle_entry_next = gen_info->first_isle.isle_link.next;
isle_entry_prev = gen_info->isles_list.tail;
d_list_insert_entry(&gen_info->isles_list, isle_entry_prev, isle_entry_next, ¤t_isle->isle_link);
current_isle = &gen_info->first_isle;
gen_info->current_isle = current_isle;
gen_info->current_isle_number = isle_num;
gen_info = &tcp->rx_con->u.rx.gen_info;
if (isles_cnt == gen_info->max_number_of_isles) {
gen_info->max_number_of_isles++;
lm_tcp_con_rx_gen_info_t * gen_info;
isle_cnt = (u8_t)d_list_entry_cnt(&gen_info->isles_list);
gen_info = &rx_con->u.rx.gen_info;
gen_info->isle_nbytes += nbytes;
if (num_isle == gen_info->current_isle_number) {
isle = gen_info->current_isle;
lm_tcp_con_rx_gen_info_t * gen_info;
gen_info = &rx_con->u.rx.gen_info;
isle = (lm_isle_t*)gen_info->isles_list.head;
DbgBreakIf(!gen_info->wait_for_isle_left);
gen_info->wait_for_isle_left = FALSE;
gen_info->isle_nbytes += nbytes;
DbgBreakIf(gen_info->wait_for_isle_left);
gen_info->wait_for_isle_left = TRUE;
lm_tcp_con_rx_gen_info_t * gen_info;
gen_info = &rx_con->u.rx.gen_info;
gen_info->current_isle_number = num_isle;
DbgBreakIf(d_list_entry_cnt(&gen_info->dpc_peninsula_list) &&
((lm_tcp_gen_buf_t *)(d_list_peek_tail(&gen_info->dpc_peninsula_list)))->placed_bytes == 0);
tcp->rx_con->u.rx.gen_info.frag_list = (lm_frag_list_t *)mblk->free;
tcp->rx_con->u.rx.gen_info.max_frag_count = _lm_tcp_calc_frag_cnt(pdev, tcp->tcp_cached.initial_rcv_wnd, tcp->rx_con->u.rx.sws_info.mss);
lm_tcp_con_rx_gen_info_t * gen_info = NULL;
gen_info = &tcp->rx_con->u.rx.gen_info;
DbgBreakIf(!d_list_is_empty(&gen_info->peninsula_list));
d_list_add_head(&gen_info->peninsula_list, buffered_data);
gen_info->peninsula_nbytes += curr_gen_buf->placed_bytes;
uctx_st->pen_grq_placed_bytes = tcp->rx_con->u.rx.gen_info.peninsula_nbytes;
if (tcp->rx_con->u.rx.gen_info.peninsula_nbytes > tcp->tcp_cached.initial_rcv_wnd) {
tcp->rx_con->u.rx.sws_info.extra_bytes = tcp->rx_con->u.rx.gen_info.peninsula_nbytes - tcp->tcp_cached.initial_rcv_wnd;
DbgMessage(pdev, INFORMl4sp, "lm_tcp_init_tcp_state: pnb:%x, irw:%x, ext:%x, rnx:%x\n",tcp->rx_con->u.rx.gen_info.peninsula_nbytes,
expect_rwin += tcp->rx_con->u.rx.gen_info.peninsula_nbytes;
DbgMessage(pdev, INFORMl4sp, "lm_tcp_init_tcp_state: pnb:%x, irw:%x, rws:%x, rnx:%x\n",tcp->rx_con->u.rx.gen_info.peninsula_nbytes,
tcp->rx_con->u.rx.gen_info.dont_send_to_system_more_then_rwin = FALSE; //TRUE;
pdev->toe_info.stats.rx_accepted_indications += tcp->rx_con->u.rx.gen_info.num_success_indicates;
pdev->toe_info.stats.rx_bufs_indicated_accepted += tcp->rx_con->u.rx.gen_info.num_buffers_indicated;
pdev->toe_info.stats.rx_bytes_indicated_accepted += tcp->rx_con->u.rx.gen_info.bytes_indicated_accepted;
pdev->toe_info.stats.rx_rejected_indications += tcp->rx_con->u.rx.gen_info.num_failed_indicates;
pdev->toe_info.stats.rx_bufs_indicated_rejected += tcp->rx_con->u.rx.gen_info.bufs_indicated_rejected;
pdev->toe_info.stats.rx_bytes_indicated_rejected += tcp->rx_con->u.rx.gen_info.bytes_indicated_rejected;
pdev->toe_info.stats.total_num_non_full_indications += tcp->rx_con->u.rx.gen_info.num_non_full_indications;
pdev->toe_info.stats.rx_bufs_copied_grq += tcp->rx_con->u.rx.gen_info.num_buffers_copied_grq;
pdev->toe_info.stats.rx_bufs_copied_rq += tcp->rx_con->u.rx.gen_info.num_buffers_copied_rq;
pdev->toe_info.stats.rx_bytes_copied_in_comp += tcp->rx_con->u.rx.gen_info.bytes_copied_cnt_in_comp;
pdev->toe_info.stats.rx_bytes_copied_in_post += tcp->rx_con->u.rx.gen_info.bytes_copied_cnt_in_post;
pdev->toe_info.stats.rx_bytes_copied_in_process += tcp->rx_con->u.rx.gen_info.bytes_copied_cnt_in_process;
if (pdev->toe_info.stats.max_number_of_isles_in_single_con < tcp->rx_con->u.rx.gen_info.max_number_of_isles) {
pdev->toe_info.stats.max_number_of_isles_in_single_con = tcp->rx_con->u.rx.gen_info.max_number_of_isles;
num_isles = d_list_entry_cnt(&tcp_con->u.rx.gen_info.isles_list);
num_bytes_in_isles = tcp_con->u.rx.gen_info.isle_nbytes;
if(!d_list_is_empty(&tcp_con->u.rx.gen_info.dpc_peninsula_list)) {
d_list_add_tail(&released_list_of_gen_bufs,&tcp_con->u.rx.gen_info.dpc_peninsula_list);
d_list_init(&tcp->rx_con->u.rx.gen_info.dpc_peninsula_list, NULL, NULL, 0);
if (!d_list_is_empty(&tcp_con->u.rx.gen_info.peninsula_list)) {
d_list_add_tail(&released_list_of_gen_bufs,&tcp_con->u.rx.gen_info.peninsula_list);
d_list_init(&tcp->rx_con->u.rx.gen_info.peninsula_list, NULL, NULL, 0);
pdev->toe_info.stats.total_bytes_lost_on_upload += tcp_con->u.rx.gen_info.peninsula_nbytes;
DbgBreakIf( !d_list_is_empty(&tcp->rx_con->u.rx.gen_info.dpc_peninsula_list) );
is_empty_peninsula = (rx_con->u.rx.gen_info.peninsula_nbytes > 0 ? 0 : 1);
DbgBreakIf( !d_list_is_empty(&tcp->rx_con->u.rx.gen_info.dpc_peninsula_list) );
if (rx_con->u.rx.gen_info.peninsula_nbytes || mm_tcp_indicating_bufs(rx_con) ) {
DbgBreakIf( !d_list_is_empty(&tcp->rx_con->u.rx.gen_info.peninsula_list) &&
(((lm_tcp_gen_buf_t *)(d_list_peek_tail(&tcp->rx_con->u.rx.gen_info.peninsula_list)))->placed_bytes == 0));
DbgBreakIf( !d_list_is_empty(&tcp->rx_con->u.rx.gen_info.peninsula_list) &&
(((lm_tcp_gen_buf_t *)(d_list_peek_tail(&tcp->rx_con->u.rx.gen_info.peninsula_list)))->placed_bytes == 0));
tcp->rx_con->u.rx.gen_info.pending_indicated_bytes;
gen_info, /* getinfo */
static int gen_info(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg,