file dumped begins with a header, where each line is prefixed by #.
Following the header is a single line for every connected user, fields
separated by a space.<BR> The fields are username, ip, qos,
-uptxoctets, downrxoctets. The qos field is 1 if a standard user, and
-2 if the user is throttled.
+uptxoctets, downrxoctets, origin (optional). The qos field is 1 if a standard user, and
+2 if the user is throttled. The origin field is dump if account_all_origin is set to true
+(origin value: L=LAC data, R=Remote LNS data, P=PPPOE data).
+</LI>
+
+<LI><B>account_all_origin</B> (boolean)<BR>
+If set to true, all origin of the usage is dumped to the accounting file (LAC+Remote LNS+PPPOE)(default false).
</LI>
<LI><B>setuid</B> (int)<BR>
PPPOE access concentrator name (default: "l2tpns-pppoe").
</LI>
+<LI><B>pppoe_only_equal_svc_name</B> (boolean)<BR>
+If set to yes, the PPPOE server only accepts clients with a "service-name"
+different from NULL and a "service-name" equal to server "service-name" (default: no).
+</LI>
+
</UL>
<P><U><B>BGP configuration</B></U></P>
CONFIG("throttle_speed", rl_rate, UNSIGNED_LONG),
CONFIG("throttle_buckets", num_tbfs, INT),
CONFIG("accounting_dir", accounting_dir, STRING),
+ CONFIG("account_all_origin", account_all_origin, BOOL),
CONFIG("dump_speed", dump_speed, BOOL),
CONFIG("multi_read_count", multi_read_count, INT),
CONFIG("scheduler_fifo", scheduler_fifo, BOOL),
CONFIG("disable_no_spoof", disable_no_spoof, BOOL),
CONFIG("bind_multi_address", bind_multi_address, STRING),
CONFIG("grp_txrate_average_time", grp_txrate_average_time, INT),
+ CONFIG("pppoe_only_equal_svc_name", pppoe_only_equal_svc_name, BOOL),
{ NULL, 0, 0, 0 }
};
}
LOG(3, 0, 0, "Dumping accounting information to %s\n", filename);
+ if(config->account_all_origin)
+ {
+ fprintf(*f, "# dslwatch.pl dump file V1.01\n"
+ "# host: %s\n"
+ "# endpoint: %s\n"
+ "# time: %ld\n"
+ "# uptime: %ld\n"
+ "# format: username ip qos uptxoctets downrxoctets origin(L=LAC, R=Remote LNS, P=PPPOE)\n",
+ hostname,
+ fmtaddr(config->iftun_n_address[tunnel[s->tunnel].indexudp] ? config->iftun_n_address[tunnel[s->tunnel].indexudp] : my_address, 0),
+ now,
+ now - basetime);
+ }
+ else
+ {
fprintf(*f, "# dslwatch.pl dump file V1.01\n"
"# host: %s\n"
"# endpoint: %s\n"
fmtaddr(config->iftun_n_address[tunnel[s->tunnel].indexudp] ? config->iftun_n_address[tunnel[s->tunnel].indexudp] : my_address, 0),
now,
now - basetime);
+ }
}
LOG(4, 0, 0, "Dumping accounting information for %s\n", s->user);
+ if(config->account_all_origin)
+ {
+ fprintf(*f, "%s %s %d %u %u %s\n",
+ s->user, // username
+ fmtaddr(htonl(s->ip), 0), // ip
+ (s->throttle_in || s->throttle_out) ? 2 : 1, // qos
+ (uint32_t) s->cin_delta, // uptxoctets
+ (uint32_t) s->cout_delta, // downrxoctets
+ (s->tunnel == TUNNEL_ID_PPPOE)?"P":(tunnel[s->tunnel].isremotelns?"R":"L")); // Origin
+ }
+ else if (!tunnel[s->tunnel].isremotelns && (s->tunnel != TUNNEL_ID_PPPOE))
+ {
fprintf(*f, "%s %s %d %u %u\n",
s->user, // username
fmtaddr(htonl(s->ip), 0), // ip
(s->throttle_in || s->throttle_out) ? 2 : 1, // qos
(uint32_t) s->cin_delta, // uptxoctets
(uint32_t) s->cout_delta); // downrxoctets
+ }
s->cin_delta = s->cout_delta = 0;
int num_tbfs; // number of throttle buckets
char accounting_dir[128];
+ int account_all_origin; // Accouting all origin (LAC data + Remote LNS Data + PPPOE data)
in_addr_t bind_address;
in_addr_t peer_address;
int send_garp; // Set to true to garp for vip address on startup
char pppoe_service_name[64]; // pppoe service name
char pppoe_ac_name[64];
uint8_t pppoe_hwaddr[ETH_ALEN]; // MAC addr of interface pppoe to bind
+ int pppoe_only_equal_svc_name; // Accept only PADI with service-name equal to server
int disable_sending_hello; // Disable l2tp sending HELLO message for Apple compatibility.
int disable_no_spoof; // Disable no spoof (permit load balancing client --> internet)
int nbudpfd; // number UDP file handle
return;
len = ntohs(hdr->length);
- for (n = 0; n < len; n += sizeof(*tag) + ntohs(tag->tag_len)) {
+ for (n = 0; n < len; n += sizeof(*tag) + ntohs(tag->tag_len))
+ {
tag = (struct pppoe_tag *)(pack + ETH_HLEN + sizeof(*hdr) + n);
if (n + sizeof(*tag) + ntohs(tag->tag_len) > len)
return;
- switch (ntohs(tag->tag_type)) {
+ switch (ntohs(tag->tag_type))
+ {
case TAG_END_OF_LIST:
break;
case TAG_SERVICE_NAME:
- if (*config->pppoe_service_name && tag->tag_len)
+ if (config->pppoe_only_equal_svc_name && *config->pppoe_service_name && !tag->tag_len)
+ {
+ break;
+ }
+ else if (*config->pppoe_service_name && tag->tag_len)
{
if (ntohs(tag->tag_len) != strlen(config->pppoe_service_name))
break;
if (memcmp(tag->tag_data, config->pppoe_service_name, ntohs(tag->tag_len)))
break;
+ service_name_tag = tag;
service_match = 1;
}
else