Contents of /trunk/ppp/patches/ppp-2.4.5-pppd-usepeerwins.patch
Parent Directory | Revision Log
Revision 1107 -
(show annotations)
(download)
Fri Aug 20 10:59:46 2010 UTC (14 years, 1 month ago) by niro
File size: 8070 byte(s)
Fri Aug 20 10:59:46 2010 UTC (14 years, 1 month ago) by niro
File size: 8070 byte(s)
-reworked patch to apply with ppp-2.4.5
1 | diff -Naur ppp-2.4.5/pppd/ipcp.c ppp-2.4.5-magellan/pppd/ipcp.c |
2 | --- ppp-2.4.5/pppd/ipcp.c 2009-11-16 23:26:07.000000000 +0100 |
3 | +++ ppp-2.4.5-magellan/pppd/ipcp.c 2010-08-20 13:03:52.000000000 +0200 |
4 | @@ -91,6 +91,7 @@ |
5 | static int default_route_set[NUM_PPP]; /* Have set up a default route */ |
6 | static int proxy_arp_set[NUM_PPP]; /* Have created proxy arp entry */ |
7 | static bool usepeerdns; /* Ask peer for DNS addrs */ |
8 | +static bool usepeerwins; /* Ask peer for WINS addrs */ |
9 | static int ipcp_is_up; /* have called np_up() */ |
10 | static int ipcp_is_open; /* haven't called np_finished() */ |
11 | static bool ask_for_local; /* request our address from peer */ |
12 | @@ -210,6 +211,9 @@ |
13 | { "usepeerdns", o_bool, &usepeerdns, |
14 | "Ask peer for DNS address(es)", 1 }, |
15 | |
16 | + { "usepeerwins", o_bool, &usepeerwins, |
17 | + "Ask peer for WINS address(es)", 1 }, |
18 | + |
19 | { "netmask", o_special, (void *)setnetmask, |
20 | "set netmask", OPT_PRIO | OPT_A2STRVAL | OPT_STATIC, netmask_str }, |
21 | |
22 | @@ -703,6 +707,8 @@ |
23 | wo->accept_remote = 1; |
24 | wo->req_dns1 = usepeerdns; /* Request DNS addresses from the peer */ |
25 | wo->req_dns2 = usepeerdns; |
26 | + wo->req_wins1 = usepeerwins; /* Request WINS addresses from the peer */ |
27 | + wo->req_wins2 = usepeerwins; |
28 | *go = *wo; |
29 | if (!ask_for_local) |
30 | go->ouraddr = 0; |
31 | @@ -755,8 +761,8 @@ |
32 | LENCIADDR(go->neg_addr) + |
33 | LENCIDNS(go->req_dns1) + |
34 | LENCIDNS(go->req_dns2) + |
35 | - LENCIWINS(go->winsaddr[0]) + |
36 | - LENCIWINS(go->winsaddr[1])) ; |
37 | + LENCIWINS(go->req_wins1) + |
38 | + LENCIWINS(go->req_wins2)) ; |
39 | } |
40 | |
41 | |
42 | @@ -830,8 +836,8 @@ |
43 | neg = 0; \ |
44 | } |
45 | |
46 | -#define ADDCIWINS(opt, addr) \ |
47 | - if (addr) { \ |
48 | +#define ADDCIWINS(opt, neg, addr) \ |
49 | + if (neg) { \ |
50 | if (len >= CILEN_ADDR) { \ |
51 | u_int32_t l; \ |
52 | PUTCHAR(opt, ucp); \ |
53 | @@ -840,7 +846,7 @@ |
54 | PUTLONG(l, ucp); \ |
55 | len -= CILEN_ADDR; \ |
56 | } else \ |
57 | - addr = 0; \ |
58 | + neg = 0; \ |
59 | } |
60 | |
61 | ADDCIADDRS(CI_ADDRS, !go->neg_addr && go->old_addrs, go->ouraddr, |
62 | @@ -855,9 +861,9 @@ |
63 | |
64 | ADDCIDNS(CI_MS_DNS2, go->req_dns2, go->dnsaddr[1]); |
65 | |
66 | - ADDCIWINS(CI_MS_WINS1, go->winsaddr[0]); |
67 | + ADDCIWINS(CI_MS_WINS1, go->req_wins1, go->winsaddr[0]); |
68 | |
69 | - ADDCIWINS(CI_MS_WINS2, go->winsaddr[1]); |
70 | + ADDCIWINS(CI_MS_WINS2, go->req_wins2, go->winsaddr[1]); |
71 | |
72 | *lenp -= len; |
73 | } |
74 | @@ -962,6 +968,21 @@ |
75 | goto bad; \ |
76 | } |
77 | |
78 | +#define ACKCIWINS(opt, neg, addr) \ |
79 | + if (neg) { \ |
80 | + u_int32_t l; \ |
81 | + if ((len -= CILEN_ADDR) < 0) \ |
82 | + goto bad; \ |
83 | + GETCHAR(citype, p); \ |
84 | + GETCHAR(cilen, p); \ |
85 | + if (cilen != CILEN_ADDR || citype != opt) \ |
86 | + goto bad; \ |
87 | + GETLONG(l, p); \ |
88 | + cilong = htonl(l); \ |
89 | + if (addr != cilong) \ |
90 | + goto bad; \ |
91 | + } |
92 | + |
93 | ACKCIADDRS(CI_ADDRS, !go->neg_addr && go->old_addrs, go->ouraddr, |
94 | go->hisaddr); |
95 | |
96 | @@ -974,6 +995,10 @@ |
97 | |
98 | ACKCIDNS(CI_MS_DNS2, go->req_dns2, go->dnsaddr[1]); |
99 | |
100 | + ACKCIWINS(CI_MS_WINS1, go->req_wins1, go->winsaddr[0]); |
101 | + |
102 | + ACKCIWINS(CI_MS_WINS2, go->req_wins2, go->winsaddr[1]); |
103 | + |
104 | /* |
105 | * If there are any remaining CIs, then this packet is bad. |
106 | */ |
107 | @@ -1007,7 +1032,7 @@ |
108 | u_char cimaxslotindex, cicflag; |
109 | u_char citype, cilen, *next; |
110 | u_short cishort; |
111 | - u_int32_t ciaddr1, ciaddr2, l, cidnsaddr; |
112 | + u_int32_t ciaddr1, ciaddr2, l, cidnsaddr, ciwinsaddr; |
113 | ipcp_options no; /* options we've seen Naks for */ |
114 | ipcp_options try; /* options to request next time */ |
115 | |
116 | @@ -1072,6 +1097,19 @@ |
117 | code \ |
118 | } |
119 | |
120 | +#define NAKCIWINS(opt, neg, code) \ |
121 | + if (go->neg && \ |
122 | + ((cilen = p[1]) == CILEN_ADDR) && \ |
123 | + len >= cilen && \ |
124 | + p[0] == opt) { \ |
125 | + len -= cilen; \ |
126 | + INCPTR(2, p); \ |
127 | + GETLONG(l, p); \ |
128 | + ciwinsaddr = htonl(l); \ |
129 | + no.neg = 1; \ |
130 | + code \ |
131 | + } |
132 | + |
133 | /* |
134 | * Accept the peer's idea of {our,his} address, if different |
135 | * from our idea, only if the accept_{local,remote} flag is set. |
136 | @@ -1148,6 +1186,22 @@ |
137 | } |
138 | ); |
139 | |
140 | + NAKCIWINS(CI_MS_WINS1, req_wins1, |
141 | + if (treat_as_reject) { |
142 | + try.req_wins1 = 0; |
143 | + } else { |
144 | + try.winsaddr[0] = ciwinsaddr; |
145 | + } |
146 | + ); |
147 | + |
148 | + NAKCIWINS(CI_MS_WINS2, req_wins2, |
149 | + if (treat_as_reject) { |
150 | + try.req_wins2 = 0; |
151 | + } else { |
152 | + try.winsaddr[1] = ciwinsaddr; |
153 | + } |
154 | + ); |
155 | + |
156 | /* |
157 | * There may be remaining CIs, if the peer is requesting negotiation |
158 | * on an option that we didn't include in our request packet. |
159 | @@ -1338,8 +1392,8 @@ |
160 | try.neg = 0; \ |
161 | } |
162 | |
163 | -#define REJCIWINS(opt, addr) \ |
164 | - if (addr && \ |
165 | +#define REJCIWINS(opt, neg, addr) \ |
166 | + if (go->neg && \ |
167 | ((cilen = p[1]) == CILEN_ADDR) && \ |
168 | len >= cilen && \ |
169 | p[0] == opt) { \ |
170 | @@ -1351,7 +1405,7 @@ |
171 | /* Check rejected value. */ \ |
172 | if (cilong != addr) \ |
173 | goto bad; \ |
174 | - try.winsaddr[opt == CI_MS_WINS2] = 0; \ |
175 | + try.neg = 0; \ |
176 | } |
177 | |
178 | REJCIADDRS(CI_ADDRS, !go->neg_addr && go->old_addrs, |
179 | @@ -1366,9 +1420,9 @@ |
180 | |
181 | REJCIDNS(CI_MS_DNS2, req_dns2, go->dnsaddr[1]); |
182 | |
183 | - REJCIWINS(CI_MS_WINS1, go->winsaddr[0]); |
184 | + REJCIWINS(CI_MS_WINS1, req_wins1, go->winsaddr[0]); |
185 | |
186 | - REJCIWINS(CI_MS_WINS2, go->winsaddr[1]); |
187 | + REJCIWINS(CI_MS_WINS2, req_wins2, go->winsaddr[1]); |
188 | |
189 | /* |
190 | * If there are any remaining CIs, then this packet is bad. |
191 | @@ -1542,7 +1596,7 @@ |
192 | /* Microsoft primary or secondary DNS request */ |
193 | d = citype == CI_MS_DNS2; |
194 | |
195 | - /* If we do not have a DNS address then we cannot send it */ |
196 | + /* If we do not have a WINS address then we cannot send it */ |
197 | if (ao->dnsaddr[d] == 0 || |
198 | cilen != CILEN_ADDR) { /* Check CI length */ |
199 | orc = CONFREJ; /* Reject CI */ |
200 | @@ -1811,6 +1865,13 @@ |
201 | create_resolv(go->dnsaddr[0], go->dnsaddr[1]); |
202 | } |
203 | |
204 | + if (go->winsaddr[0]) |
205 | + script_setenv("WINS1", ip_ntoa(go->winsaddr[0]), 0); |
206 | + if (go->winsaddr[1]) |
207 | + script_setenv("WINS2", ip_ntoa(go->winsaddr[1]), 0); |
208 | + if (usepeerwins && (go->winsaddr[0] || go->winsaddr[1])) |
209 | + script_setenv("USEPEERWINS", "1", 0); |
210 | + |
211 | /* |
212 | * Check that the peer is allowed to use the IP address it wants. |
213 | */ |
214 | diff -Naur ppp-2.4.5/pppd/ipcp.h ppp-2.4.5-magellan/pppd/ipcp.h |
215 | --- ppp-2.4.5/pppd/ipcp.h 2009-11-16 23:26:07.000000000 +0100 |
216 | +++ ppp-2.4.5-magellan/pppd/ipcp.h 2010-08-20 13:04:28.000000000 +0200 |
217 | @@ -77,6 +77,8 @@ |
218 | bool accept_remote; /* accept peer's value for hisaddr */ |
219 | bool req_dns1; /* Ask peer to send primary DNS address? */ |
220 | bool req_dns2; /* Ask peer to send secondary DNS address? */ |
221 | + bool req_wins1; /* Ask peer to send primary WINS address? */ |
222 | + bool req_wins2; /* Ask peer to send secondary WINS address? */ |
223 | int vj_protocol; /* protocol value to use in VJ option */ |
224 | int maxslotindex; /* values for RFC1332 VJ compression neg. */ |
225 | bool cflag; |
226 | diff -Naur ppp-2.4.5/pppd/pppd.8 ppp-2.4.5-magellan/pppd/pppd.8 |
227 | --- ppp-2.4.5/pppd/pppd.8 2009-11-16 23:26:07.000000000 +0100 |
228 | +++ ppp-2.4.5-magellan/pppd/pppd.8 2010-08-20 13:05:38.000000000 +0200 |
229 | @@ -1070,6 +1070,16 @@ |
230 | /etc/ppp/resolv.conf file containing one or two nameserver lines with |
231 | the address(es) supplied by the peer. |
232 | .TP |
233 | +.B usepeerwins |
234 | +Ask the peer for up to 2 WINS server addresses. The addresses supplied |
235 | +by the peer (if any) are passed to the /etc/ppp/ip\-up script in the |
236 | +environment variables WINS1 and WINS2, and the environment variable |
237 | +USEPEERWINS will be set to 1. |
238 | +.LP |
239 | +Please note that some modems (like the Huawei E220) requires this option in |
240 | +order to avoid a race condition that results in the incorrect DNS servers |
241 | +being assigned. |
242 | +.TP |
243 | .B user \fIname |
244 | Sets the name used for authenticating the local system to the peer to |
245 | \fIname\fR. |
246 | @@ -1616,6 +1626,15 @@ |
247 | .B DNS2 |
248 | If the peer supplies DNS server addresses, this variable is set to the |
249 | second DNS server address supplied. |
250 | +.TP |
251 | +.B WINS1 |
252 | +If the peer supplies WINS server addresses, this variable is set to the |
253 | +first WINS server address supplied. |
254 | +.TP |
255 | +.B WINS2 |
256 | +If the peer supplies WINS server addresses, this variable is set to the |
257 | +second WINS server address supplied. |
258 | +.P |
259 | .P |
260 | Pppd invokes the following scripts, if they exist. It is not an error |
261 | if they don't exist. |