Commit 3138aec2 authored by Tien-Thinh Nguyen's avatar Tien-Thinh Nguyen

Fix error/clean for NAS Lib

parent c8f9afd8
......@@ -54,7 +54,7 @@ typedef struct subscribed_default_qos_s{
enum reflective_qos_attribute_e{
RQOS = 1,
NO_RQOS =2
NO_RQOS = 2
};
static const std::vector<std::string> reflective_qos_attribute_e2str = {"ERROR", "RQOS", "NO_RQOS"};
......
......@@ -19,6 +19,14 @@
* contact@openairinterface.org
*/
/*
* This file contains NAS header bits format
* Refer TS24.007 TS24.501
* Auther: Puzyu Dukl
* Time:
* Email:
*/
#ifndef FILE_3GPP_24_501_H_SEEN
#define FILE_3GPP_24_501_H_SEEN
#ifdef __cplusplus
......@@ -32,14 +40,6 @@ extern "C" {
#define SECURITY_HEADER_TYPE_INTEGRITY_PROTECTED_NEW 0b0011
#define SECURITY_HEADER_TYPE_INTEGRITY_PROTECTED_CYPHERED_NEW 0b0100
/*
* This file contains NAS header bits format
* Refer TS24.007 TS24.501
* Auther: Puzyu Dukl
* Time:
* Email: hr@
*/
/*Extended Protocol Discriminator (EPD)*/
//8 bits
......@@ -55,13 +55,11 @@ extern "C" {
#define IntegrityProtectedWithNew5GNASSecurityContext 0b0011
#define IntegrityProtectedAndCipheredWithNew5GNASSecurityContext 0b0100
#define SpareHalfOctet 0b0000 /*填充用*/
#define SpareHalfOctet 0b0000
/* Message Type for Mobility Management */
// 0b01******
/* 5GS Mobility Management Messages */
#define REGISTRATION_REQUEST 0b01000001
#define REGISTRATION_ACCEPT 0b01000010
#define REGISTRATION_COMPLETE 0b01000011
......@@ -96,7 +94,6 @@ extern "C" {
/* Message Type for Session Management */
//0b11******
//5GS Session Management Messages
//TODO should be updated with enum
#define PDU_SESSION_MESSAGE_TYPE_UNKNOWN 0b00000000
......@@ -136,7 +133,6 @@ enum request_type_e {
/*
* Message Authentication Code
* 木得定义
* The message authentication code (MAC) information element contains
* the integrity protection information for the message.
*/
......@@ -177,7 +173,7 @@ enum request_type_e {
* 5GMM cause types
*/
#define IIEGAL_UE 0b00000011
#define IIEGAL_UE 0b00000011
#define PEI_NOT_ACCEPTED 0b00000101
#define IIEGAL_ME 0b00000110
#define FGS_SERVICES_NOT_ALLOWED 0b00000111
......
......@@ -9,25 +9,28 @@
int encode_dnn ( DNN dnn, uint8_t iei, uint8_t * buffer, uint32_t len )
{
uint8_t *lenPtr = NULL;
uint8_t len_pos = 0;
uint32_t encoded = 0;
int encode_result = 0;
CHECK_PDU_POINTER_AND_LENGTH_ENCODER (buffer,((iei > 0) ? DNN_MINIMUM_LENGTH_TLV : DNN_MINIMUM_LENGTH_TLV-1) , len);
if( iei > 0 )
if(iei > 0 )
{
*buffer=iei;
*buffer = iei;
encoded++;
}
lenPtr = (buffer + encoded);
encoded++;
encoded++; //ENCODE_U8(buffer + encoded, dnn.length, encoded);
len_pos = encoded;
if ((encode_result = encode_bstring (dnn, buffer + encoded, len - encoded)) < 0)//加密,实体,首地址,长度
if ((encode_result = encode_bstring (dnn, buffer + encoded, len - encoded)) < 0)
return encode_result;
else
encoded += encode_result;
*lenPtr = encoded - 1 - ((iei > 0) ? 1 : 0);
//set length
*(uint8_t*)(lenPtr) = encoded - len_pos;
return encoded;
}
......
......@@ -8,59 +8,60 @@
int encode_pdu_address ( PDUAddress pduaddress, uint8_t iei, uint8_t * buffer, uint32_t len )
{
uint8_t *lenPtr = NULL;
uint32_t encoded = 0;
int encode_result = 0;
CHECK_PDU_POINTER_AND_LENGTH_ENCODER (buffer,((iei > 0) ? PDU_ADDRESS_MINIMUM_LENGTH_TLV : PDU_ADDRESS_MINIMUM_LENGTH_TLV-1) , len);
uint8_t *lenPtr = NULL;
uint32_t encoded = 0;
int encode_result = 0;
CHECK_PDU_POINTER_AND_LENGTH_ENCODER (buffer,((iei > 0) ? PDU_ADDRESS_MINIMUM_LENGTH_TLV : PDU_ADDRESS_MINIMUM_LENGTH_TLV-1) , len);
if( iei > 0 )
{
*buffer=iei;
encoded++;
}
lenPtr = (buffer + encoded);
if( iei > 0 )
{
*buffer = iei;
encoded++;
}
lenPtr = buffer + encoded;
encoded++; //ENCODE_U8(buffer+encoded,pduaddress.length, encoded);
uint8_t len_pos = encoded;
ENCODE_U8(buffer+encoded,(uint8_t)(pduaddress.pdu_session_type_value&0x07),encoded);
ENCODE_U8(buffer+encoded,(uint8_t)(pduaddress.pdu_session_type_value&0x07),encoded);
if ((encode_result = encode_bstring (pduaddress.pdu_address_information, buffer + encoded, len - encoded)) < 0)
return encode_result;
else
encoded += encode_result;
if ((encode_result = encode_bstring (pduaddress.pdu_address_information, buffer + encoded, len - encoded)) < 0)
return encode_result;
else
encoded += encode_result;
//set length
*(uint8_t*)(lenPtr) = encoded - len_pos;
*lenPtr = encoded - 1 - ((iei > 0) ? 1 : 0);
return encoded;
return encoded;
}
int decode_pdu_address ( PDUAddress * pduaddress, uint8_t iei, uint8_t * buffer, uint32_t len )
{
int decoded=0;
uint8_t ielen=0;
int decode_result = 0;
uint8_t bitStream = 0x00;
if (iei > 0)
{
CHECK_IEI_DECODER (iei, *buffer);
decoded++;
}
ielen = *(buffer + decoded);
int decoded=0;
uint8_t ielen=0;
int decode_result = 0;
uint8_t bitStream = 0x00;
if (iei > 0)
{
CHECK_IEI_DECODER (iei, *buffer);
decoded++;
CHECK_LENGTH_DECODER (len - decoded, ielen);
}
ielen = *(buffer + decoded);
decoded++;
CHECK_LENGTH_DECODER (len - decoded, ielen);
DECODE_U8(buffer+decoded,bitStream,decoded);
pduaddress->pdu_session_type_value = bitStream&0x07;
DECODE_U8(buffer+decoded,bitStream,decoded);
pduaddress->pdu_session_type_value = bitStream&0x07;
if((decode_result = decode_bstring (&pduaddress->pdu_address_information, ielen-1, buffer + decoded, len - decoded)) < 0)
return decode_result;
else
decoded += decode_result;
if((decode_result = decode_bstring (&pduaddress->pdu_address_information, ielen-1, buffer + decoded, len - decoded)) < 0)
return decode_result;
else
decoded += decode_result;
return decoded;
return decoded;
}
......@@ -12,10 +12,11 @@
#define PDU_ADDRESS_IPV4V6 0x03
typedef struct{
uint8_t length;
uint8_t spare:5;
uint8_t pdu_session_type_value:3;
bstring pdu_address_information;
}PDUAddress;
}__attribute__((__packed__)) PDUAddress;
int encode_pdu_address ( PDUAddress pduaddress, uint8_t iei, uint8_t * buffer, uint32_t len ) ;
......
......@@ -8,36 +8,45 @@
int encode_qos_rules ( QOSRules qosrules, uint8_t iei, uint8_t * buffer, uint32_t len )
{
uint8_t *lenqosrule = NULL;
uint8_t lenmoment = 0;
uint8_t *len_qosrule = NULL;
uint8_t *len_qosrulesie = NULL;
uint8_t len_pos_qos_rule = 0;
uint8_t bitstream = 0;
uint16_t lenqosrule_16 = 0;
uint32_t encoded = 0;
int encode_result = 0;
int i = 0,j = 0;
uint32_t temp = 0;
CHECK_PDU_POINTER_AND_LENGTH_ENCODER (buffer,((iei > 0) ? QOS_RULES_MINIMUM_LENGTH_TLVE : QOS_RULES_MINIMUM_LENGTH_LVE), len);
if( iei > 0 )
{
*buffer=iei;
*buffer = iei;
encoded++;
}
len_qosrulesie = buffer + encoded;
encoded += 2; //ENCODE_U16(buffer + encoded, qosrules.lengthofqosrulesie, encoded);
uint8_t len_pos_qos_rulesie = encoded;
/*
*(buffer + encoded) = qosrules.lengthofqosrulesie/(1<<8);
encoded++;
*(buffer + encoded) = qosrules.lengthofqosrulesie%(1<<8);
encoded++;
*/
for(i=0;i<qosrules.lengthofqosrulesie;i++)
for(i = 0; i < qosrules.lengthofqosrulesie; i++)
{
ENCODE_U8(buffer+encoded,qosrules.qosrulesie[i].qosruleidentifer,encoded);
ENCODE_U8(buffer + encoded, qosrules.qosrulesie[i].qosruleidentifer, encoded);
lenqosrule = buffer + encoded;
len_qosrule = buffer + encoded;
encoded++;
encoded++;
lenmoment = encoded;
len_pos_qos_rule = encoded;
bitstream = (uint8_t)(qosrules.qosrulesie[i].ruleoperationcode << 5);
bitstream |= (uint8_t)(qosrules.qosrulesie[i].dqrbit << 4);
......@@ -46,23 +55,23 @@ int encode_qos_rules ( QOSRules qosrules, uint8_t iei, uint8_t * buffer, uint32_
if((bitstream >> 5) == MODIFY_EXISTING_QOS_RULE_AND_DELETE_PACKET_FILTERS)
{
for(j = 0;j < (bitstream & 0x0f);j++)
for(j = 0; j < (bitstream & 0x0f); j++)
{
ENCODE_U8(buffer+encoded,(uint8_t)qosrules.qosrulesie[i].packetfilterlist.modifyanddelete[j].packetfilteridentifier,encoded);
ENCODE_U8(buffer + encoded, (uint8_t)qosrules.qosrulesie[i].packetfilterlist.modifyanddelete[j].packetfilteridentifier, encoded);
}
ENCODE_U8(buffer+encoded,qosrules.qosrulesie[i].qosruleprecedence,encoded);
ENCODE_U8(buffer+encoded,(uint8_t)((qosrules.qosrulesie[i].segregation<<6) | (qosrules.qosrulesie[i].qosflowidentifer & 0x3f)),encoded);
ENCODE_U8(buffer + encoded, qosrules.qosrulesie[i].qosruleprecedence, encoded);
ENCODE_U8(buffer + encoded, (uint8_t)((qosrules.qosrulesie[i].segregation<<6) | (qosrules.qosrulesie[i].qosflowidentifer & 0x3f)), encoded);
}
else if(((bitstream >> 5) == CREATE_NEW_QOS_RULE) || ((bitstream >> 5) == MODIFY_EXISTING_QOS_RULE_AND_ADD_PACKET_FILTERS) || ((bitstream >> 5) == MODIFY_EXISTING_QOS_RULE_AND_REPLACE_ALL_PACKET_FILTERS))
{
for(j = 0;j < (bitstream & 0x0f);j++)
for(j = 0; j < (bitstream & 0x0f); j++)
{
ENCODE_U8(buffer+encoded,(uint8_t)((qosrules.qosrulesie[i].packetfilterlist.create_modifyandadd_modifyandreplace[j].packetfilterdirection << 4)|(qosrules.qosrulesie[i].packetfilterlist.create_modifyandadd_modifyandreplace[j].packetfilteridentifier & 0x0f)),encoded);
ENCODE_U8(buffer + encoded, (uint8_t)((qosrules.qosrulesie[i].packetfilterlist.create_modifyandadd_modifyandreplace[j].packetfilterdirection << 4)|(qosrules.qosrulesie[i].packetfilterlist.create_modifyandadd_modifyandreplace[j].packetfilteridentifier & 0x0f)),encoded);
uint8_t *lenghtofpacketfiltercontents = buffer + encoded;
uint8_t *len_packetfiltercontents = buffer + encoded;
encoded++;
ENCODE_U8(buffer+encoded,qosrules.qosrulesie[i].packetfilterlist.create_modifyandadd_modifyandreplace[j].packetfiltercontents.component_type,encoded);
ENCODE_U8(buffer + encoded, qosrules.qosrulesie[i].packetfilterlist.create_modifyandadd_modifyandreplace[j].packetfiltercontents.component_type, encoded);
if(qosrules.qosrulesie[i].packetfilterlist.create_modifyandadd_modifyandreplace[j].packetfiltercontents.component_type != QOS_RULE_MATCHALL_TYPE)
{
......@@ -72,17 +81,18 @@ int encode_qos_rules ( QOSRules qosrules, uint8_t iei, uint8_t * buffer, uint32_
encoded += encode_result;
}
*lenghtofpacketfiltercontents = encode_result+1;
*len_packetfiltercontents = encode_result+1;
}
ENCODE_U8(buffer+encoded,qosrules.qosrulesie[i].qosruleprecedence,encoded);
ENCODE_U8(buffer+encoded,(uint8_t)((qosrules.qosrulesie[i].segregation<<6) | (qosrules.qosrulesie[i].qosflowidentifer & 0x3f)),encoded);
ENCODE_U8(buffer + encoded, qosrules.qosrulesie[i].qosruleprecedence, encoded);
ENCODE_U8(buffer + encoded, (uint8_t)((qosrules.qosrulesie[i].segregation<<6) | (qosrules.qosrulesie[i].qosflowidentifer & 0x3f)), encoded);
}
lenqosrule_16 = encoded - lenmoment;
*lenqosrule = lenqosrule_16/(1<<8);
lenqosrule++;
*lenqosrule = lenqosrule_16%(1<<8);
//len of qos rule
ENCODE_U16(len_qosrule, encoded - len_pos_qos_rule, temp);
}
//len of qos rule ie
ENCODE_U16(len_qosrulesie, encoded - len_pos_qos_rulesie, temp);
return encoded;
}
......
......@@ -52,36 +52,40 @@
#define QOS_RULE_ETHERTYPE_TYPE 0b10000111
typedef struct{
uint8_t spare:4;
uint8_t packetfilteridentifier:4;
}ModifyAndDelete;
} __attribute__((__packed__)) ModifyAndDelete;
typedef struct{
uint8_t component_type;
bstring component_value;
}PacketFilterContents;
typedef struct{
uint8_t spare:2;
uint8_t packetfilterdirection:2;
uint8_t packetfilteridentifier:4;
//uint8_t lenghtofpacketfiltercontents;
uint8_t lenghtofpacketfiltercontents;
PacketFilterContents packetfiltercontents;
}Create_ModifyAndAdd_ModifyAndReplace;
}__attribute__((__packed__)) Create_ModifyAndAdd_ModifyAndReplace;
typedef struct{
uint8_t qosruleidentifer;
//uint16_t LengthofQoSrule;
uint16_t LengthofQoSrule;
uint8_t ruleoperationcode:3;
uint8_t dqrbit:1;
uint8_t numberofpacketfilters:4;
union {
ModifyAndDelete *modifyanddelete;
Create_ModifyAndAdd_ModifyAndReplace *create_modifyandadd_modifyandreplace;
}packetfilterlist;
} packetfilterlist;
//uint16_t packetfilterlistnumber;
uint8_t qosruleprecedence;
uint8_t spare:1;
uint8_t segregation:1;
uint8_t qosflowidentifer:6;
}QOSRulesIE;
}__attribute__((__packed__)) QOSRulesIE;
typedef struct{
uint16_t lengthofqosrulesie;
......
......@@ -19,6 +19,7 @@ int encode_ssc_mode ( SSCMode sscmode, uint8_t iei, uint8_t * buffer, uint32_t l
bitStream |= (sscmode.ssc_mode_value & 0x07);
ENCODE_U8(buffer+encoded,bitStream,encoded);
return encoded;
}
......
......@@ -9,8 +9,9 @@
typedef struct{
uint8_t spare:5;
uint8_t ssc_mode_value:3;
}SSCMode;
} __attribute__((__packed__)) SSCMode;
int encode_ssc_mode ( SSCMode sscmode, uint8_t iei, uint8_t * buffer, uint32_t len ) ;
......
......@@ -12,27 +12,23 @@ int encode_session_ambr ( SessionAMBR sessionambr, uint8_t iei, uint8_t * buffer
uint32_t encoded = 0;
CHECK_PDU_POINTER_AND_LENGTH_ENCODER (buffer,((iei > 0) ? SESSION_AMBR_MINIMUM_LENGTH_TLV : SESSION_AMBR_MINIMUM_LENGTH_LV) , len);
if( iei >0 )
if( iei > 0 )
{
*buffer=iei;
encoded++;
}
lenPtr = (buffer + encoded);
encoded++;
ENCODE_U8(buffer+encoded,sessionambr.uint_for_session_ambr_for_downlink,encoded);
*(buffer + encoded) = sessionambr.session_ambr_for_downlink/(1<<8);
encoded++;
*(buffer + encoded) = sessionambr.session_ambr_for_downlink%(1<<8);
encoded++;
ENCODE_U8(buffer+encoded,sessionambr.uint_for_session_ambr_for_uplink,encoded);
*(buffer + encoded) = sessionambr.session_ambr_for_uplink/(1<<8);
encoded++;
*(buffer + encoded) = sessionambr.session_ambr_for_uplink%(1<<8);
encoded++;
*lenPtr = encoded - 1 - ((iei > 0) ? 1 : 0);
encoded++; //ENCODE_U8(buffer+encoded, sessionambr.length,encoded);
uint8_t len_pos = encoded;
ENCODE_U8(buffer + encoded, sessionambr.uint_for_session_ambr_for_downlink, encoded);
ENCODE_U16(buffer + encoded, sessionambr.session_ambr_for_downlink, encoded);
ENCODE_U8(buffer + encoded, sessionambr.uint_for_session_ambr_for_uplink, encoded);
ENCODE_U16(buffer + encoded, sessionambr.session_ambr_for_uplink, encoded);
//set length
*(uint8_t*)(lenPtr) = encoded - len_pos;
return encoded;
}
......
......@@ -43,10 +43,11 @@
//typedef bstring SessionAMBR;
typedef struct{
uint8_t uint_for_session_ambr_for_downlink;
uint16_t session_ambr_for_downlink;
uint8_t uint_for_session_ambr_for_uplink;
uint16_t session_ambr_for_uplink;
uint8_t length;
uint8_t uint_for_session_ambr_for_downlink;
uint16_t session_ambr_for_downlink;
uint8_t uint_for_session_ambr_for_uplink;
uint16_t session_ambr_for_uplink;
}SessionAMBR;
......
......@@ -18,7 +18,7 @@ int encode__pdu_session_type ( _PDUSessionType _pdusessiontype, uint8_t iei, uin
}
bitStream |= (_pdusessiontype.pdu_session_type_value & 0x07);
ENCODE_U8(buffer+encoded,bitStream,encoded);
ENCODE_U8(buffer + encoded, bitStream, encoded);
return encoded;
}
......
......@@ -8,8 +8,9 @@
#define _PDU_SESSION_TYPE_MAXIMUM_LENGTH 1
typedef struct {
uint8_t spare:5;
uint8_t pdu_session_type_value:3;
} _PDUSessionType;
} __attribute__((__packed__)) _PDUSessionType;
int encode__pdu_session_type ( _PDUSessionType _pdusessiontype, uint8_t iei, uint8_t * buffer, uint32_t len ) ;
......
This diff is collapsed.
......@@ -34,7 +34,7 @@
#define TEST_MAC_ENCRYPT_DECRYPT__ 0
#define NAS_MESSAGE_SECURITY_HEADER_SIZE 7 //7*8bits
#define NAS_MESSAGE_SECURITY_HEADER_SIZE 7
/*********************************************************/
/************************* 9.1 24501**********************/
......@@ -52,7 +52,7 @@ typedef struct nas_message_security_header_s {
#endif
uint32_t message_authentication_code;
uint8_t sequence_number;
} nas_message_security_header_t;
} __attribute__((__packed__)) nas_message_security_header_t;
/* Structure of plain NAS message */
typedef union {
......
......@@ -93,12 +93,5 @@ typedef struct {
uint8_t xres[AUTH_XRES_SIZE];
} auth_vector_t;
/****************************************************************************/
/******************** G L O B A L V A R I A B L E S ********************/
/****************************************************************************/
/****************************************************************************/
/****************** E X P O R T E D F U N C T I O N S ******************/
/****************************************************************************/
#endif /* FILE_SECURITYDEF_SEEN*/
......@@ -205,12 +205,15 @@ int encode_pdu_session_establishment_accept( pdu_session_establishment_accept_ms
if((encoded_result = encode__pdu_session_type (pdu_session_establishment_accept->_pdusessiontype, 0, buffer+encoded,len-encoded))<0)
return encoded_result;
else
encoded+=encoded_result;
encoded += encoded_result;
//TODO: In Wireshark Version 3.2.2 (Git commit a3efece3d640), SSC Mode (4 bit) + PDU sessiion type (4 bit) = 1 byte,
//so disable encode SSC Mode for the moment, Should be verified later
if((encoded_result = encode_ssc_mode (pdu_session_establishment_accept->sscmode, 0, buffer+encoded,len-encoded))<0)
/* if((encoded_result = encode_ssc_mode (pdu_session_establishment_accept->sscmode, 0, buffer+encoded,len-encoded))<0)
return encoded_result;
else
encoded+=encoded_result;
*/
if((encoded_result = encode_qos_rules (pdu_session_establishment_accept->qosrules, 0, buffer+encoded,len-encoded))<0)
return encoded_result;
......@@ -261,15 +264,15 @@ int encode_pdu_session_establishment_accept( pdu_session_establishment_accept_ms
else
encoded+=encoded_result;
}
/*if((pdu_session_establishment_accept->presence & PDU_SESSION_ESTABLISHMENT_ACCEPT_MAPPED_EPS_BEARER_CONTEXTS_PRESENCE) == PDU_SESSION_ESTABLISHMENT_ACCEPT_MAPPED_EPS_BEARER_CONTEXTS_PRESENCE)
/*
if((pdu_session_establishment_accept->presence & PDU_SESSION_ESTABLISHMENT_ACCEPT_MAPPED_EPS_BEARER_CONTEXTS_PRESENCE) == PDU_SESSION_ESTABLISHMENT_ACCEPT_MAPPED_EPS_BEARER_CONTEXTS_PRESENCE)
{
if((encoded_result = encode_mapped_eps_bearer_contexts (pdu_session_establishment_accept->mappedepsbearercontexts, PDU_SESSION_ESTABLISHMENT_ACCEPT_MAPPED_EPS_BEARER_CONTEXTS_IEI, buffer+encoded,len-encoded))<0)
return encoded_result;
else
encoded+=encoded_result;
}*/
}
*/
if((pdu_session_establishment_accept->presence & PDU_SESSION_ESTABLISHMENT_ACCEPT_EAP_MESSAGE_PRESENCE) == PDU_SESSION_ESTABLISHMENT_ACCEPT_EAP_MESSAGE_PRESENCE)
{
if((encoded_result = encode_eap_message (pdu_session_establishment_accept->eapmessage, PDU_SESSION_ESTABLISHMENT_ACCEPT_EAP_MESSAGE_IEI, buffer+encoded,len-encoded))<0)
......@@ -291,15 +294,15 @@ int encode_pdu_session_establishment_accept( pdu_session_establishment_accept_ms
if((encoded_result = encode_extended_protocol_configuration_options (pdu_session_establishment_accept->extendedprotocolconfigurationoptions, PDU_SESSION_ESTABLISHMENT_ACCEPT_E_P_C_O_IEI, buffer+encoded,len-encoded))<0)
return encoded_result;
else
encoded+=encoded_result;
encoded += encoded_result;
}
if((pdu_session_establishment_accept->presence & PDU_SESSION_ESTABLISHMENT_ACCEPT_DNN_PRESENCE) == PDU_SESSION_ESTABLISHMENT_ACCEPT_DNN_PRESENCE)
{
if((encoded_result = encode_dnn (pdu_session_establishment_accept->dnn, PDU_SESSION_ESTABLISHMENT_ACCEPT_DNN_IEI, buffer+encoded,len-encoded))<0)
if((encoded_result = encode_dnn (pdu_session_establishment_accept->dnn, PDU_SESSION_ESTABLISHMENT_ACCEPT_DNN_IEI, buffer + encoded, len - encoded))<0)
return encoded_result;
else
encoded+=encoded_result;
encoded += encoded_result;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment