⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rsvpte_packet.c

📁 Linux平台下
💻 C
📖 第 1 页 / 共 3 页
字号:
int rsvpteEncodeExplicitRoute6(rsvpExplicitRoute6_t * er, u_char * buf, int bufSize) {    rsvpExplicitRoute6_t erCopy;    if (RSVP_ER6_SIZE > bufSize) {	return MPLS_ENC_BUFFTOOSMALL;    }    erCopy = *er;    erCopy.flags.mark = htons(er->flags.mark);    memcpy(buf, &erCopy, RSVP_ER6_SIZE);    return RSVP_ER6_SIZE;}int rsvpteDecodeExplicitRoute6(rsvpExplicitRoute6_t * er, u_char * buf, int bufSize) {    if (RSVP_ER6_SIZE > bufSize) {	return MPLS_DEC_BUFFTOOSMALL;    }    memcpy(er, buf, RSVP_ER6_SIZE);    er->flags.mark = ntohs(er->flags.mark);    return RSVP_ER6_SIZE;}int rsvpteEncodeExplicitRouteAsn(rsvpExplicitRouteAsn_t * er, u_char * buf, int bufSize) {    rsvpExplicitRouteAsn_t erCopy;    if (RSVP_ERASN_SIZE > bufSize) {	return MPLS_ENC_BUFFTOOSMALL;    }    erCopy = *er;    erCopy.flags.mark = htons(er->flags.mark);    memcpy(buf, &erCopy, RSVP_ER6_SIZE);    return RSVP_ERASN_SIZE;}int rsvpteDecodeExplicitRouteAsn(rsvpExplicitRouteAsn_t * er, u_char * buf, int bufSize) {    if (RSVP_ERASN_SIZE > bufSize) {	return MPLS_DEC_BUFFTOOSMALL;    }    memcpy(er, buf, RSVP_ERASN_SIZE);    er->flags.mark = ntohs(er->flags.mark);    return RSVP_ERASN_SIZE;}int rsvpteEncodeExplicitRouteObject(rsvpExplicitRouteObject_t * er, u_char * buf, int bufSize) {    int encodedSize = 0;    char *bufHdr = buf;    int size;    if (RSVP_OBJECT_HDRSIZE > bufSize) {        return MPLS_ENC_BUFFTOOSMALL;    }    size = RSVP_OBJECT_HDRSIZE;    encodeSize += size;    bufSize -= size;    buf += size;    for (i = 0;i < er->eroLength;i++) {	switch(er->eroType[i]) {	    case RSVP_ERO_TYPE_IPV4:		size = rsvpteEncodeExplicitRoute4(&er->ero[i], buf, bufSize);		break;	    case RSVP_ERO_TYPE_IPV6:		size = rsvpteEncodeExplicitRoute6(&er->ero[i], buf, bufSize);		break;	    case RSVP_ERO_TYPE_ASN:		size = rsvpteEncodeExplicitRouteAsn(&er->ero[i], buf, bufSize);		break;  	    default:		return RSVP_ENC_OBJECTERROR;	}	if (size < 0) {	    return size;	}	encodeSize += size;	bufSize -= size;	buf += size;    }    session->hdr.length = encodeSize;    session->hdr.class = RSVP_EXPLICIT_ROUTE_CLASS;    session->hdr.cType = RSVP_EXPLICIT_ROUTE_CTYPE;    size = rsvpteEncodeObjectHeader(&session->hdr, bufHdr, RSVP_OBJECT_HDRSIZE);    if (size < 0) {        return size;    }    return encodeSize;}int rsvpteDecodeExplicitRouteSubObjectHdr(rsvpExplicitRouteFlag_t * hdr, u_char * buf, int bufSize) {    u_short temp;    if (sizeof(u_short) > bufSize) {	return MPLS_DEC_BUFFTOOSMALL;    }    memcpy(&temp, buf, sizeof(u_short));    temp = ntohs(temp);    memcpy(hdr, &temp, sizeof(u_short));    return sizeof(u_short);}int rsvpteDecodeExplicitRouteObject(rsvpExplicitRouteObject_t * er, u_char * buf, int bufSize) {    rsvpExplicitRouteFlag_t erFlag;    int decodedSize = 0;    int size = rsvpteDecodeObjectHeader(&session->hdr, buf, bufSize);    if (size < 0) {        return size;    }    decodeSize += size;    bufSize -= size;    buf += size;    if (session->hdr.length > bufSize) {        return MPLS_DEC_BUFFTOOSMALL;    }    if (session->hdr.class != RSVP_EXPLICIT_ROUTE_CLASS) {        return RSVP_DEC_OBJECTERROR;    }    while (decodeSize < session->hdr.length) {	result = rsvpteDecodeExplicitRouteSubObjectHdr(&erFlag, buf, bufSize);	switch(erFlag.type) {	    case RSVP_ERO_TYPE_IPV4:		size = rsvpteDecodeExplicitRoute4(&er->ero[i], buf, bufSize);		break;	    case RSVP_ERO_TYPE_IPV6:		size = rsvpteDecodeExplicitRoute6(&er->ero[i], buf, bufSize);		break;	    case RSVP_ERO_TYPE_ASN:		size = rsvpteDecodeExplicitRouteAsn(&er->ero[i], buf, bufSize);		break;	    default:		return RSVP_DEC_OBJECTERROR;	}	er->eroType[i] = erFlag.type;	if (size < 0) {	    return size;	}	decodeSize += size;	bufSize -= size;	buf += size;	i++;    }    er->erLength = i;    return decodeSize;}/* Label Request Object */int rsvpteEncodeLabelReqGeneric(rsvpLabelReqGeneric_t * gen, u_char * buf, int bufSize) {    rsvpLabelReqGeneric_t genCopy;    if (RSVP_LABELREQ_GENERIC_SIZE > bufSize) {	return MPLS_ENC_BUFFTOOSMALL;    }    genCopy.reserved = htons(gen->reserved);    genCopy.l3pid = htons(gen->l3pid);    memcpy(buf, &genCopy, RSVP_LABELREQ_GENERIC_SIZE);    return RSVP_LABELREQ_GENERIC_SIZE;}int rsvpteDecodeLabelReqGeneric(rsvpLabelReqGeneric_t * gen, u_char * buf, int bufSize) {    if (RSVP_LABELREQ_GENERIC_SIZE > bufSize) {	return MPLS_DEC_BUFFTOOSMALL;    }    memcpy(er, buf, RSVP_LABELREQ_GENERIC_SIZE);    gen->genCopy.reserved = ntohs(gen->genCopy.reserved);    gen->genCopy.l3pid = ntohs(gen->genCopy.l3pid);    return RSVP_LABELREQ_GENERIC_SIZE;}int rsvpteEncodeLabelReqAtm(rsvpLabelReqAtm_t * atm, u_char * buf, int bufSize) {    rsvpLabelReqAtm_t atmCopy;    if (RSVP_LABELREQ_ATM_SIZE > bufSize) {	return MPLS_ENC_BUFFTOOSMALL;    }    atmCopy.reserved = htons(atm->reserved);    atmCopy.l3pid = htons(atm->l3pid);    atmCopy.minFlags.mark = htons(atm->minFlags.mark);    atmCopy.minVci = htons(atm->minVci);    atmCopy.maxFlags.mark = htons(atm->maxFlags.mark);    atmCopy.maxVci = htons(atm->maxVci);    memcpy(buf, &atmCopy, RSVP_LABELREQ_ATM_SIZE);    return RSVP_LABELREQ_ATM_SIZE;}int rsvpteDecodeLabelReqAtm(rsvpLabelReqAtm_t * atm, u_char * buf, int bufSize) {    if (RSVP_LABELREQ_ATM_SIZE > bufSize) {	return MPLS_DEC_BUFFTOOSMALL;    }    memcpy(atm, buf, RSVP_LABELREQ_ATM_SIZE);    atm->reserved = htons(atm->reserved);    atm->l3pid = htons(atm->l3pid);    atm->minFlags.mark = htons(atm->minFlags.mark);    atm->minVci = htons(atm->minVci);    atm->maxFlags.mark = htons(atm->maxFlags.mark);    atm->maxVci = htons(atm->maxVci);    return RSVP_LABELREQ_ATM_SIZE;}int rsvpteEncodeLabelReqFr(rsvpLabelReqFr_t * fr, u_char * buf, int bufSize) {    rsvpLabelReqFr_t frCopy;    if (RSVP_LABELREQ_FR_SIZE > bufSize) {	return MPLS_ENC_BUFFTOOSMALL;    }    frCopy.reserved = htons(fr->reserved);    frCopy.l3pid = htons(fr->l3pid);    frCopy.minFlags.mark = htons(fr->minFlags.mark);    frCopy.maxFlags.mark = htons(fr->maxFlags.mark);    memcpy(buf, &frCopy, RSVP_LABELREQ_FR_SIZE);    return RSVP_LABELREQ_FR_SIZE;}int rsvpteDecodeLabelReqFr(rsvpLabelReqFr_t * fr, u_char * buf, int bufSize) {    if (RSVP_LABELREQ_FR_SIZE > bufSize) {	return MPLS_DEC_BUFFTOOSMALL;    }    memcpy(fr, buf, RSVP_LABELREQ_FR_SIZE);    fr->reserved = htons(fr->reserved);    fr->l3pid = htons(fr->l3pid);    fr->minFlags.mark = htons(fr->minFlags.mark);    fr->maxFlags.mark = htons(fr->maxFlags.mark);    return RSVP_LABELREQ_FR_SIZE;}int rsvpteEncodeLabelRequestObject(rsvpLabelRequestObject_t * req, u_char * buf, int bufSize) {    int encodedSize = 0;    char *bufHdr = buf;    int size;    if (RSVP_OBJECT_HDRSIZE > bufSize) {        return MPLS_ENC_BUFFTOOSMALL;    }    size = RSVP_OBJECT_HDRSIZE;    encodeSize += size;    bufSize -= size;    buf += size;    switch(req->hdr.cType) {	case RSVP_LABEL_REQUEST_CTYPE_GENERIC:	    size = rsvpteEncodeLabelReqGeneric(&req->u.generic, buf, bufSize);	    break;	case RSVP_LABEL_REQUEST_CTYPE_ATM:	    size = rsvpteEncodeLabelReqAtm(&req->u.atm, buf, bufSize);	    break;	case RSVP_LABEL_REQUEST_CTYPE_FR:	    size = rsvpteEncodeLabelReqFr(&req->u.fr, buf, bufSize);	    break;  	default:	    return RSVP_DEC_OBJECTERROR;    }    if (size < 0) {        return size;    }    encodeSize += size;    req->hdr.length = encodeSize;    req->hdr.class = RSVP_LABEL_REQUEST_CLASS;    size = rsvpteEncodeObjectHeader(&req->hdr, bufHdr, RSVP_OBJECT_HDRSIZE);    if (size < 0) {        return size;    }    return encodeSize;}int rsvpteDecodeLabelRequestObject(rsvpLabelRequestObject_t * req, u_char * buf, int bufSize) {    int decodedSize = 0;    int size = rsvpteDecodeObjectHeader(&req->hdr, buf, bufSize);    if (size < 0) {        return size;    }    decodeSize += size;    bufSize -= size;    buf += size;    if (req->hdr.length > bufSize) {        return MPLS_DEC_BUFFTOOSMALL;    }    if (req->hdr.class != RSVP_LABEL_REQUEST_CLASS) {        return RSVP_DEC_OBJECTERROR;    }    switch(req->hdr.cType) {	case RSVP_LABEL_REQUEST_CTYPE_GENERIC:	    size = rsvpteDecodeLabelReqGeneric(&req->u.generic, buf, bufSize);	    break;	case RSVP_LABEL_REQUEST_CTYPE_ATM:	    size = rsvpteDecodeLabelReqAtm(&req->u.atm, buf, bufSize);	    break;	case RSVP_LABEL_REQUEST_CTYPE_FR:	    size = rsvpteDecodeLabelReqFr(&req->u.fr, buf, bufSize);	    break;  	default:	    return RSVP_DEC_OBJECTERROR;    }    if (size < 0) {	return size;    }    return decodeSize + size;}/* Session Attribute Object */int rsvpteEncodeSessionAttribLspTunnel(rsvpSessionAttribLspTunnel_t * lsp, u_char * buf, int bufSize) {    int size = RSVP_SESSION_ATTRIB_LSP_TUNNEL_BASE_SIZE + lsp->nameLen;    if (size > bufSize) {	return MPLS_ENC_BUFFTOOSMALL;    }    memcpy(buf, lsp, size);    return size;}int rsvpteDecodeSessionAttribLspTunnel(rsvpSessionAttribLspTunnel_t * lsp, u_char * buf, int bufSize) {    if (RSVP_SESSION_ATTRIB_LSP_TUNNEL_BASE_SIZE > bufSize) {	return MPLS_DEC_BUFFTOOSMALL;    }    memcpy(lsp, buf, RSVP_SESSION_ATTRIB_LSP_TUNNEL_BASE_SIZE);    if (lsp->nameLen > bufSize) {	return MPLS_DEC_BUFFTOOSMALL;    }    memcpy(lsp->name, buf, lsp->nameLen);    return RSVP_SESSION_ATTRIB_LSP_TUNNEL_BASE_SIZE + lsp->nameLen;}int rsvpteEncodeSessionAttribLspTunnelRa(rsvpSessionAttribLspTunnelRa_t * lsp, u_char * buf, int bufSize) {    rsvpSessionAttribLspTunnelRa_t lspCopy;    int size = RSVP_SESSION_ATTRIB_LSP_TUNNEL_RA_BASE_SIZE + lsp->nameLen;    if (size > bufSize) {	return MPLS_ENC_BUFFTOOSMALL;    }    lspCopy = *lsp;    lspCopy.excludeAny = htonl(lspCopy.excludeAny);    lspCopy.includeAny = htonl(lspCopy.includeAny);    lspCopy.includeAll = htonl(lspCopy.includeAll);    memcpy(buf, &lspCopy, size);    return size;}int rsvpteDecodeSessionAttribLspTunnelRa(rsvpSessionAttribLspTunnelRa_t * lsp, u_char * buf, int bufSize) {    if (RSVP_SESSION_ATTRIB_LSP_TUNNEL_RA_BASE_SIZE > bufSize) {	return MPLS_DEC_BUFFTOOSMALL;    }    memcpy(lsp, buf, RSVP_SESSION_ATTRIB_LSP_TUNNEL_RA_BASE_SIZE);    if (lsp->nameLen > bufSize) {	return MPLS_DEC_BUFFTOOSMALL;    }    memcpy(lsp->name, buf, lsp->nameLen);    lsp->excludeAny = ntohl(lsp->excludeAny);    lsp->includeAny = ntohl(lsp->includeAny);    lsp->includeAll = ntohl(lsp->includeAll);    return RSVP_SESSION_ATTRIB_LSP_TUNNEL_BASE_SIZE + lsp->nameLen;}int rsvpteEncodeSessionAttribObject(rsvpSessionAttibObject_t * session, u_char * buf, int bufSize) {    int encodedSize = 0;    char *bufHdr = buf;    int size;    if (RSVP_OBJECT_HDRSIZE > bufSize) {        return MPLS_ENC_BUFFTOOSMALL;    }    size = RSVP_OBJECT_HDRSIZE;    encodeSize += size;    bufSize -= size;    buf += size;    switch(session->hdr.cType) {	case RSVP_SESSION_ATTRIB_CTYPE_LSP_TUNNEL:	    size = rsvpteEncodeSessionAttribLspTunnel(&session->u.tunnel, buf, bufSize);	    break;	case RSVP_SESSION_ATTRIB_CLASS_LSP_TUNNEL_RA:	    size = rsvpteEncodeSessionAttribLspTunnelRa(&session->u.tunnelRa, buf, bufSize);	    break;  	default:	    return RSVP_DEC_OBJECTERROR;    }    if (size < 0) {        return size;    }    encodeSize += size;    session->hdr.length = encodeSize;    session->hdr.class = RSVP_SESSION_ATTRIB_CLASS;    size = rsvpteEncodeObjectHeader(&session->hdr, bufHdr, RSVP_OBJECT_HDRSIZE);    if (size < 0) {        return size;    }    return encodeSize;}int rsvpteDecodeSessionAttribObject(rsvpSessionAttibObject_t * session, u_char * buf, int bufSize) {    int decodedSize = 0;    int size = rsvpteDecodeObjectHeader(&session->hdr, buf, bufSize);    if (size < 0) {        return size;    }    decodeSize += size;    bufSize -= size;    buf += size;    if (session->hdr.length > bufSize) {        return MPLS_DEC_BUFFTOOSMALL;    }    if (session->hdr.class != RSVP_SESSION_ATTRIB_CLASS) {        return RSVP_DEC_OBJECTERROR;    }    switch(session->hdr.cType) {	case RSVP_SESSION_ATTRIB_CTYPE_LSP_TUNNEL:	    size = rsvpteDecodeSessionAttribLspTunnel(&session->u.tunnel, buf, bufSize);	    break;	case RSVP_SESSION_ATTRIB_CLASS_LSP_TUNNEL_RA:	    size = rsvpteDecodeSessionAttribLspTunnelRa(&session->u.tunnelRa, buf, bufSize);	    break;  	default:	    return RSVP_DEC_OBJECTERROR;    }    if (size < 0) {        return size;    }    return decodeSize + size;}/* Filter Spec Object */int rsvpteEncodeFilterSpec4(rsvpFilterSpec4_t * filter, u_char * buf, int bufSize) {    rsvpFilterSpec4_t filterCopy;    if (RSVP_FILTER_SPEC4_SIZE > bufSize) {	return MPLS_ENC_BUFFTOOSMALL;    }    filterCopy.sourceAddr = htonl(filter->sourceAddr);    filterCopy.sourcePort = htons(filter->sourcePort);    filterCopy.reserved = filter->reserved = 0;    memcpy(buf, &filterCopy, RSVP_FILTER_SPEC4_SIZE);    return RSVP_FILTER_SPEC4_SIZE;}int rsvpteDecodeFilterSpec4(rsvpFilterSpec4_t * filter, u_char * buf, int bufSize) {    if (RSVP_FILTER_SPEC4_SIZE > bufSize) {	return MPLS_DEC_BUFFTOOSMALL;    }    memcpy(filter, buf, RSVP_FILTER_SPEC4_SIZE);    filter->sourceAddr = ntohl(filter->sourceAddr);    filter->sourcePort = ntohs(filter->sourcePort);    filter->reserved = 0;    return RSVP_FILTER_SPEC4_SIZE;}int rsvpteEncodeFilterSpec6(rsvpFilterSpec6_t * filter, u_char * buf, int bufSize) {    rsvpFilterSpec6_t filterCopy;    if (RSVP_FILTER_SPEC6_SIZE > bufSize) {	return MPLS_ENC_BUFFTOOSMALL;    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -