IPoE выключение добавления opt82 при dhcp relay

Here you can post your feature requests and suggestions
Post Reply
adeep
Posts: 11
Joined: 06 Nov 2014, 12:51

IPoE выключение добавления opt82 при dhcp relay

Post by adeep »

Предлагаю добавить опцию agent-opt82-enable в секцию ipoe.
= 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);
Post Reply