Fix service_name management and add pppoe_only_equal_svc_name parameter

This commit is contained in:
fendo 2013-04-09 17:03:00 +02:00
parent fb0f416a01
commit 1e722029bc
4 changed files with 17 additions and 3 deletions

View file

@ -466,6 +466,11 @@ PPPOE service name (default: NULL).
PPPOE access concentrator name (default: "l2tpns-pppoe"). PPPOE access concentrator name (default: "l2tpns-pppoe").
</LI> </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> </UL>
<P><U><B>BGP configuration</B></U></P> <P><U><B>BGP configuration</B></U></P>

View file

@ -185,6 +185,7 @@ config_descriptt config_values[] = {
CONFIG("disable_sending_hello", disable_sending_hello, BOOL), CONFIG("disable_sending_hello", disable_sending_hello, BOOL),
CONFIG("disable_no_spoof", disable_no_spoof, BOOL), CONFIG("disable_no_spoof", disable_no_spoof, BOOL),
CONFIG("bind_multi_address", bind_multi_address, STRING), CONFIG("bind_multi_address", bind_multi_address, STRING),
CONFIG("pppoe_only_equal_svc_name", pppoe_only_equal_svc_name, BOOL),
{ NULL, 0, 0, 0 } { NULL, 0, 0, 0 }
}; };

View file

@ -773,6 +773,7 @@ typedef struct
char pppoe_service_name[64]; // pppoe service name char pppoe_service_name[64]; // pppoe service name
char pppoe_ac_name[64]; char pppoe_ac_name[64];
uint8_t pppoe_hwaddr[ETH_ALEN]; // MAC addr of interface pppoe to bind 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_sending_hello; // Disable l2tp sending HELLO message for Apple compatibility.
int disable_no_spoof; // Disable no spoof (permit load balancing client --> internet) int disable_no_spoof; // Disable no spoof (permit load balancing client --> internet)
int nbudpfd; // number UDP file handle int nbudpfd; // number UDP file handle

13
pppoe.c
View file

@ -502,20 +502,27 @@ static void pppoe_recv_PADI(uint8_t *pack, int size)
return; return;
len = ntohs(hdr->length); 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); tag = (struct pppoe_tag *)(pack + ETH_HLEN + sizeof(*hdr) + n);
if (n + sizeof(*tag) + ntohs(tag->tag_len) > len) if (n + sizeof(*tag) + ntohs(tag->tag_len) > len)
return; return;
switch (ntohs(tag->tag_type)) { switch (ntohs(tag->tag_type))
{
case TAG_END_OF_LIST: case TAG_END_OF_LIST:
break; break;
case TAG_SERVICE_NAME: 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)) if (ntohs(tag->tag_len) != strlen(config->pppoe_service_name))
break; break;
if (memcmp(tag->tag_data, config->pppoe_service_name, ntohs(tag->tag_len))) if (memcmp(tag->tag_data, config->pppoe_service_name, ntohs(tag->tag_len)))
break; break;
service_name_tag = tag;
service_match = 1; service_match = 1;
} }
else else