NSIS-ka
A free C++ implementation of NSIS protocols

Changeset 2488


Ignore:
Timestamp:
Mar 21, 2007, 4:45:45 AM (11 years ago)
Author:
hiwi-laier
Message:

ErrorSourceIdentifier? handling - believed to be complete.

Location:
qos-nslp/branches/laier-update
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • qos-nslp/branches/laier-update/include/info_spec.h

    r2487 r2488  
    161161                // @}
    162162        }; // end error code
     163#ifdef QOS_NSLP_13
     164        enum esitype_t {
     165                ESI_none = 0,
     166                ESI_IPv4 = 1,
     167                ESI_IPv6 = 2,
     168                ESI_FQDN = 3
     169        };
     170#endif
    163171        // @{
    164172        /// constructor
     
    206214
    207215private:
    208         in6_addr errororigin;
    209         errorclass_t errorclass;
     216    errorclass_t errorclass;
    210217        errorcode_t errorcode;
    211 #ifndef QOS_NSLP_13
    212                 // XXX: Just make sure we don't use this, the external API still has a subcode
    213         uint8 error_subcode;
     218#ifdef QOS_NSLP_13
     219        esitype_t esi_type;
     220        uint16 esi_length;      // Note: uint8 on the wire, but counts 32bit words
     221        union {
     222        in_addr esi_v4;
     223        in6_addr esi_v6;
     224        } esi_addr;
     225        string esi_fqdn;
     226#else
     227        // XXX: Just make sure we don't use this, the external API still has a subcode
     228        uint8 error_subcode;
     229        in6_addr errororigin;
    214230#endif
    215231        string errorstring;
  • qos-nslp/branches/laier-update/src/info_spec.cpp

    r2487 r2488  
    158158        uint32 saved_pos = 0;
    159159        uint32 resume = 0;
     160#ifdef QOS_NSLP_13
     161        uint8 temp_uint8;
     162#else
    160163        uint16 temp_uint16;
     164#endif
    161165        uint8 esi_length;
    162166        errorstring.clear();
     
    173177        } // end if type
    174178
     179#ifdef QOS_NSLP_13
     180        // errorcode(16) | class(4) | esi_type(4) | esi_len(8)
     181        errorcode = (info_spec::errorcode_t)msg.decode16();
     182        temp_uint8 = msg.decode8();
     183        errorclass = (info_spec::errorclass_t)((temp_uint8 & 0xf0) >> 4);
     184        esi_type = (info_spec::esitype_t)(temp_uint8 & 0x0f);
     185        // esi (esi_len) 32bit words!
     186        esi_length = msg.decode8() * sizeof(uint32);
     187        switch (esi_type) {
     188        case ESI_none:
     189                if (esi_length != 0) {
     190                        //TODO: emit error
     191                        return NULL;
     192                }
     193                break;
     194        case ESI_IPv4:
     195                if (esi_length != sizeof(in_addr)) {
     196                        //TODO: emit error
     197                        return NULL;
     198                }
     199                msg.decode(esi_addr.esi_v4);
     200                break;
     201        case ESI_IPv6:
     202                if (esi_length != sizeof(in6_addr)) {
     203                        //TODO: emit error
     204                        return NULL;
     205                }
     206                msg.decode(esi_addr.esi_v6);
     207                break;
     208        case ESI_FQDN:
     209                msg.decode(esi_fqdn, esi_length);
     210                break;
     211        default:
     212                //TODO: emit error
     213                return NULL;
     214        }
     215        // decode string length
     216        strlen = len - 20;
     217        paddedlen = round_up4(strlen);
     218        // decode string
     219        msg.decode(errorstring,strlen);
     220        // padding
     221        msg.padding(paddedlen-strlen);
     222        // OK
     223        bread = ielen;
     224#else
    175225        // decode error code
    176226        temp_uint16 = msg.decode16();
     
    178228        errorclass = (info_spec::errorclass_t) (temp_uint16 / 4096);
    179229        errorcode = (info_spec::errorcode_t) (temp_uint16 % 4096);
    180 #ifndef QOS_NSLP_13
    181230        error_subcode = msg.decode8();
    182 #endif
    183231        esi_length = msg.decode8();
    184232        // decode IPv6 address
     
    193241        // OK
    194242        bread = ielen;
     243#endif
    195244        return this;
    196245} // end deserialize
     
    206255        uint16 paddedlen = 0;
    207256        uint32 ielen = 0;
     257#ifdef QOS_NSLP_13
     258        uint8 tmp8;
     259#else
    208260        uint16 class_code, e_class, e_code;
    209261        uint8 esi_length;
     262#endif
    210263        // check arguments and IE state
    211264        check_ser_args(cod,wbytes);
     
    216269        ielen = len+header_length;
    217270        encode_header_nslpv1(msg,len);
     271#ifdef QOS_NSLP_13
     272        // errorcode(16) | class(4) | esi_type(4) | esi_len(8)
     273        msg.encode16(errorcode);
     274        tmp8 = ((errorclass & 0x0f) << 4) | (esi_type & 0x0f);
     275        msg.encode8(tmp8);
     276        msg.encode8((esi_length / sizeof(uint32)));
     277        switch (esi_type) {
     278        case ESI_IPv4:
     279                msg.encode(esi_addr.esi_v4);
     280                break;
     281        case ESI_IPv6:
     282                msg.encode(esi_addr.esi_v6);
     283                break;
     284        case ESI_FQDN: {
     285                uint32 pad = esi_length - msg.encode(esi_fqdn);
     286                while (pad--)
     287                        msg.encode8(0);
     288                break;
     289        }
     290        default:
     291                ;       // stupid compilers
     292        }
     293#else
    218294        // encode error class and error code
    219295        e_class = (uint16) errorclass;
     
    221297        class_code = e_class * 4096 + e_code;
    222298        msg.encode16(class_code);
    223 #ifndef QOS_NSLP_13
    224299        msg.encode8(error_subcode);
    225 #endif
    226300        esi_length = 16;
    227301        msg.encode8(esi_length);
    228302        //encode address of error origin
    229303        msg.encode(errororigin);
     304#endif
    230305        // encode string
    231306        msg.encode(errorstring);
     
    274349        Log(INFO_LOG,LOG_NORMAL, "INFO_SPEC", "<"<<get_ie_name()<<">:");
    275350        char str[INET6_ADDRSTRLEN];
     351#ifdef QOS_NSLP_13
     352        os<<setw(level*indent)<<""; os<<setw(level*indent)<<"";
     353        switch (esi_type) {
     354        case ESI_none:
     355                Log(INFO_LOG,LOG_NORMAL, "INFO_SPEC", "=====originator NOT SET");
     356                break;
     357        case ESI_IPv4:
     358                inet_ntop(AF_INET, &esi_addr.esi_v4, str, sizeof(str));
     359                Log(INFO_LOG,LOG_NORMAL, "INFO_SPEC", "=====originator " << str);
     360                break;
     361        case ESI_IPv6:
     362                inet_ntop(AF_INET6, &esi_addr.esi_v6, str, sizeof(str));
     363                Log(INFO_LOG,LOG_NORMAL, "INFO_SPEC", "=====originator " << str);
     364                break;
     365        case ESI_FQDN:
     366                Log(INFO_LOG,LOG_NORMAL, "INFO_SPEC", "=====originator " << esi_fqdn);
     367                break;
     368        default:
     369                Log(INFO_LOG,LOG_NORMAL, "INFO_SPEC", "=====originator UNKNOWN TYPE");
     370        }
     371#else
    276372        if (inet_ntop(AF_INET6, &errororigin, str, sizeof(str)) != NULL) {
    277373            os<<setw(level*indent)<<""; os<<setw(level*indent)<<"";
    278374            Log(INFO_LOG,LOG_NORMAL, "INFO_SPEC", "=====originator " << str);
    279375        }
     376#endif
    280377        os<<setw(level*indent)<<""; os<<setw(level*indent)<<"";
    281378        Log(INFO_LOG,LOG_NORMAL, "INFO_SPEC", "=====Errorclass: "<<(errorclass_t)errorclass);
     
    299396info_spec::info_spec() : known_nslp_object(INFO_SPEC, mandatory)
    300397{
    301         memset(&errororigin, 0, sizeof(struct in6_addr));
    302398        errorstring.clear();
    303399#ifdef QOS_NSLP_13
     400        esi_type = ESI_none;
     401        esi_length = 0;
     402        esi_fqdn.clear();
    304403        set_error(success, ReservationSuccessful, 0);
    305404#else
     405        memset(&errororigin, 0, sizeof(struct in6_addr));
    306406        set_error(success, StateInstallationOK, 0);
    307407        error_subcode = 0;
     
    319419 {
    320420        errorstring.clear();
    321         set_errororigin(*err_origin);
     421#ifdef QOS_NSLP_13
     422        esi_type = ESI_none;
     423        esi_length = 0;
     424        esi_fqdn.clear();
     425#endif
     426        if (err_origin != NULL)
     427                set_errororigin(*err_origin);
    322428        if (!set_error(ecl, ecd, e_subcode)) {
    323429            set_error(permanent,InternalOrSystemError, 0);
     
    335441        : known_nslp_object(INFO_SPEC, mandatory)
    336442{
    337         set_errororigin(*err_origin);
     443#ifdef QOS_NSLP_13
     444        esi_type = ESI_none;
     445        esi_length = 0;
     446        esi_fqdn.clear();
     447#endif
     448        if (err_origin != NULL)
     449                set_errororigin(*err_origin);
    338450        if (set_error(ecl,ecd, s_code)) {
    339           errorstring = s;
    340         } else set_error(permanent,InternalOrSystemError, 0);
     451                errorstring = s;
     452        } else
     453                set_error(permanent,InternalOrSystemError, 0);
    341454} // end constructor
    342455
     
    352465        : known_nslp_object(INFO_SPEC, mandatory)
    353466{
     467#ifdef QOS_NSLP_13
     468        esi_type = ESI_none;
     469        esi_length = 0;
     470        esi_fqdn.clear();
     471#endif
     472        if (err_origin != NULL)
    354473        set_errororigin(*err_origin);
    355474        if (set_error(ecl,ecd, s_code)) {
     
    363482  */
    364483info_spec::info_spec(const info_spec& n) : known_nslp_object(n) {
    365   errororigin = n.errororigin;
    366484  errorclass = n.errorclass;
    367485  errorcode = n.errorcode;
    368486  errorstring = n.errorstring;
    369 #ifndef QOS_NSLP_13
     487#ifdef QOS_NSLP_13
     488  esi_type = n.esi_type;
     489  esi_length = n.esi_length;
     490  switch (esi_type) {
     491  case ESI_IPv4:
     492        esi_addr.esi_v4 = n.esi_addr.esi_v4;
     493        break;
     494  case ESI_IPv6:
     495        esi_addr.esi_v6 = n.esi_addr.esi_v6;
     496        break;
     497  case ESI_FQDN:
     498        esi_fqdn = n.esi_fqdn;
     499        break;
     500  default:
     501        ; // Stupid compilers
     502  }
     503#else
     504  errororigin = n.errororigin;
    370505  error_subcode = n.error_subcode;
    371506#endif
     
    375510  */
    376511info_spec::~info_spec() {
    377     memset(&errororigin, 0, sizeof(struct in6_addr));
    378     errorstring.clear();
    379512} // end destructor
    380513
     
    384517info_spec& info_spec::operator=(const info_spec& n) {
    385518        known_nslp_object::operator=(n);
    386         memset(&errororigin, 0, sizeof(struct in6_addr));
    387         errororigin = n.errororigin;
    388519        errorclass = n.errorclass;
    389520        errorcode = n.errorcode;
    390 #ifndef QOS_NSLP_13
     521#ifdef QOS_NSLP_13
     522        esi_type = n.esi_type;
     523        esi_length = n.esi_length;
     524        switch (esi_type) {
     525        case ESI_IPv4:
     526                esi_addr.esi_v4 = n.esi_addr.esi_v4;
     527                break;
     528        case ESI_IPv6:
     529                esi_addr.esi_v6 = n.esi_addr.esi_v6;
     530                break;
     531        case ESI_FQDN:
     532                esi_fqdn = n.esi_fqdn;
     533                break;
     534        default:
     535                ; // Stupid compilers
     536        }
     537#else
     538        errororigin = n.errororigin;
    391539        error_subcode = n.error_subcode;
    392540#endif
     
    517665  */
    518666void info_spec::get_errororigin(in6_addr& origin) const {
     667#ifdef QOS_NSLP_13
     668        if (esi_type == ESI_IPv6)
     669                origin = esi_addr.esi_v6;
     670#else
    519671    memcpy(&origin, &errororigin, sizeof(struct in6_addr));
     672#endif
    520673} // end get_errororigin
    521674
     
    524677  */
    525678void  info_spec::set_errororigin(in6_addr origin) {
     679#ifdef QOS_NSLP_13
     680        if (esi_type == ESI_FQDN)
     681                esi_fqdn.clear();
     682        esi_length = sizeof(in6_addr);
     683        esi_addr.esi_v6 = origin;
     684#else
    526685        memcpy(&errororigin, &origin, sizeof(struct in6_addr));
     686#endif
    527687} // end set_errororigin
    528688
Note: See TracChangeset for help on using the changeset viewer.