From: David Woodhouse Date: Wed, 14 Apr 2021 09:07:58 +0000 (+0100) Subject: Implement ppp_reset() X-Git-Tag: v8.20~274 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=66cb11588473cc3293c002f3d0efa4086549e5c3;p=users%2Fdwmw2%2Fopenconnect.git Implement ppp_reset() Sometimes we just want a new PPP session with all the same parameters (including negotiated IP addresses, etc.) as a previous one. Signed-off-by: David Woodhouse --- diff --git a/openconnect-internal.h b/openconnect-internal.h index 57342608..a121e5cf 100644 --- a/openconnect-internal.h +++ b/openconnect-internal.h @@ -1051,6 +1051,7 @@ void buf_append_ppp_hdr(struct oc_text_buf *buf, struct oc_ppp *ppp, uint16_t pr int ppp_negotiate_config(struct openconnect_info *vpninfo); int ppp_mainloop(struct openconnect_info *vpninfo, int *timeout, int readable); int openconnect_ppp_new(struct openconnect_info *vpninfo, int encap, int want_ipv4, int want_ipv6); +int ppp_reset(struct openconnect_info *vpninfo); /* auth-globalprotect.c */ int gpst_obtain_cookie(struct openconnect_info *vpninfo); diff --git a/ppp.c b/ppp.c index 8c759a2c..6e0b2919 100644 --- a/ppp.c +++ b/ppp.c @@ -220,11 +220,6 @@ int openconnect_ppp_new(struct openconnect_info *vpninfo, /* Delay tunnel setup during PPP negotiation */ vpninfo->delay_tunnel_reason = "PPP negotiation"; - /* Nameservers to request from peer - * (see https://tools.ietf.org/html/rfc1877#section-1) */ - if (!vpninfo->ip_info.dns[0] && !vpninfo->ip_info.nbns[0]) - ppp->solicit_peerns = IPCP_DNS0|IPCP_DNS1|IPCP_NBNS0|IPCP_NBNS1; - /* Outgoing IPv4 address and IPv6 interface identifier bits, * if already configured via another mechanism */ if (vpninfo->ip_info.addr) @@ -238,11 +233,33 @@ int openconnect_ppp_new(struct openconnect_info *vpninfo, inet_pton(AF_INET6, vpninfo->ip_info.addr6, &ppp->out_ipv6_addr); } + /* Nameservers to request from peer + * (see https://tools.ietf.org/html/rfc1877#section-1) */ + if (!vpninfo->ip_info.dns[0] && !vpninfo->ip_info.nbns[0]) + ppp->solicit_peerns = IPCP_DNS0|IPCP_DNS1|IPCP_NBNS0|IPCP_NBNS1; + + ppp->encap = encap; + ppp->want_ipv4 = want_ipv4; + ppp->want_ipv6 = want_ipv6 && !vpninfo->disable_ipv6; + + return ppp_reset(vpninfo); +} + +int ppp_reset(struct openconnect_info *vpninfo) +{ + struct oc_ppp *ppp = vpninfo->ppp; + if (!ppp) + return -EINVAL; + + memset(&ppp->lcp, 0, sizeof(ppp->lcp)); + memset(&ppp->ipcp, 0, sizeof(ppp->ipcp)); + memset(&ppp->ip6cp, 0, sizeof(ppp->ip6cp)); + + ppp->ppp_state = PPPS_DEAD; ppp->out_asyncmap = 0; ppp->out_lcp_opts = BIT_MRU | BIT_MAGIC | BIT_PFCOMP | BIT_ACCOMP | BIT_MRU_COAX; - ppp->encap = encap; - switch (encap) { + switch (ppp->encap) { case PPP_ENCAP_F5: /* XX: F5 server cancels our IP address allocation if we PPP-terminate */ ppp->no_terminate_on_pause = 1; @@ -277,8 +294,6 @@ int openconnect_ppp_new(struct openconnect_info *vpninfo, } if (ppp->hdlc) ppp->out_lcp_opts |= BIT_ASYNCMAP; - ppp->want_ipv4 = want_ipv4; - ppp->want_ipv6 = want_ipv6 && !vpninfo->disable_ipv6; ppp->exp_ppp_hdr_size = 4; /* Address(1), Control(1), Proto(2) */ return 0;