]> git.stg.codes - ssmd.git/blob - src/acl.cpp
a882182de03917982627ce9f88fc19394a4b9a17
[ssmd.git] / src / acl.cpp
1 #include <boost/lexical_cast.hpp>
2 #include <boost/format.hpp>
3
4 #include "snmp_pp/snmp_pp.h"
5
6 #include "acl.h"
7 #include "oids.h"
8 #include "logger.h"
9
10 using GTS::ACL;
11
12 ACL::ACL(unsigned id,
13          unsigned profileId,
14          const std::string & mac,
15          unsigned port,
16          unsigned shape,
17          unsigned burst,
18          bool isUpload)
19     : _id(id),
20       _profileId(profileId),
21       _mac(mac),
22       _shape(shape),
23       _burst(burst),
24       _isUpload(isUpload)
25 {
26     port = 1 << (32 - port);
27     _port = (boost::format("%|08x|") % port).str();
28 }
29
30 ACL::ACL(const ACL & rvalue)
31     : _id(rvalue._id),
32       _profileId(rvalue._profileId),
33       _mac(rvalue._mac),
34       _port(rvalue._port),
35       _shape(rvalue._shape),
36       _burst(rvalue._burst),
37       _isUpload(rvalue._isUpload)
38 {
39 }
40
41 ACL::~ACL()
42 {
43 }
44
45 ACL & ACL::operator=(const ACL & rvalue)
46 {
47     _id = rvalue._id;
48     _profileId = rvalue._profileId;
49     _mac = rvalue._mac;
50     _port = rvalue._port;
51     _shape = rvalue._shape;
52     _burst = rvalue._burst;
53     _isUpload = rvalue._isUpload;
54
55     return *this;
56 }
57
58 void ACL::appendPdu(Pdu & pdu) const
59 {
60     std::string oidValue;
61     // MAC
62     if (_isUpload) {
63         oidValue = swACLEtherRuleSrcMacAddress;
64         oidValue += getSuffix();
65     } else {
66         oidValue = swACLEtherRuleDstMacAddress;
67         oidValue += getSuffix();
68     }
69     Vb vb(Oid(oidValue.c_str()));
70     vb.set_value(OctetStr::from_hex_string(_mac.c_str()));
71     pdu += vb;
72
73     // Permit rule
74     oidValue = swACLEtherRulePermit;
75     oidValue += getSuffix();
76     vb.set_oid(Oid(oidValue.c_str()));
77     vb.set_value(int(2));
78     pdu += vb;
79
80     // Port
81     oidValue = swACLEtherRulePort;
82     oidValue += getSuffix();
83     vb.set_oid(Oid(oidValue.c_str()));
84     vb.set_value(OctetStr::from_hex_string(_port.c_str()));
85     pdu += vb;
86
87     // Shape
88     oidValue = swACLEtherRuleRxRate;
89     oidValue += getSuffix();
90     vb.set_oid(Oid(oidValue.c_str()));
91     vb.set_value(int(_shape));
92     pdu += vb;
93
94     // Create ACL
95     oidValue = swACLEtherRuleRowStatus;
96     oidValue += getSuffix();
97     vb.set_oid(Oid(oidValue.c_str()));
98     vb.set_value(int(4));
99     pdu += vb;
100
101     // Burst
102     /*oidValue = swACLMeterBurstSize;
103     oidValue += getSuffix();
104     vb.set_oid(Oid(oidValue.c_str()));
105     vb.set_value(int(_burst));
106     pdu += vb;*/
107 }
108
109 std::ostream & GTS::operator<<(std::ostream & stream, const ACL & acl)
110 {
111     std::string oidValue;
112     // MAC
113     if (acl._isUpload) {
114         oidValue = swACLEtherRuleSrcMacAddress;
115         oidValue += acl.getSuffix();
116     } else {
117         oidValue = swACLEtherRuleDstMacAddress;
118         oidValue += acl.getSuffix();
119     }
120     stream << oidValue << ":" << acl._mac << " ";
121
122     // Permit rule
123     oidValue = swACLEtherRulePermit;
124     oidValue += acl.getSuffix();
125     stream << oidValue << ":" << 2 << " ";
126
127     // Port
128     oidValue = swACLEtherRulePort;
129     oidValue += acl.getSuffix();
130     stream << oidValue << ":" << acl._port << " ";
131
132     // Shape
133     oidValue = swACLEtherRuleRxRate;
134     oidValue += acl.getSuffix();
135     stream << oidValue << ":" << acl._shape << " ";
136
137     // Create ACL
138     oidValue = swACLEtherRuleRowStatus;
139     oidValue += acl.getSuffix();
140     stream << oidValue << ":" << 4;
141
142     return stream;
143 }
144
145 inline
146 std::string ACL::getSuffix() const
147 {
148     return std::string(".") +
149            boost::lexical_cast<std::string>(_profileId) +
150            "." +
151            boost::lexical_cast<std::string>(_id);
152 }