rockchip: add driver for hardware RNG
[openwrt/openwrt.git] / package / network / services / ppp / patches / 105-debian_demand.patch
1 --- a/pppd/demand.c
2 +++ b/pppd/demand.c
3 @@ -36,6 +36,8 @@
4 #include <errno.h>
5 #include <fcntl.h>
6 #include <netdb.h>
7 +#include <unistd.h>
8 +#include <syslog.h>
9 #include <sys/param.h>
10 #include <sys/types.h>
11 #include <sys/wait.h>
12 @@ -43,6 +45,8 @@
13 #include <sys/resource.h>
14 #include <sys/stat.h>
15 #include <sys/socket.h>
16 +#include <netinet/in.h>
17 +#include <arpa/inet.h>
18 #ifdef PPP_FILTER
19 #include <pcap-bpf.h>
20 #endif
21 @@ -218,6 +222,14 @@ loop_chars(unsigned char *p, int n)
22 int c, rv;
23
24 rv = 0;
25 +
26 +/* check for synchronous connection... */
27 +
28 + if ( (p[0] == 0xFF) && (p[1] == 0x03) ) {
29 + rv = loop_frame(p,n);
30 + return rv;
31 + }
32 +
33 for (; n > 0; --n) {
34 c = *p++;
35 if (c == PPP_FLAG) {
36 @@ -294,16 +306,100 @@ loop_frame(unsigned char *frame, int len
37 * loopback, now that the real serial link is up.
38 */
39 void
40 -demand_rexmit(int proto)
41 +demand_rexmit(int proto, u_int32_t newip)
42 {
43 struct packet *pkt, *prev, *nextpkt;
44 + unsigned short checksum;
45 + unsigned short pkt_checksum = 0;
46 + unsigned iphdr;
47 + struct timeval tv;
48 + char cv = 0;
49 + char ipstr[16];
50
51 prev = NULL;
52 pkt = pend_q;
53 pend_q = NULL;
54 + tv.tv_sec = 1;
55 + tv.tv_usec = 0;
56 + select(0,NULL,NULL,NULL,&tv); /* Sleep for 1 Seconds */
57 for (; pkt != NULL; pkt = nextpkt) {
58 nextpkt = pkt->next;
59 if (PPP_PROTOCOL(pkt->data) == proto) {
60 + if ( (proto == PPP_IP) && newip ) {
61 + /* Get old checksum */
62 +
63 + iphdr = (pkt->data[4] & 15) << 2;
64 + checksum = *((unsigned short *) (pkt->data+14));
65 + if (checksum == 0xFFFF) {
66 + checksum = 0;
67 + }
68 +
69 +
70 + if (pkt->data[13] == 17) {
71 + pkt_checksum = *((unsigned short *) (pkt->data+10+iphdr));
72 + if (pkt_checksum) {
73 + cv = 1;
74 + if (pkt_checksum == 0xFFFF) {
75 + pkt_checksum = 0;
76 + }
77 + }
78 + else {
79 + cv = 0;
80 + }
81 + }
82 +
83 + if (pkt->data[13] == 6) {
84 + pkt_checksum = *((unsigned short *) (pkt->data+20+iphdr));
85 + cv = 1;
86 + if (pkt_checksum == 0xFFFF) {
87 + pkt_checksum = 0;
88 + }
89 + }
90 +
91 + /* Delete old Source-IP-Address */
92 + checksum -= *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
93 + checksum -= *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
94 +
95 + pkt_checksum -= *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
96 + pkt_checksum -= *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
97 +
98 + /* Change Source-IP-Address */
99 + * ((u_int32_t *) (pkt->data + 16)) = newip;
100 +
101 + /* Add new Source-IP-Address */
102 + checksum += *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
103 + checksum += *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
104 +
105 + pkt_checksum += *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
106 + pkt_checksum += *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
107 +
108 + /* Write new checksum */
109 + if (!checksum) {
110 + checksum = 0xFFFF;
111 + }
112 + *((unsigned short *) (pkt->data+14)) = checksum;
113 + if (pkt->data[13] == 6) {
114 + *((unsigned short *) (pkt->data+20+iphdr)) = pkt_checksum;
115 + }
116 + if (cv && (pkt->data[13] == 17) ) {
117 + *((unsigned short *) (pkt->data+10+iphdr)) = pkt_checksum;
118 + }
119 +
120 + /* Log Packet */
121 + strcpy(ipstr,inet_ntoa(*( (struct in_addr *) (pkt->data+16))));
122 + if (pkt->data[13] == 1) {
123 + syslog(LOG_INFO,"Open ICMP %s -> %s\n",
124 + ipstr,
125 + inet_ntoa(*( (struct in_addr *) (pkt->data+20))));
126 + } else {
127 + syslog(LOG_INFO,"Open %s %s:%d -> %s:%d\n",
128 + pkt->data[13] == 6 ? "TCP" : "UDP",
129 + ipstr,
130 + ntohs(*( (short *) (pkt->data+iphdr+4))),
131 + inet_ntoa(*( (struct in_addr *) (pkt->data+20))),
132 + ntohs(*( (short *) (pkt->data+iphdr+6))));
133 + }
134 + }
135 output(0, pkt->data, pkt->length);
136 free(pkt);
137 } else {
138 --- a/pppd/ipcp.c
139 +++ b/pppd/ipcp.c
140 @@ -1850,7 +1850,7 @@ ipcp_up(fsm *f)
141 proxy_arp_set[f->unit] = 1;
142
143 }
144 - demand_rexmit(PPP_IP);
145 + demand_rexmit(PPP_IP,go->ouraddr);
146 sifnpmode(f->unit, PPP_IP, NPMODE_PASS);
147
148 } else {
149 --- a/pppd/ipv6cp.c
150 +++ b/pppd/ipv6cp.c
151 @@ -1253,7 +1253,7 @@ ipv6cp_up(fsm *f)
152 if (sif6defaultroute(f->unit, go->ourid, ho->hisid))
153 default_route_set[f->unit] = 1;
154 }
155 - demand_rexmit(PPP_IPV6);
156 + demand_rexmit(PPP_IPV6,0);
157 sifnpmode(f->unit, PPP_IPV6, NPMODE_PASS);
158
159 } else {
160 --- a/pppd/pppd.h
161 +++ b/pppd/pppd.h
162 @@ -598,7 +598,7 @@ void demand_conf(void); /* config interf
163 void demand_block(void); /* set all NPs to queue up packets */
164 void demand_unblock(void); /* set all NPs to pass packets */
165 void demand_discard(void); /* set all NPs to discard packets */
166 -void demand_rexmit(int); /* retransmit saved frames for an NP */
167 +void demand_rexmit(int, u_int32_t); /* retransmit saved frames for an NP*/
168 int loop_chars(unsigned char *, int); /* process chars from loopback */
169 int loop_frame(unsigned char *, int); /* should we bring link up? */
170