void ldp_label_request_prepare_msg(ldp_mesg * msg, uint32_t msgid,
  ldp_attr * s_attr)
{
  mplsLdpLblReqMsg_t *req = NULL;
  int i;

  ldp_mesg_prepare(msg, MPLS_LBLREQ_MSGTYPE, msgid);
  req = &msg->u.request;

  if (s_attr->fecTlvExists) {
    req->fecTlvExists = 1;
    req->baseMsg.msgLength += setupFecTlv(&req->fecTlv);
    req->baseMsg.msgLength += addFecElem2FecTlv(&req->fecTlv,
      &s_attr->fecTlv.fecElArray[0]);
  }
  if (s_attr->hopCountTlvExists) {
    req->hopCountTlvExists = 1;
    req->baseMsg.msgLength += setupHopCountTlv(&req->hopCountTlv,
      s_attr->hopCountTlv.hcValue);
  }
  if (s_attr->pathVecTlvExists) {
    req->pathVecTlvExists = 1;
    req->baseMsg.msgLength += setupPathTlv(&req->pathVecTlv);
    for (i = 0; i < MPLS_MAXHOPSNUMBER; i++) {
      if (s_attr->pathVecTlv.lsrId[i]) {
        req->baseMsg.msgLength += addLsrId2PathTlv(&req->pathVecTlv,
          s_attr->pathVecTlv.lsrId[i]);
      }
    }
  }
}
void ldp_label_rel_with_prepare_msg(ldp_mesg * msg, uint32_t msgid,
  ldp_attr * a, ldp_notif_status status, uint16_t type)
{
  mplsLdpLbl_W_R_Msg_t *rw = NULL;

  ldp_mesg_prepare(msg, type, msgid);
  rw = &msg->u.release;
  if (a->fecTlvExists) {
    rw->fecTlvExists = 1;
    rw->baseMsg.msgLength += setupFecTlv(&rw->fecTlv);
    rw->baseMsg.msgLength += addFecElem2FecTlv(&rw->fecTlv,
      &a->fecTlv.fecElArray[0]);
  }
  if (a->genLblTlvExists) {
    rw->genLblTlvExists = 1;
    rw->baseMsg.msgLength += setupGenLblTlv(&rw->genLblTlv, a->genLblTlv.label);
  }
  if (a->atmLblTlvExists) {
    rw->atmLblTlvExists = 1;
    rw->baseMsg.msgLength += setupAtmLblTlv(&rw->atmLblTlv, 0, 0,
      a->atmLblTlv.flags.flags.vpi, a->atmLblTlv.vci);
  }
  if (a->frLblTlvExists) {
    rw->frLblTlvExists = 1;
    rw->baseMsg.msgLength += setupFrLblTlv(&rw->frLblTlv, 0,
      a->frLblTlv.flags.flags.len, a->frLblTlv.flags.flags.dlci);
  }
  if (a->lspidTlvExists) {
    rw->lspidTlvExists = 1;
    rw->baseMsg.msgLength += setupLspidTlv(&rw->lspidTlv, 0,
      a->lspidTlv.localCrlspId, a->lspidTlv.routerId);
  }
}
void ldp_label_mapping_prepare_msg(ldp_mesg * msg, uint32_t msgid,
  ldp_attr * s_attr)
{
  mplsLdpLblMapMsg_t *map = NULL;
  int i;

  MPLS_ASSERT(msg);

  ldp_mesg_prepare(msg, MPLS_LBLMAP_MSGTYPE, msgid);
  map = &msg->u.map;

  if (s_attr->fecTlvExists) {
    /* JLEU: only 1 FEC is allowed!! */
    map->fecTlvExists = 1;
    map->baseMsg.msgLength += setupFecTlv(&map->fecTlv);
    map->baseMsg.msgLength += addFecElem2FecTlv(&map->fecTlv,
      &s_attr->fecTlv.fecElArray[0]);
  }
  if (s_attr->genLblTlvExists) {
    map->genLblTlvExists = 1;
    map->baseMsg.msgLength += setupGenLblTlv(&map->genLblTlv,
      s_attr->genLblTlv.label);
  }
  if (s_attr->atmLblTlvExists) {
    map->atmLblTlvExists = 1;
    map->baseMsg.msgLength += setupAtmLblTlv(&map->atmLblTlv, 0, 0,
      s_attr->atmLblTlv.flags.flags.vpi, s_attr->atmLblTlv.vci);
  }
  if (s_attr->frLblTlvExists) {
    map->frLblTlvExists = 1;
    map->baseMsg.msgLength += setupFrLblTlv(&map->frLblTlv, 0,
      s_attr->frLblTlv.flags.flags.len, s_attr->frLblTlv.flags.flags.dlci);
  }
  if (s_attr->hopCountTlvExists) {
    map->hopCountTlvExists = 1;
    map->baseMsg.msgLength += setupHopCountTlv(&map->hopCountTlv,
      s_attr->hopCountTlv.hcValue);
  }
  if (s_attr->pathVecTlvExists) {
    map->pathVecTlvExists = 1;
    map->baseMsg.msgLength += setupPathTlv(&map->pathVecTlv);
    for (i = 0; i < MPLS_MAXHOPSNUMBER; i++) {
      if (s_attr->pathVecTlv.lsrId[i]) {
        map->baseMsg.msgLength += addLsrId2PathTlv(&map->pathVecTlv,
          s_attr->pathVecTlv.lsrId[i]);
      }
    }
  }
#if 0
  if (s_attr->lblMsgIdTlvExists) {
  }
  if (s_attr->lspidTlvExists) {
  }
  if (s_attr->trafficTlvExists) {
  }
#endif
}