= 1 добавляется опция 82
= 0 опция 82 не добавляется.
Примерные изменения в код:
Code: Select all
diff --git a/accel-pppd/ctrl/ipoe/dhcpv4.c b/accel-pppd/ctrl/ipoe/dhcpv4.c
index 330038f..0f89ec9 100644
--- a/accel-pppd/ctrl/ipoe/dhcpv4.c
+++ b/accel-pppd/ctrl/ipoe/dhcpv4.c
@@ -447,8 +447,12 @@ int dhcpv4_parse_opt82(struct dhcpv4_option *opt, uint8_t **agent_circuit_id, ui
int dhcpv4_packet_insert_opt82(struct dhcpv4_packet *pack, const char *agent_circuit_id, const char *agent_remote_id)
{
- int len1 = strlen(agent_circuit_id);
- int len2 = strlen(agent_remote_id);
+ int len1;
+ int len2;
+ if (agent_circuit_id == NULL || agent_remote_id == NULL)
+ return 0;
+ len1 = strlen(agent_circuit_id);
+ len2 = strlen(agent_remote_id);
uint8_t *data = _malloc(4 + len1 + len2);
uint8_t *ptr = data;
int r;
diff --git a/accel-pppd/ctrl/ipoe/ipoe.c b/accel-pppd/ctrl/ipoe/ipoe.c
index 0e59614..e173552 100644
--- a/accel-pppd/ctrl/ipoe/ipoe.c
+++ b/accel-pppd/ctrl/ipoe/ipoe.c
@@ -146,6 +146,7 @@ static int conf_lease_time = 600;
static int conf_lease_timeout = 660;
static int conf_verbose;
static const char *conf_agent_remote_id;
+static int conf_agent_relay_opt82;
static int conf_proto;
static LIST_HEAD(conf_offer_delay);
static const char *conf_vlan_name;
@@ -342,7 +343,10 @@ static void ipoe_relay_timeout(struct triton_timer_t *t)
ap_session_terminate(&ses->ses, TERM_LOST_CARRIER, 1);
} else
- dhcpv4_relay_send(ses->serv->dhcpv4_relay, ses->dhcpv4_request, ses->relay_server_id, ses->serv->ifname, conf_agent_remote_id);
+ if (conf_agent_relay_opt82)
+ dhcpv4_relay_send(ses->serv->dhcpv4_relay, ses->dhcpv4_request, ses->relay_server_id, ses->serv->ifname, conf_agent_remote_id);
+ else
+ dhcpv4_relay_send(ses->serv->dhcpv4_relay, ses->dhcpv4_request, ses->relay_server_id, NULL, NULL);
}
@@ -580,7 +584,10 @@ cont:
ap_session_set_ifindex(&ses->ses);
if (ses->dhcpv4_request && ses->serv->dhcpv4_relay) {
- dhcpv4_relay_send(ses->serv->dhcpv4_relay, ses->dhcpv4_request, ses->relay_server_id, ses->serv->ifname, conf_agent_remote_id);
+ if (conf_agent_relay_opt82)
+ dhcpv4_relay_send(ses->serv->dhcpv4_relay, ses->dhcpv4_request, ses->relay_server_id, ses->serv->ifname, conf_agent_remote_id);
+ else
+ dhcpv4_relay_send(ses->serv->dhcpv4_relay, ses->dhcpv4_request, ses->relay_server_id, NULL, NULL);
ses->timer.expire = ipoe_relay_timeout;
ses->timer.period = conf_relay_timeout * 1000;
@@ -976,7 +983,10 @@ static void ipoe_session_activate(struct dhcpv4_packet *pack)
ses->dhcpv4_request = pack;
if (ses->serv->dhcpv4_relay)
- dhcpv4_relay_send(ses->serv->dhcpv4_relay, ses->dhcpv4_request, ses->relay_server_id, ses->serv->ifname, conf_agent_remote_id);
+ if (conf_agent_relay_opt82)
+ dhcpv4_relay_send(ses->serv->dhcpv4_relay, ses->dhcpv4_request, ses->relay_server_id, ses->serv->ifname, conf_agent_remote_id);
+ else
+ dhcpv4_relay_send(ses->serv->dhcpv4_relay, ses->dhcpv4_request, ses->relay_server_id, NULL, NULL);
else
__ipoe_session_activate(ses);
}
@@ -996,7 +1006,10 @@ static void ipoe_session_keepalive(struct dhcpv4_packet *pack)
ses->xid = ses->dhcpv4_request->hdr->xid;
if (/*ses->ses.state == AP_STATE_ACTIVE &&*/ ses->serv->dhcpv4_relay) {
- dhcpv4_relay_send(ses->serv->dhcpv4_relay, ses->dhcpv4_request, ses->relay_server_id, ses->serv->ifname, conf_agent_remote_id);
+ if (conf_agent_relay_opt82)
+ dhcpv4_relay_send(ses->serv->dhcpv4_relay, ses->dhcpv4_request, ses->relay_server_id, ses->serv->ifname, conf_agent_remote_id);
+ else
+ dhcpv4_relay_send(ses->serv->dhcpv4_relay, ses->dhcpv4_request, ses->relay_server_id, NULL, NULL);
return;
}
@@ -1021,6 +1034,11 @@ static void ipoe_session_decline(struct dhcpv4_packet *pack)
if (pack->msg_type == DHCPDECLINE && ses->serv->dhcpv4_relay)
dhcpv4_relay_send(ses->serv->dhcpv4_relay, pack, 0, ses->serv->ifname, conf_agent_remote_id);
+ if (conf_agent_relay_opt82)
+ dhcpv4_relay_send(ses->serv->dhcpv4_relay, pack, 0, ses->serv->ifname, conf_agent_remote_id);
+ else
+ dhcpv4_relay_send(ses->serv->dhcpv4_relay, pack, 0, NULL, NULL);
+
dhcpv4_packet_free(pack);
ap_session_terminate(&ses->ses, TERM_USER_REQUEST, 1);
@@ -1113,6 +1131,7 @@ static void ipoe_session_finished(struct ap_session *s)
if (ses->relay_addr && ses->serv->dhcpv4_relay)
dhcpv4_relay_send_release(ses->serv->dhcpv4_relay, ses->hwaddr, ses->xid, ses->yiaddr, ses->client_id, ses->relay_agent, ses->serv->ifname, conf_agent_remote_id);
+
if (ses->ifcfg)
ipoe_ifcfg_del(ses, 1);
@@ -1348,7 +1367,14 @@ static void ipoe_ses_recv_dhcpv4(struct dhcpv4_serv *dhcpv4, struct dhcpv4_packe
if (pack->server_id == ses->siaddr)
dhcpv4_send_nak(dhcpv4, pack);
else if (ses->serv->dhcpv4_relay)
- dhcpv4_relay_send(ses->serv->dhcpv4_relay, pack, 0, ses->serv->ifname, conf_agent_remote_id);
+ {
+ if (conf_agent_relay_opt82)
+ dhcpv4_relay_send(ses->serv->dhcpv4_relay, pack, 0, ses->serv->ifname, conf_agent_remote_id);
+ else
+ dhcpv4_relay_send(ses->serv->dhcpv4_relay, pack, 0, NULL, NULL);
+ }
+
+
triton_context_call(ses->ctrl.ctx, (triton_event_func)__ipoe_session_terminate, &ses->ses);
} else {
@@ -3205,6 +3231,12 @@ static void load_config(void)
else
conf_agent_remote_id = "accel-pppd";
+ opt = conf_get_opt("ipoe","agent-opt82-enable");
+ if (opt && atoi(opt) >=0)
+ conf_agent_relay_opt82 = atoi(opt);
+ else
+ conf_agent_relay_opt82 = 1;
+
opt = conf_get_opt("ipoe", "ipv6");
if (opt)
conf_ipv6 = atoi(opt);