20 |
* |
* |
21 |
*/ |
*/ |
22 |
|
|
23 |
|
#include "config.h" |
24 |
|
|
25 |
#include <sys/types.h> |
#include <sys/types.h> |
26 |
#include <sys/socket.h> |
#include <sys/socket.h> |
27 |
#include <netinet/in.h> |
#include <netinet/in.h> |
29 |
#include <stdlib.h> |
#include <stdlib.h> |
30 |
#include <string.h> |
#include <string.h> |
31 |
|
|
32 |
|
#include "gettext.h" |
33 |
#include "buffer.h" |
#include "buffer.h" |
34 |
#include "options.h" |
#include "options.h" |
35 |
#include "misc.h" |
#include "misc.h" |
69 |
{ |
{ |
70 |
struct ip_config_request request = DEFAULT_IP_CONFIG_REQUEST; |
struct ip_config_request request = DEFAULT_IP_CONFIG_REQUEST; |
71 |
|
|
72 |
fdo_send ( TOKEN ("ya"), (char *) &request, sizeof (request)); |
fdo_send (TOKEN ("ya"), (char *) &request, sizeof (request)); |
73 |
|
|
74 |
fdo_register ( TOKEN ("ya"), ip_tunnel_config); |
fdo_register (TOKEN ("ya"), ip_tunnel_config); |
75 |
} |
} |
76 |
|
|
77 |
int |
int |
78 |
ip_tunnel_ready (bufin) |
ip_tunnel_ready (bufin) |
79 |
buffer_t *bufin; |
buffer_t *bufin; |
80 |
{ |
{ |
81 |
if( (bufin->used == bufin->size) && protocol->ready()) |
if ((bufin->used == bufin->size) && protocol->ready ()) |
82 |
get_ip_client(bufin); |
get_ip_client (bufin); |
83 |
return protocol->ready(); |
return protocol->ready (); |
84 |
} |
} |
85 |
|
|
86 |
void |
void |
95 |
struct in_addr dns; |
struct in_addr dns; |
96 |
struct in_addr net; |
struct in_addr net; |
97 |
int mask; |
int mask; |
98 |
int mtu=1500; |
int mtu = 1500; |
99 |
char hostname[255]; |
char hostname[255]; |
100 |
char *domain = NULL; |
char *domain = NULL; |
101 |
int len; |
int len; |
102 |
int nparsed = 0; |
int nparsed = 0; |
103 |
|
|
104 |
while(nparsed<data_size) |
while (nparsed < data_size) |
105 |
{ |
{ |
106 |
cfg_hdr = (struct ip_config_header *) (data + nparsed); |
cfg_hdr = (struct ip_config_header *) (data + nparsed); |
107 |
cfg_data = data + nparsed + sizeof(struct ip_config_header); |
cfg_data = data + nparsed + sizeof (struct ip_config_header); |
108 |
switch(cfg_hdr->type) |
switch (cfg_hdr->type) |
109 |
{ |
{ |
110 |
case TYPE_IP_ADDR: |
case TYPE_IP_ADDR: |
111 |
address.s_addr = *((in_addr_t *)cfg_data); |
address.s_addr = *((in_addr_t *) cfg_data); |
112 |
log (LOG_INFO, "IP address: %s\n", inet_ntoa(address)); |
log (LOG_INFO, gettext ("IP address: %s\n"), inet_ntoa (address)); |
113 |
break; |
break; |
114 |
case TYPE_DNS_ADDR: |
case TYPE_DNS_ADDR: |
115 |
dns.s_addr = *((in_addr_t *)cfg_data); |
dns.s_addr = *((in_addr_t *) cfg_data); |
116 |
log (LOG_INFO, "DNS server: %s\n", inet_ntoa(dns)); |
log (LOG_INFO, gettext ("DNS server: %s\n"), inet_ntoa (dns)); |
117 |
break; |
break; |
118 |
case TYPE_MTU: |
case TYPE_MTU: |
119 |
mtu= ntohs(*((u_int16_t *)cfg_data)); |
mtu = ntohs (*((u_int16_t *) cfg_data)); |
120 |
log (LOG_INFO, "MTU: %d\n", mtu); |
log (LOG_INFO, gettext ("MTU: %d\n"), mtu); |
121 |
break; |
break; |
122 |
case TYPE_HOSTNAME: |
case TYPE_HOSTNAME: |
123 |
len = cfg_hdr->length; |
len = cfg_hdr->length; |
124 |
if (len > sizeof(hostname)) |
if (len > sizeof (hostname)) |
125 |
len = sizeof(hostname); |
len = sizeof (hostname); |
126 |
strncpy (hostname, cfg_data, len); |
strncpy (hostname, cfg_data, len); |
127 |
hostname[len] = '\0'; |
hostname[len] = '\0'; |
128 |
domain = strchr(hostname,'.'); |
domain = strchr (hostname, '.'); |
129 |
if(domain) domain++; |
if (domain) |
130 |
|
domain++; |
131 |
log (LOG_INFO, "Hostname: %s\n", hostname); |
|
132 |
if(domain) |
log (LOG_INFO, gettext ("Hostname: %s\n"), hostname); |
133 |
log (LOG_INFO, "Domain: %s\n", domain); |
if (domain) |
134 |
break; |
log (LOG_INFO, gettext ("Domain: %s\n"), domain); |
135 |
|
break; |
136 |
case TYPE_SUBNET: |
case TYPE_SUBNET: |
137 |
mask = *((u_int8_t *)cfg_data); |
mask = *((u_int8_t *) cfg_data); |
138 |
net.s_addr = 0; |
net.s_addr = 0; |
139 |
memcpy(&net.s_addr, cfg_data+1, cfg_hdr->length-1); |
memcpy (&net.s_addr, cfg_data + 1, cfg_hdr->length - 1); |
140 |
/* Need 2 instructions because inet_ntoa use a static buffer */ |
/* Need 2 instructions because inet_ntoa use a static buffer */ |
141 |
log (LOG_INFO, "Subnet: %s/", inet_ntoa(net)); |
debug (1, "Subnet: %s/", inet_ntoa (net)); |
142 |
log (LOG_INFO, "%s\n", inet_ntoa(netmask(mask))); |
debug (1, "%s\n", inet_ntoa (netmask (mask))); |
143 |
break; |
break; |
144 |
} |
} |
145 |
nparsed += sizeof(struct ip_config_header) + cfg_hdr->length; |
nparsed += sizeof (struct ip_config_header) + cfg_hdr->length; |
146 |
} |
} |
147 |
|
|
148 |
set_dns(domain, dns); |
set_dns (domain, dns); |
149 |
launch_ip_up (PARAM_INTERFACE_NAME, address, dns, domain, mtu); |
launch_ip_up (PARAM_INTERFACE_NAME, address, dns, domain, mtu); |
150 |
|
|
151 |
vj_compress_init (&vj_comp, -1); |
vj_compress_init (&vj_comp, -1); |
152 |
|
|
153 |
engine_register (*(iface->fd), 0, ip_tunnel_fn); |
engine_register (*(iface->fd), 0, ip_tunnel_fn); |
154 |
|
|
155 |
fdo_register ( TOKEN ("yc"), get_ip_aol); |
fdo_register (TOKEN ("yc"), get_ip_aol); |
156 |
} |
} |
157 |
|
|
158 |
struct in_addr |
struct in_addr |
159 |
netmask(bits) |
netmask (bits) |
160 |
int bits; |
int bits; |
161 |
{ |
{ |
162 |
unsigned long ret=0; |
unsigned long ret = 0; |
163 |
|
|
164 |
ret = ~( ( 1 << (32 - bits) ) - 1 ); |
ret = ~((1 << (32 - bits)) - 1); |
165 |
|
|
166 |
return (struct in_addr) { htonl(ret) }; |
return (struct in_addr) |
167 |
|
{ |
168 |
|
htonl (ret)}; |
169 |
} |
} |
170 |
|
|
171 |
void |
void |
174 |
buffer_t *out; |
buffer_t *out; |
175 |
{ |
{ |
176 |
ifout = out; |
ifout = out; |
177 |
create_buffer(in,2*1500); |
create_buffer (in, 2 * 1500); |
178 |
create_buffer(out,2*1500); |
create_buffer (out, 2 * 1500); |
179 |
} |
} |
180 |
|
|
181 |
int |
int |
184 |
buffer_t *out; |
buffer_t *out; |
185 |
{ |
{ |
186 |
launch_ip_down (PARAM_INTERFACE_NAME); |
launch_ip_down (PARAM_INTERFACE_NAME); |
187 |
unset_dns(); |
unset_dns (); |
188 |
destroy_buffer(in); |
destroy_buffer (in); |
189 |
destroy_buffer(out); |
destroy_buffer (out); |
190 |
return 1; |
return 1; |
191 |
} |
} |