ipcp
struct sipcp ipcp; /* IPCP params */
sp->ipcp.opts = 0;
sp->ipcp.flags = 0;
task_set(&sp->ipcp.set_addr_task, sppp_set_ip_addrs, sp);
task_set(&sp->ipcp.clear_addr_task, sppp_clear_ip_addrs, sp);
task_del(systq, &sp->ipcp.set_addr_task);
task_del(systq, &sp->ipcp.clear_addr_task);
sppp_up_event(&ipcp, sp);
sppp_down_event(&ipcp, sp);
sppp_open_event(&ipcp, sp);
sppp_close_event(&ipcp, sp);
sppp_to_event(&ipcp, (struct sppp *)cookie);
if (sp->ipcp.flags & IPCP_HISADDR_SEEN)
hisaddr = sp->ipcp.req_hisaddr; /* we already agreed on that */
((sp->ipcp.flags & IPCP_HISADDR_DYN) &&
sp->ipcp.flags |= IPCP_HISADDR_SEEN;
sp->ipcp.req_hisaddr = desiredaddr;
if (rlen == 0 && !(sp->ipcp.flags & IPCP_HISADDR_SEEN)) {
sp->ipcp.opts &= ~(1 << SPPP_IPCP_OPT_ADDRESS);
sp->ipcp.opts &= ~(1 << SPPP_IPCP_OPT_COMPRESS);
sp->ipcp.opts &= ~(1 << SPPP_IPCP_OPT_PRIMDNS);
sp->ipcp.opts &= ~(1 << SPPP_IPCP_OPT_SECDNS);
sp->ipcp.opts |= (1 << SPPP_IPCP_OPT_ADDRESS);
if (sp->ipcp.flags & IPCP_MYADDR_DYN) {
sp->ipcp.flags |= IPCP_MYADDR_SEEN;
sp->ipcp.req_myaddr = wantaddr;
memcpy(&sp->ipcp.dns[0].s_addr, p + 2,
sizeof(sp->ipcp.dns[0]));
memcpy(&sp->ipcp.dns[1].s_addr, p + 2,
sizeof(sp->ipcp.dns[1]));
if (sp->ipcp.req_myaddr != 0 || sp->ipcp.req_hisaddr != 0)
task_add(systq, &sp->ipcp.set_addr_task);
sp->ipcp.flags &= ~(IPCP_HISADDR_SEEN|IPCP_MYADDR_SEEN|
sp->ipcp.req_myaddr = 0;
sp->ipcp.req_hisaddr = 0;
memset(&sp->ipcp.dns, 0, sizeof(sp->ipcp.dns));
sp->ipcp.flags |= IPCP_MYADDR_DYN;
sp->ipcp.opts |= (1 << SPPP_IPCP_OPT_ADDRESS);
sp->ipcp.flags |= IPCP_HISADDR_DYN;
sp->ipcp.opts |= (1 << SPPP_IPCP_OPT_PRIMDNS);
sp->ipcp.opts |= (1 << SPPP_IPCP_OPT_SECDNS);
if (sp->ipcp.flags & (IPCP_MYADDR_DYN|IPCP_HISADDR_DYN))
task_add(systq, &sp->ipcp.clear_addr_task);
if (sp->ipcp.opts & (1 << SPPP_IPCP_OPT_COMPRESSION)) {
if (sp->ipcp.opts & (1 << SPPP_IPCP_OPT_ADDRESS)) {
if (sp->ipcp.flags & IPCP_MYADDR_SEEN)
ouraddr = sp->ipcp.req_myaddr;
if (sp->ipcp.opts & (1 << SPPP_IPCP_OPT_PRIMDNS)) {
memcpy(&opt[i], &sp->ipcp.dns[0].s_addr,
sizeof(sp->ipcp.dns[0]));
i += sizeof(sp->ipcp.dns[0]);
if (sp->ipcp.opts & (1 << SPPP_IPCP_OPT_SECDNS)) {
memcpy(&opt[i], &sp->ipcp.dns[1].s_addr,
sizeof(sp->ipcp.dns[1]));
i += sizeof(sp->ipcp.dns[1]);
static const struct cp ipcp = {
&ipcp, /* IDX_IPCP */
if ((sp->ipcp.flags & IPCP_MYADDR_DYN) &&
(sp->ipcp.flags & IPCP_MYADDR_SEEN))
myaddr = sp->ipcp.req_myaddr;
if ((sp->ipcp.flags & IPCP_HISADDR_DYN) &&
(sp->ipcp.flags & IPCP_HISADDR_SEEN))
hisaddr = sp->ipcp.req_hisaddr;
sp->ipcp.saved_hisaddr = dest->sin_addr.s_addr;
if (sp->ipcp.flags & IPCP_HISADDR_DYN)
remote = sp->ipcp.saved_hisaddr;
if (sp->ipcp.flags & IPCP_MYADDR_DYN)
if (sp->ipcp.flags & IPCP_HISADDR_DYN)
dest->sin_addr.s_addr = sp->ipcp.saved_hisaddr;
memset(sp->ipcp.dns, 0, sizeof(sp->ipcp.dns));
memcpy(spd->dns, sp->ipcp.dns, sizeof(spd->dns));
if (sp->ipcp.dns[i].s_addr == INADDR_ANY)
sz = sizeof(sp->ipcp.dns[i]);
memcpy(rtdns.sr_dns + i * sz, &sp->ipcp.dns[i].s_addr, sz);
sppp_cp_input(&ipcp, sp, m);
ipcp_init(ipcp *_this, npppd_ppp *ppp)
memset(_this, 0, sizeof(ipcp));
memcpy(pktp, &f->ppp->ipcp.ip4_our.s_addr, 4);
inet_ntoa(f->ppp->ipcp.ip4_our));
inet_ntoa(f->ppp->ipcp.ip4_our));
ip_addrp = &ppp->ipcp.dns_pri; break;
ip_addrp = &ppp->ipcp.dns_sec; break;
ip_addrp = &ppp->ipcp.nbns_pri; break;
ip_addrp = &ppp->ipcp.nbns_sec; break;
rejfsm = &f->ppp->ipcp.fsm;
ppp->ipcp.ip4_our = ppp_iface(ppp)->ip4addr;
ppp->ipcp.ip4_our = _this->iface[0].ip4addr;
ppp->ipcp.dns_pri = ppp_ipcp(ppp)->dns_servers[0];
ppp->ipcp.dns_sec = ppp_ipcp(ppp)->dns_servers[1];
ppp->ipcp.nbns_pri = ppp_ipcp(ppp)->nbns_servers[0];
ppp->ipcp.nbns_sec = ppp_ipcp(ppp)->nbns_servers[1];
struct ipcpconf *ipcp;
TAILQ_FOREACH(ipcp, &_this->conf.ipcpconfs, entry) {
if (npppd_pool_init(&pool0[n], _this, ipcp->name) != 0) {
"npppd_pool '%s': %m", ipcp->name);
struct ipcpconf *ipcp;
TAILQ_FOREACH(ipcp, &_this->npppd->conf.ipcpconfs, entry) {
if (strcmp(ipcp->name, _this->ipcp_name) == 0) {
dyna_pool = ipcp->dynamic_pool;
pool = ipcp->static_pool;
_this->ipcp.dns_pri = ip4;
_this->ipcp.dns_sec = ip4;
(got_pri)? inet_ntop(AF_INET, &_this->ipcp.dns_pri,
(got_sec)? inet_ntop(AF_INET, &_this->ipcp.dns_sec,
_this->ipcp.nbns_pri = ip4;
_this->ipcp.nbns_sec = ip4;
(got_pri)? inet_ntop(AF_INET, &_this->ipcp.nbns_pri,
(got_sec)? inet_ntop(AF_INET, &_this->ipcp.nbns_sec,
struct ipcpconf *ipcp, *ipcp0;
TAILQ_FOREACH_SAFE(ipcp, &xconf->ipcpconfs, entry, ipcp0) {
ipcpconf_fini(ipcp);
| grammar ipcp '\n'
ipcpconf_init(struct ipcpconf *ipcp)
memset(ipcp, 0, sizeof(struct ipcpconf));
ipcpconf_fini(struct ipcpconf *ipcp)
if (ipcp->dynamic_pool != NULL)
in_addr_range_list_remove_all(&ipcp->dynamic_pool);
if (ipcp->static_pool != NULL)
in_addr_range_list_remove_all(&ipcp->static_pool);
struct ipcpconf *ipcp;
TAILQ_FOREACH(ipcp, &conf->ipcpconfs, entry) {
if (strcmp(ipcp->name, name) == 0)
return ipcp;
ipcp : IPCP STRING {
struct ipcpconf *ipcp;
if ((ipcp = ipcpconf_find($6)) == NULL) {
n->ipcpconf = ipcp;
ipcp_init(&_this->ipcp, _this);
fsm_lowerdown(&_this->ipcp.fsm);
fsm_lowerdown(&_this->ipcp.fsm);
fsm_lowerup(&_this->ipcp.fsm);
fsm_open(&_this->ipcp.fsm);
fsm_input(&_this->ipcp.fsm, inp,
ipcp ipcp; /** ipcp */
void ipcp_init (ipcp *, npppd_ppp *);
struct module_ipcp *ipcp;
module_imsg_compose(assign->dae->ipcp->base, IMSG_NG,
struct module_ipcp *self = dae->ipcp;
struct module_ipcp *self = dae->ipcp;
dae0->ipcp = module;