Skip to content

Commit b47e462

Browse files
committed
net: ppp: ipcp: Don't request DNS if not needed
When Kconfig option CONFIG_NET_L2_PPP_OPTION_DNS_USE is enabled, Zephyr should request two DNS addresses in IPCP negotiation by sending IPCP ConfReq for DNS otions using 0.0.0.0 as an address. Remote peer may offer DNS by sending IPCP ConfNak with proper address. This is explained in RFC 1332 and RFC 1877 (DNS extension). When no DNS is required, we should only send IPCP ConfReq for IP address, without having DNS fields in the same request. However, when PPP is configured to serve a DNS using Kconfig option CONFIG_NET_L2_PPP_OPTION_SERVE_DNS it should serve the DNS address in the IPCP ConfNak message and from the ipcp.peer_options structure, not from the ipcp.my_options. This might break backward compatibility outside this repository as DNS addresses used to be served from ipcp.my_options. Signed-off-by: Seppo Takalo <seppo.takalo@nordicsemi.no>
1 parent 66acb36 commit b47e462

File tree

2 files changed

+39
-31
lines changed

2 files changed

+39
-31
lines changed

include/zephyr/net/ppp.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,11 @@ struct ppp_my_option_data {
353353
uint32_t flags;
354354
};
355355

356+
#if defined(CONFIG_NET_L2_PPP_OPTION_DNS_USE)
356357
#define IPCP_NUM_MY_OPTIONS 3
358+
#else
359+
#define IPCP_NUM_MY_OPTIONS 1
360+
#endif
357361
#define IPV6CP_NUM_MY_OPTIONS 1
358362

359363
enum ppp_flags {

subsys/net/l2/ppp/ipcp.c

Lines changed: 35 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -42,16 +42,6 @@ static int ipcp_add_ip_address(struct ppp_context *ctx, struct net_pkt *pkt)
4242
return ipcp_add_address(ctx, pkt, &ctx->ipcp.my_options.address);
4343
}
4444

45-
static int ipcp_add_dns1(struct ppp_context *ctx, struct net_pkt *pkt)
46-
{
47-
return ipcp_add_address(ctx, pkt, &ctx->ipcp.my_options.dns1_address);
48-
}
49-
50-
static int ipcp_add_dns2(struct ppp_context *ctx, struct net_pkt *pkt)
51-
{
52-
return ipcp_add_address(ctx, pkt, &ctx->ipcp.my_options.dns2_address);
53-
}
54-
5545
static int ipcp_ack_check_address(struct net_pkt *pkt, size_t oplen,
5646
struct in_addr *addr)
5747
{
@@ -81,20 +71,6 @@ static int ipcp_ack_ip_address(struct ppp_context *ctx, struct net_pkt *pkt,
8171
&ctx->ipcp.my_options.address);
8272
}
8373

84-
static int ipcp_ack_dns1(struct ppp_context *ctx, struct net_pkt *pkt,
85-
uint8_t oplen)
86-
{
87-
return ipcp_ack_check_address(pkt, oplen,
88-
&ctx->ipcp.my_options.dns1_address);
89-
}
90-
91-
static int ipcp_ack_dns2(struct ppp_context *ctx, struct net_pkt *pkt,
92-
uint8_t oplen)
93-
{
94-
return ipcp_ack_check_address(pkt, oplen,
95-
&ctx->ipcp.my_options.dns2_address);
96-
}
97-
9874
static int ipcp_nak_override_address(struct net_pkt *pkt, size_t oplen,
9975
struct in_addr *addr)
10076
{
@@ -112,6 +88,31 @@ static int ipcp_nak_ip_address(struct ppp_context *ctx, struct net_pkt *pkt,
11288
&ctx->ipcp.my_options.address);
11389
}
11490

91+
#if defined(CONFIG_NET_L2_PPP_OPTION_DNS_USE)
92+
static int ipcp_add_dns1(struct ppp_context *ctx, struct net_pkt *pkt)
93+
{
94+
return ipcp_add_address(ctx, pkt, &ctx->ipcp.my_options.dns1_address);
95+
}
96+
97+
static int ipcp_add_dns2(struct ppp_context *ctx, struct net_pkt *pkt)
98+
{
99+
return ipcp_add_address(ctx, pkt, &ctx->ipcp.my_options.dns2_address);
100+
}
101+
102+
static int ipcp_ack_dns1(struct ppp_context *ctx, struct net_pkt *pkt,
103+
uint8_t oplen)
104+
{
105+
return ipcp_ack_check_address(pkt, oplen,
106+
&ctx->ipcp.my_options.dns1_address);
107+
}
108+
109+
static int ipcp_ack_dns2(struct ppp_context *ctx, struct net_pkt *pkt,
110+
uint8_t oplen)
111+
{
112+
return ipcp_ack_check_address(pkt, oplen,
113+
&ctx->ipcp.my_options.dns2_address);
114+
}
115+
115116
static int ipcp_nak_dns1(struct ppp_context *ctx, struct net_pkt *pkt,
116117
uint8_t oplen)
117118
{
@@ -125,21 +126,24 @@ static int ipcp_nak_dns2(struct ppp_context *ctx, struct net_pkt *pkt,
125126
return ipcp_nak_override_address(pkt, oplen,
126127
&ctx->ipcp.my_options.dns2_address);
127128
}
129+
#endif /* CONFIG_NET_L2_PPP_OPTION_DNS_USE */
128130

129131
static const struct ppp_my_option_info ipcp_my_options[] = {
130132
PPP_MY_OPTION(IPCP_OPTION_IP_ADDRESS, ipcp_add_ip_address,
131133
ipcp_ack_ip_address, ipcp_nak_ip_address),
134+
#if defined(CONFIG_NET_L2_PPP_OPTION_DNS_USE)
132135
PPP_MY_OPTION(IPCP_OPTION_DNS1, ipcp_add_dns1,
133136
ipcp_ack_dns1, ipcp_nak_dns1),
134137
PPP_MY_OPTION(IPCP_OPTION_DNS2, ipcp_add_dns2,
135138
ipcp_ack_dns2, ipcp_nak_dns2),
139+
#endif
136140
};
137141

138142
BUILD_ASSERT(ARRAY_SIZE(ipcp_my_options) == IPCP_NUM_MY_OPTIONS);
139143

140144
static struct net_pkt *ipcp_config_info_add(struct ppp_fsm *fsm)
141145
{
142-
return ppp_my_options_add(fsm, 3 * IP_ADDRESS_OPTION_LEN);
146+
return ppp_my_options_add(fsm, IPCP_NUM_MY_OPTIONS * IP_ADDRESS_OPTION_LEN);
143147
}
144148

145149
struct ipcp_peer_option_data {
@@ -216,7 +220,7 @@ static int ipcp_server_nak_ip_address(struct ppp_fsm *fsm,
216220
struct ppp_context *ctx =
217221
CONTAINER_OF(fsm, struct ppp_context, ipcp.fsm);
218222

219-
(void)net_pkt_write_u8(ret_pkt, IPCP_OPTION_IP_ADDRESS);
223+
(void) net_pkt_write_u8(ret_pkt, IPCP_OPTION_IP_ADDRESS);
220224
ipcp_add_ip_address(ctx, ret_pkt);
221225

222226
return 0;
@@ -231,8 +235,8 @@ static int ipcp_server_nak_dns1_address(struct ppp_fsm *fsm,
231235
struct ppp_context *ctx =
232236
CONTAINER_OF(fsm, struct ppp_context, ipcp.fsm);
233237

234-
(void)net_pkt_write_u8(ret_pkt, IPCP_OPTION_DNS1);
235-
ipcp_add_dns1(ctx, ret_pkt);
238+
(void) net_pkt_write_u8(ret_pkt, IPCP_OPTION_DNS1);
239+
(void) ipcp_add_address(ctx, ret_pkt, &ctx->ipcp.peer_options.dns1_address);
236240

237241
return 0;
238242
}
@@ -244,8 +248,8 @@ static int ipcp_server_nak_dns2_address(struct ppp_fsm *fsm,
244248
struct ppp_context *ctx =
245249
CONTAINER_OF(fsm, struct ppp_context, ipcp.fsm);
246250

247-
(void)net_pkt_write_u8(ret_pkt, IPCP_OPTION_DNS2);
248-
ipcp_add_dns2(ctx, ret_pkt);
251+
(void) net_pkt_write_u8(ret_pkt, IPCP_OPTION_DNS2);
252+
(void) ipcp_add_address(ctx, ret_pkt, &ctx->ipcp.peer_options.dns2_address);
249253

250254
return 0;
251255
}
@@ -433,7 +437,7 @@ static void ipcp_down(struct ppp_fsm *fsm)
433437

434438
/* Ensure address is always removed if it exists */
435439
if (ctx->ipcp.my_options.address.s_addr) {
436-
(void)net_if_ipv4_addr_rm(
440+
(void) net_if_ipv4_addr_rm(
437441
ctx->iface, &ctx->ipcp.my_options.address);
438442
}
439443
memset(&ctx->ipcp.my_options.address, 0,

0 commit comments

Comments
 (0)