Skip to content

Commit 774e2dc

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 774e2dc

File tree

2 files changed

+35
-27
lines changed

2 files changed

+35
-27
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: 31 additions & 27 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 {
@@ -232,7 +236,7 @@ static int ipcp_server_nak_dns1_address(struct ppp_fsm *fsm,
232236
CONTAINER_OF(fsm, struct ppp_context, ipcp.fsm);
233237

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

237241
return 0;
238242
}
@@ -245,7 +249,7 @@ static int ipcp_server_nak_dns2_address(struct ppp_fsm *fsm,
245249
CONTAINER_OF(fsm, struct ppp_context, ipcp.fsm);
246250

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

250254
return 0;
251255
}

0 commit comments

Comments
 (0)