mpls_return_enum ldp_label_rel_with_send(ldp_global * g, ldp_session * s, ldp_attr * a, ldp_notif_status status, uint16_t type) { LDP_ENTER(g->user_data, "ldp_label_rel_with_send"); ldp_label_rel_with_prepare_msg(s->tx_message, g->message_identifier++, a, status, type); ldp_mesg_send_tcp(g, s, s->tx_message); LDP_EXIT(g->user_data, "ldp_label_rel_with_send"); return MPLS_SUCCESS; }
mpls_return_enum ldp_label_request_send(ldp_global * g, ldp_session * s, ldp_attr * us_attr, ldp_attr ** ds_attr) { ldp_attr *ds_temp; mpls_fec fec; LDP_ENTER(g->user_data, "ldp_label_request_send"); MPLS_ASSERT(ds_attr && *ds_attr); fec_tlv2mpls_fec(&((*ds_attr)->fecTlv), 0, &fec); if ((ds_temp = ldp_attr_find_downstream_state(g, s, &fec, LDP_LSP_STATE_REQ_SENT)) != NULL) { /* SLRq.1 */ LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_SEND, LDP_TRACE_FLAG_LABEL, "Label Request Send: request already pending(%d)\n", ds_temp->index); ldp_attr_add_us2ds(us_attr, ds_temp); /* we do not need the one passed in, but make sure that the caller is using this one from here forth */ ldp_attr_remove_complete(g, *ds_attr, MPLS_BOOL_TRUE); *ds_attr = ds_temp; return MPLS_SUCCESS; } if (s->no_label_resource_recv == MPLS_BOOL_TRUE) { /* SLRq.2 */ goto ldp_label_request_send_error; } (*ds_attr)->msg_id = g->message_identifier++; ldp_label_request_prepare_msg(s->tx_message, (*ds_attr)->msg_id, *ds_attr); LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_SEND, LDP_TRACE_FLAG_LABEL, "Label Request Sent: session(%d)\n", s->index); if (ldp_mesg_send_tcp(g, s, s->tx_message) == MPLS_FAILURE) { /* SLRq.3 */ LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_SEND, LDP_TRACE_FLAG_ERROR, "Label Request send failed\n"); goto ldp_label_request_send_error; } (*ds_attr)->state = LDP_LSP_STATE_REQ_SENT; if (ldp_attr_insert_downstream(g, s, (*ds_attr)) == MPLS_FAILURE) { /* SLRq.4 */ LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_SEND, LDP_TRACE_FLAG_ERROR, "Couldn't insert sent attributes in tree\n"); goto ldp_label_request_send_error; } if (us_attr) { ldp_attr_add_us2ds(us_attr, *ds_attr); } LDP_EXIT(g->user_data, "ldp_label_request_send"); return MPLS_SUCCESS; /* SLRq.5 */ ldp_label_request_send_error: LDP_PRINT(g->user_data, "SLRq.6\n"); (*ds_attr)->state = LDP_LSP_STATE_NO_LABEL_RESOURCE_SENT; ldp_attr_insert_downstream(g, s, (*ds_attr)); /* SLRq.6 */ LDP_EXIT(g->user_data, "ldp_label_request_send-error"); return MPLS_FAILURE; /* SLRq.7 */ }
mpls_return_enum ldp_label_mapping_send(ldp_global * g, ldp_session * s, ldp_fec *f, ldp_attr * us_attr, ldp_attr * ds_attr) { ldp_inlabel *in = NULL; ldp_attr *us_temp, *existing = NULL; LDP_ENTER(g->user_data, "ldp_label_mapping_send"); MPLS_ASSERT(us_attr); #if 0 /* * before we can enable this, inlabels need to keep track of all of * the attr that link to it. Then when running in DU independent mode we * can correctly attach the us and ds attrs involved when propogating a * new mapping for a FEC we've already distributed labels for */ existing = ldp_attr_find_upstream_map_in_labelspace(f, s->cfg_label_space); #endif if (existing) { LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_ALL, LDP_TRACE_FLAG_BINDING, "Using an existing label\n"); in = existing->inlabel; ldp_attr_add_inlabel(us_attr, in); } else { LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_ALL, LDP_TRACE_FLAG_BINDING, "Generating a label\n"); in = ldp_inlabel_create_complete(g, s, us_attr); } if (!in) { /* SL.1-3 */ goto Send_Label_9; } LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_ALL, LDP_TRACE_FLAG_BINDING, "In Label Added\n"); us_attr->state = LDP_LSP_STATE_MAP_SENT; us_attr->msg_id = g->message_identifier; ldp_label_mapping_prepare_msg(s->tx_message, g->message_identifier++, us_attr); if (ldp_mesg_send_tcp(g, s, s->tx_message) != MPLS_SUCCESS) { /* SL.4 */ LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_SEND, LDP_TRACE_FLAG_ERROR, "Failed sending Label Mapping to %s\n", s->session_name); goto ldp_label_mapping_send_error; } LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_SEND, LDP_TRACE_FLAG_LABEL, "Label Mapping Sent to %s for %08x/%d\n", s->session_name, us_attr->fecTlv.fecElArray[0].addressEl.address, us_attr->fecTlv.fecElArray[0].addressEl.preLen); us_attr->state = LDP_LSP_STATE_MAP_SENT; /* SL.6,7 */ LDP_EXIT(g->user_data, "ldp_label_mapping_send"); return MPLS_SUCCESS; /* SL.8 */ Send_Label_9: LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_ALL, LDP_TRACE_FLAG_STATE, "No Label Resources\n"); while ((us_temp = ldp_attr_find_upstream_state2(g, s, us_attr->fec, LDP_LSP_STATE_REQ_RECV)) != NULL) { /* SL.9 */ ldp_notif_send(g, s, us_temp, LDP_NOTIF_NO_LABEL_RESOURCES_AVAILABLE); /* SL.10 */ s->no_label_resource_sent = MPLS_BOOL_TRUE; /* SL.12 */ us_temp->state = LDP_LSP_STATE_NO_LABEL_RESOURCE_SENT; /* SL.13 */ } LDP_EXIT(g->user_data, "ldp_label_mapping_send"); return MPLS_SUCCESS; ldp_label_mapping_send_error: LDP_EXIT(g->user_data, "ldp_label_mapping_send-error"); return MPLS_FAILURE; }