31 #include "netif/ppp/ppp_opts.h" 32 #if PPP_SUPPORT && DEMAND_SUPPORT 42 #include <sys/param.h> 43 #include <sys/types.h> 46 #include <sys/resource.h> 49 #include <netinet/in.h> 50 #include <arpa/inet.h> 55 #include "netif/ppp/ppp_impl.h" 57 #include "netif/ppp/fsm.h" 58 #include "netif/ppp/ipcp.h" 59 #include "netif/ppp/lcp.h" 71 unsigned char data[1];
74 struct packet *pend_q;
75 struct packet *pend_qtail;
77 static int active_packet (
unsigned char *,
int);
86 const struct protent *protp;
91 framemax += PPP_HDRLEN + PPP_FCSLEN;
92 frame = malloc(framemax);
101 netif_set_mtu(pcb, LWIP_MIN(lcp_allowoptions[0].mru, PPP_MRU));
102 if (ppp_send_config(pcb, PPP_MRU, (u32_t) 0, 0, 0) < 0
103 || ppp_recv_config(pcb, PPP_MRU, (u32_t) 0, 0, 0) < 0)
104 fatal(
"Couldn't set up demand-dialled PPP interface: %m");
107 set_filters(&pass_filter, &active_filter);
113 for (i = 0; (protp = protocols[i]) != NULL; ++i)
114 if (protp->demand_conf != NULL)
115 ((*protp->demand_conf)(pcb));
118 if (!((*protp->demand_conf)(pcb)))
131 const struct protent *protp;
133 for (i = 0; (protp = protocols[i]) != NULL; ++i)
134 if (protp->demand_conf != NULL)
135 sifnpmode(pcb, protp->protocol & ~0x8000, NPMODE_QUEUE);
146 struct packet *pkt, *nextpkt;
148 const struct protent *protp;
150 for (i = 0; (protp = protocols[i]) != NULL; ++i)
151 if (protp->demand_conf != NULL)
152 sifnpmode(pcb, protp->protocol & ~0x8000, NPMODE_ERROR);
156 for (pkt = pend_q; pkt != NULL; pkt = nextpkt) {
174 const struct protent *protp;
176 for (i = 0; (protp = protocols[i]) != NULL; ++i)
177 if (protp->demand_conf != NULL)
178 sifnpmode(pcb, protp->protocol & ~0x8000, NPMODE_PASS);
184 static u_short fcstab[256] = {
185 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
186 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
187 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
188 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
189 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
190 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
191 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
192 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
193 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
194 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
195 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
196 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
197 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
198 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
199 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
200 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
201 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
202 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
203 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
204 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
205 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
206 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
207 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
208 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
209 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
210 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
211 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
212 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
213 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
214 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
215 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
216 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
235 if ( (p[0] == 0xFF) && (p[1] == 0x03) ) {
236 rv = loop_frame(p,n);
243 if (!escape_flag && !flush_flag
244 && framelen > 2 && fcs == PPP_GOODFCS) {
246 if (loop_frame((
unsigned char *)frame, framelen))
260 }
else if (c == PPP_ESCAPE) {
264 if (framelen >= framemax) {
268 frame[framelen++] = c;
269 fcs = PPP_FCS(fcs, c);
285 loop_frame(frame, len)
286 unsigned
char *frame;
292 if (len < PPP_HDRLEN)
294 if ((PPP_PROTOCOL(frame) & 0x8000) != 0)
296 if (!active_packet(frame, len))
299 pkt = (
struct packet *) malloc(
sizeof(
struct packet) + len);
303 memcpy(pkt->data, frame, len);
307 pend_qtail->next = pkt;
318 demand_rexmit(proto, newip)
322 struct packet *pkt, *prev, *nextpkt;
323 unsigned short checksum;
324 unsigned short pkt_checksum = 0;
335 select(0,NULL,NULL,NULL,&tv);
336 for (; pkt != NULL; pkt = nextpkt) {
338 if (PPP_PROTOCOL(pkt->data) == proto) {
339 if ( (proto == PPP_IP) && newip ) {
342 iphdr = (pkt->data[4] & 15) << 2;
343 checksum = *((
unsigned short *) (pkt->data+14));
344 if (checksum == 0xFFFF) {
349 if (pkt->data[13] == 17) {
350 pkt_checksum = *((
unsigned short *) (pkt->data+10+iphdr));
353 if (pkt_checksum == 0xFFFF) {
362 if (pkt->data[13] == 6) {
363 pkt_checksum = *((
unsigned short *) (pkt->data+20+iphdr));
365 if (pkt_checksum == 0xFFFF) {
371 checksum -= *((
unsigned short *) (pkt->data+16)) ^ 0xFFFF;
372 checksum -= *((
unsigned short *) (pkt->data+18)) ^ 0xFFFF;
374 pkt_checksum -= *((
unsigned short *) (pkt->data+16)) ^ 0xFFFF;
375 pkt_checksum -= *((
unsigned short *) (pkt->data+18)) ^ 0xFFFF;
378 * ((u32_t *) (pkt->data + 16)) = newip;
381 checksum += *((
unsigned short *) (pkt->data+16)) ^ 0xFFFF;
382 checksum += *((
unsigned short *) (pkt->data+18)) ^ 0xFFFF;
384 pkt_checksum += *((
unsigned short *) (pkt->data+16)) ^ 0xFFFF;
385 pkt_checksum += *((
unsigned short *) (pkt->data+18)) ^ 0xFFFF;
391 *((
unsigned short *) (pkt->data+14)) = checksum;
392 if (pkt->data[13] == 6) {
393 *((
unsigned short *) (pkt->data+20+iphdr)) = pkt_checksum;
395 if (cv && (pkt->data[13] == 17) ) {
396 *((
unsigned short *) (pkt->data+10+iphdr)) = pkt_checksum;
400 strcpy(ipstr,inet_ntoa(*( (
struct in_addr *) (pkt->data+16))));
401 if (pkt->data[13] == 1) {
402 syslog(LOG_INFO,
"Open ICMP %s -> %s\n",
404 inet_ntoa(*( (
struct in_addr *) (pkt->data+20))));
406 syslog(LOG_INFO,
"Open %s %s:%d -> %s:%d\n",
407 pkt->data[13] == 6 ?
"TCP" :
"UDP",
409 ntohs(*( (
short *) (pkt->data+iphdr+4))),
410 inet_ntoa(*( (
struct in_addr *) (pkt->data+20))),
411 ntohs(*( (
short *) (pkt->data+iphdr+6))));
414 output(pcb, pkt->data, pkt->length);
434 active_packet(p, len)
439 const struct protent *protp;
441 if (len < PPP_HDRLEN)
443 proto = PPP_PROTOCOL(p);
446 if ((pass_filter.bf_len != 0
447 && bpf_filter(pass_filter.bf_insns, p, len, len) == 0)
448 || (active_filter.bf_len != 0
449 && bpf_filter(active_filter.bf_insns, p, len, len) == 0)) {
455 for (i = 0; (protp = protocols[i]) != NULL; ++i) {
456 if (protp->protocol < 0xC000 && (protp->protocol & ~0x8000) == proto) {
457 if (protp->active_pkt == NULL)
459 return (*protp->active_pkt)(p, len);