Contents of /trunk/ppp/patches/ppp-2.4.4-pppd-usepeerwins.patch
Parent Directory | Revision Log
Revision 797 -
(show annotations)
(download)
Mon May 11 09:46:04 2009 UTC (15 years, 4 months ago) by niro
File size: 8473 byte(s)
Mon May 11 09:46:04 2009 UTC (15 years, 4 months ago) by niro
File size: 8473 byte(s)
-added patches from gentoo
1 | diff -ru ppp-2.4.4.orig/pppd/ipcp.c ppp-2.4.4/pppd/ipcp.c |
2 | --- ppp-2.4.4.orig/pppd/ipcp.c 2005-08-26 01:59:34.000000000 +0200 |
3 | +++ ppp-2.4.4/pppd/ipcp.c 2008-08-17 21:02:36.000000000 +0200 |
4 | @@ -90,6 +90,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 | @@ -209,6 +210,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 | @@ -687,6 +691,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 | @@ -714,8 +720,9 @@ |
32 | |
33 | #define LENCIADDRS(neg) (neg ? CILEN_ADDRS : 0) |
34 | #define LENCIVJ(neg, old) (neg ? (old? CILEN_COMPRESS : CILEN_VJ) : 0) |
35 | -#define LENCIADDR(neg) (neg ? CILEN_ADDR : 0) |
36 | -#define LENCIDNS(neg) (neg ? (CILEN_ADDR) : 0) |
37 | +#define LENCIADDR(neg) ((neg) ? CILEN_ADDR : 0) |
38 | +#define LENCIDNS(neg) LENCIADDR(neg) |
39 | +#define LENCIWINS(neg) LENCIADDR(neg) |
40 | |
41 | /* |
42 | * First see if we want to change our options to the old |
43 | @@ -737,7 +744,9 @@ |
44 | LENCIVJ(go->neg_vj, go->old_vj) + |
45 | LENCIADDR(go->neg_addr) + |
46 | LENCIDNS(go->req_dns1) + |
47 | - LENCIDNS(go->req_dns2)) ; |
48 | + LENCIDNS(go->req_dns2) + |
49 | + LENCIWINS(go->req_wins1) + |
50 | + LENCIWINS(go->req_wins2)); |
51 | } |
52 | |
53 | |
54 | @@ -810,6 +819,19 @@ |
55 | } else \ |
56 | neg = 0; \ |
57 | } |
58 | + |
59 | +#define ADDCIWINS(opt, neg, addr) \ |
60 | + if (neg) { \ |
61 | + if (len >= CILEN_ADDR) { \ |
62 | + u_int32_t l; \ |
63 | + PUTCHAR(opt, ucp); \ |
64 | + PUTCHAR(CILEN_ADDR, ucp); \ |
65 | + l = ntohl(addr); \ |
66 | + PUTLONG(l, ucp); \ |
67 | + len -= CILEN_ADDR; \ |
68 | + } else \ |
69 | + neg = 0; \ |
70 | + } |
71 | |
72 | ADDCIADDRS(CI_ADDRS, !go->neg_addr && go->old_addrs, go->ouraddr, |
73 | go->hisaddr); |
74 | @@ -823,6 +845,10 @@ |
75 | |
76 | ADDCIDNS(CI_MS_DNS2, go->req_dns2, go->dnsaddr[1]); |
77 | |
78 | + ADDCIWINS(CI_MS_WINS1, go->req_wins1, go->winsaddr[0]); |
79 | + |
80 | + ADDCIWINS(CI_MS_WINS2, go->req_wins2, go->winsaddr[1]); |
81 | + |
82 | *lenp -= len; |
83 | } |
84 | |
85 | @@ -926,6 +952,21 @@ |
86 | goto bad; \ |
87 | } |
88 | |
89 | +#define ACKCIWINS(opt, neg, addr) \ |
90 | + if (neg) { \ |
91 | + u_int32_t l; \ |
92 | + if ((len -= CILEN_ADDR) < 0) \ |
93 | + goto bad; \ |
94 | + GETCHAR(citype, p); \ |
95 | + GETCHAR(cilen, p); \ |
96 | + if (cilen != CILEN_ADDR || citype != opt) \ |
97 | + goto bad; \ |
98 | + GETLONG(l, p); \ |
99 | + cilong = htonl(l); \ |
100 | + if (addr != cilong) \ |
101 | + goto bad; \ |
102 | + } |
103 | + |
104 | ACKCIADDRS(CI_ADDRS, !go->neg_addr && go->old_addrs, go->ouraddr, |
105 | go->hisaddr); |
106 | |
107 | @@ -938,6 +979,10 @@ |
108 | |
109 | ACKCIDNS(CI_MS_DNS2, go->req_dns2, go->dnsaddr[1]); |
110 | |
111 | + ACKCIWINS(CI_MS_WINS1, go->req_wins1, go->winsaddr[0]); |
112 | + |
113 | + ACKCIWINS(CI_MS_WINS2, go->req_wins2, go->winsaddr[1]); |
114 | + |
115 | /* |
116 | * If there are any remaining CIs, then this packet is bad. |
117 | */ |
118 | @@ -971,7 +1016,7 @@ |
119 | u_char cimaxslotindex, cicflag; |
120 | u_char citype, cilen, *next; |
121 | u_short cishort; |
122 | - u_int32_t ciaddr1, ciaddr2, l, cidnsaddr; |
123 | + u_int32_t ciaddr1, ciaddr2, l, cidnsaddr, ciwinsaddr; |
124 | ipcp_options no; /* options we've seen Naks for */ |
125 | ipcp_options try; /* options to request next time */ |
126 | |
127 | @@ -1036,6 +1081,19 @@ |
128 | code \ |
129 | } |
130 | |
131 | +#define NAKCIWINS(opt, neg, code) \ |
132 | + if (go->neg && \ |
133 | + ((cilen = p[1]) == CILEN_ADDR) && \ |
134 | + len >= cilen && \ |
135 | + p[0] == opt) { \ |
136 | + len -= cilen; \ |
137 | + INCPTR(2, p); \ |
138 | + GETLONG(l, p); \ |
139 | + ciwinsaddr = htonl(l); \ |
140 | + no.neg = 1; \ |
141 | + code \ |
142 | + } |
143 | + |
144 | /* |
145 | * Accept the peer's idea of {our,his} address, if different |
146 | * from our idea, only if the accept_{local,remote} flag is set. |
147 | @@ -1112,6 +1170,22 @@ |
148 | } |
149 | ); |
150 | |
151 | + NAKCIWINS(CI_MS_WINS1, req_wins1, |
152 | + if (treat_as_reject) { |
153 | + try.req_wins1 = 0; |
154 | + } else { |
155 | + try.winsaddr[0] = ciwinsaddr; |
156 | + } |
157 | + ); |
158 | + |
159 | + NAKCIWINS(CI_MS_WINS2, req_wins2, |
160 | + if (treat_as_reject) { |
161 | + try.req_wins2 = 0; |
162 | + } else { |
163 | + try.winsaddr[1] = ciwinsaddr; |
164 | + } |
165 | + ); |
166 | + |
167 | /* |
168 | * There may be remaining CIs, if the peer is requesting negotiation |
169 | * on an option that we didn't include in our request packet. |
170 | @@ -1275,6 +1349,21 @@ |
171 | try.neg = 0; \ |
172 | } |
173 | |
174 | +#define REJCIWINS(opt, neg, addr) \ |
175 | + if (go->neg && \ |
176 | + ((cilen = p[1]) == CILEN_ADDR) && \ |
177 | + len >= cilen && \ |
178 | + p[0] == opt) { \ |
179 | + u_int32_t l; \ |
180 | + len -= cilen; \ |
181 | + INCPTR(2, p); \ |
182 | + GETLONG(l, p); \ |
183 | + cilong = htonl(l); \ |
184 | + /* Check rejected value. */ \ |
185 | + if (cilong != addr) \ |
186 | + goto bad; \ |
187 | + try.neg = 0; \ |
188 | + } |
189 | |
190 | REJCIADDRS(CI_ADDRS, !go->neg_addr && go->old_addrs, |
191 | go->ouraddr, go->hisaddr); |
192 | @@ -1288,6 +1377,10 @@ |
193 | |
194 | REJCIDNS(CI_MS_DNS2, req_dns2, go->dnsaddr[1]); |
195 | |
196 | + REJCIWINS(CI_MS_WINS1, req_wins1, go->winsaddr[0]); |
197 | + |
198 | + REJCIWINS(CI_MS_WINS2, req_wins2, go->winsaddr[1]); |
199 | + |
200 | /* |
201 | * If there are any remaining CIs, then this packet is bad. |
202 | */ |
203 | @@ -1480,7 +1573,7 @@ |
204 | /* Microsoft primary or secondary WINS request */ |
205 | d = citype == CI_MS_WINS2; |
206 | |
207 | - /* If we do not have a DNS address then we cannot send it */ |
208 | + /* If we do not have a WINS address then we cannot send it */ |
209 | if (ao->winsaddr[d] == 0 || |
210 | cilen != CILEN_ADDR) { /* Check CI length */ |
211 | orc = CONFREJ; /* Reject CI */ |
212 | @@ -1723,6 +1816,13 @@ |
213 | create_resolv(go->dnsaddr[0], go->dnsaddr[1]); |
214 | } |
215 | |
216 | + if (go->winsaddr[0]) |
217 | + script_setenv("WINS1", ip_ntoa(go->winsaddr[0]), 0); |
218 | + if (go->winsaddr[1]) |
219 | + script_setenv("WINS2", ip_ntoa(go->winsaddr[1]), 0); |
220 | + if (usepeerwins && (go->winsaddr[0] || go->winsaddr[1])) |
221 | + script_setenv("USEPEERWINS", "1", 0); |
222 | + |
223 | /* |
224 | * Check that the peer is allowed to use the IP address it wants. |
225 | */ |
226 | diff -ru ppp-2.4.4.orig/pppd/ipcp.h ppp-2.4.4/pppd/ipcp.h |
227 | --- ppp-2.4.4.orig/pppd/ipcp.h 2002-12-05 01:03:32.000000000 +0200 |
228 | +++ ppp-2.4.4/pppd/ipcp.h 2008-08-17 21:01:55.000000000 +0200 |
229 | @@ -77,6 +77,8 @@ |
230 | bool accept_remote; /* accept peer's value for hisaddr */ |
231 | bool req_dns1; /* Ask peer to send primary DNS address? */ |
232 | bool req_dns2; /* Ask peer to send secondary DNS address? */ |
233 | + bool req_wins1; /* Ask peer to send primary WINS address? */ |
234 | + bool req_wins2; /* Ask peer to send secondary WINS address? */ |
235 | int vj_protocol; /* protocol value to use in VJ option */ |
236 | int maxslotindex; /* values for RFC1332 VJ compression neg. */ |
237 | bool cflag; |
238 | diff -ru ppp-2.4.4.orig/pppd/pppd.8 ppp-2.4.4/pppd/pppd.8 |
239 | --- ppp-2.4.4.orig/pppd/pppd.8 2008-08-17 21:01:30.000000000 +0200 |
240 | +++ ppp-2.4.4/pppd/pppd.8 2008-08-17 21:05:38.000000000 +0200 |
241 | @@ -1052,6 +1052,16 @@ |
242 | /etc/ppp/resolv.conf file containing one or two nameserver lines with |
243 | the address(es) supplied by the peer. |
244 | .TP |
245 | +.B usepeerwins |
246 | +Ask the peer for up to 2 WINS server addresses. The addresses supplied |
247 | +by the peer (if any) are passed to the /etc/ppp/ip\-up script in the |
248 | +environment variables WINS1 and WINS2, and the environment variable |
249 | +USEPEERWINS will be set to 1. |
250 | +.LP |
251 | +Please note that some modems (like the Huawei E220) requires this option in |
252 | +order to avoid a race condition that results in the incorrect DNS servers |
253 | +being assigned. |
254 | +.TP |
255 | .B user \fIname |
256 | Sets the name used for authenticating the local system to the peer to |
257 | \fIname\fR. |
258 | @@ -1603,6 +1613,15 @@ |
259 | .B DNS2 |
260 | If the peer supplies DNS server addresses, this variable is set to the |
261 | second DNS server address supplied. |
262 | +.TP |
263 | +.B WINS1 |
264 | +If the peer supplies WINS server addresses, this variable is set to the |
265 | +first WINS server address supplied. |
266 | +.TP |
267 | +.B WINS2 |
268 | +If the peer supplies WINS server addresses, this variable is set to the |
269 | +second WINS server address supplied. |
270 | +.P |
271 | .P |
272 | Pppd invokes the following scripts, if they exist. It is not an error |
273 | if they don't exist. |