File: SrvOptIAPrefix.cpp

package info (click to toggle)
dibbler 1.0.1-2
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 13,352 kB
  • sloc: cpp: 60,323; ansic: 12,235; sh: 11,951; yacc: 3,418; lex: 969; makefile: 940; perl: 319; xml: 116; python: 74
file content (68 lines) | stat: -rw-r--r-- 2,124 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/*
 * Dibbler - a portable DHCPv6
 *
 * authors: Tomasz Mrugalski <thomson@klub.com.pl>
 *          Marek Senderski <msend@o2.pl>
 * changes: Krzysztof Wnuk <keczi@poczta.onet.pl>
 *
 *
 */

#include "DHCPConst.h"
#include "Opt.h"
#include "OptIAPrefix.h"
#include "SrvOptIAPrefix.h"
#include "OptStatusCode.h"
#include "Msg.h"
#include "Logger.h"
#include "Portable.h"

TSrvOptIAPrefix::TSrvOptIAPrefix( char * buf, int bufsize, TMsg* parent)
    :TOptIAPrefix(buf,bufsize, parent)
{
    int pos=0;
    while(pos<bufsize)
    {
        uint16_t code = readUint16(buf + pos);
        pos += sizeof(uint16_t);
        int length = readUint16(buf + pos);
        pos += sizeof(uint16_t);
        if ((code>0)&&(code<=24))
        {
            if(allowOptInOpt(parent->getType(),OPTION_IAPREFIX,code))
            {
                SPtr<TOpt> opt;
                opt = SPtr<TOpt>();
                switch (code)
                    {
                    case OPTION_STATUS_CODE:
                        opt =(Ptr*)SPtr<TOptStatusCode> (new TOptStatusCode(buf+pos,length,this->Parent));
                        break;
                    default:
                        Log(Warning) << "Option " << code<< " not supported "
                                     << " in message (type="<< parent->getType() <<")." << LogEnd;
                        break;
                    }
                if((opt)&&(opt->isValid()))
                    SubOptions.append(opt);
            } else {
                Log(Warning) << "Illegal option received, opttype=" << code
                             << " in field options of IA_PD option" << LogEnd;
            }
        } else {
            Log(Warning) <<"Unknown option in option IAPREFIX(optType="
                         << code << "). Option ignored." << LogEnd;
        };
        pos+=length;
    }
}

TSrvOptIAPrefix::TSrvOptIAPrefix(SPtr<TIPv6Addr> prefix, char length, unsigned long pref,
                                   unsigned long valid, TMsg* parent)
    :TOptIAPrefix(prefix,length,pref,valid, parent) {

}

bool TSrvOptIAPrefix::doDuties() {
    return true;
}