]>
Commit | Line | Data |
---|---|---|
c3818ac3 MK |
1 | diff -ur apinger-0.6.1.orig//src/apinger.c apinger-0.6.1/src/apinger.c |
2 | --- apinger-0.6.1.orig//src/apinger.c 2012-07-25 17:46:59.421182293 +0000 | |
3 | +++ apinger-0.6.1/src/apinger.c 2012-07-25 17:44:41.642064536 +0000 | |
972c05fb MK |
4 | @@ -162,6 +162,9 @@ |
5 | case 't': | |
6 | values[n]=t->name; | |
7 | break; | |
8 | + case 'i': | |
9 | + values[n]=t->config->srcip; | |
10 | + break; | |
11 | case 'T': | |
12 | values[n]=t->description; | |
13 | break; | |
14 | @@ -277,6 +280,7 @@ | |
23868a1a MK |
15 | else |
16 | fprintf(f,"alarm canceled: %s\n",a->name); | |
a561f599 | 17 | fprintf(f,"Target: %s\n",t->name); |
f640c300 | 18 | + fprintf(f,"Source: %s\n",t->config->srcip); |
a561f599 | 19 | fprintf(f,"Description: %s\n",t->description); |
23868a1a MK |
20 | fprintf(f,"Probes sent: %i\n",t->last_sent+1); |
21 | fprintf(f,"Replies received: %i\n",t->received); | |
972c05fb | 22 | @@ -646,7 +650,7 @@ |
c3818ac3 MK |
23 | struct target *t,*pt,*nt; |
24 | struct target_cfg *tc; | |
25 | struct active_alarm_list *al,*nal; | |
26 | -union addr addr; | |
27 | +union addr addr, srcaddr; | |
28 | int r; | |
29 | int l; | |
30 | ||
972c05fb | 31 | @@ -666,6 +670,8 @@ |
c3818ac3 MK |
32 | nal=al->next; |
33 | free(al); | |
34 | } | |
35 | + if (t->socket) | |
36 | + close(t->socket); | |
37 | free(t->queue); | |
38 | free(t->rbuf); | |
39 | free(t->name); | |
f640c300 MK |
40 | @@ -682,20 +688,16 @@ |
41 | break; | |
42 | if (t==NULL) { /* new target */ | |
c3818ac3 | 43 | memset(&addr,0,sizeof(addr)); |
f640c300 | 44 | + logit("Checking target IP %s", tc->srcip); |
c3818ac3 MK |
45 | r=inet_pton(AF_INET,tc->name,&addr.addr4.sin_addr); |
46 | if (r){ | |
47 | - if (icmp_sock<0){ | |
48 | - logit("Sorry, IPv4 is not available\n"); | |
49 | - logit("Ignoring target %s\n",tc->name); | |
50 | - continue; | |
51 | - } | |
52 | addr.addr.sa_family=AF_INET; | |
53 | }else{ | |
54 | #ifdef HAVE_IPV6 | |
f640c300 MK |
55 | r=inet_pton(AF_INET6,tc->name,&addr.addr6.sin6_addr); |
56 | if (r==0){ | |
57 | #endif | |
58 | - logit("Bad host address: %s\n",tc->name); | |
59 | + logit("Bad target IP address: %s\n",tc->name); | |
60 | logit("Ignoring target %s\n",tc->name); | |
61 | continue; | |
62 | #ifdef HAVE_IPV6 | |
63 | @@ -708,12 +710,38 @@ | |
c3818ac3 MK |
64 | addr.addr.sa_family=AF_INET6; |
65 | #endif | |
66 | } | |
67 | + memset(&srcaddr,0,sizeof(srcaddr)); | |
f640c300 | 68 | + logit("Checking source IP %s", tc->srcip); |
c3818ac3 MK |
69 | + r=inet_pton(AF_INET,tc->srcip,&srcaddr.addr4.sin_addr); |
70 | + if (r){ | |
71 | + srcaddr.addr.sa_family=AF_INET; | |
72 | + }else{ | |
73 | +#ifdef HAVE_IPV6 | |
74 | + r=inet_pton(AF_INET6,tc->srcip,&srcaddr.addr6.sin6_addr); | |
75 | + if (r==0){ | |
76 | +#endif | |
f640c300 | 77 | + logit("Bad source IP address %s for target %s\n", tc->srcip, tc->name); |
c3818ac3 MK |
78 | + logit("Ignoring target %s\n",tc->name); |
79 | + continue; | |
80 | +#ifdef HAVE_IPV6 | |
81 | + } | |
82 | + if (icmp6_sock<0){ | |
83 | + logit("Sorry, IPv6 is not available\n"); | |
84 | + logit("Ignoring target %s\n",tc->name); | |
85 | + continue; | |
86 | + } | |
87 | + srcaddr.addr.sa_family=AF_INET6; | |
88 | +#endif | |
89 | + } | |
90 | t=NEW(struct target,1); | |
91 | memset(t,0,sizeof(struct target)); | |
92 | t->name=strdup(tc->name); | |
93 | t->description=strdup(tc->description); | |
94 | t->addr=addr; | |
95 | + t->ifaddr=srcaddr; | |
96 | t->next=targets; | |
97 | + if(t->addr.addr.sa_family==AF_INET) make_icmp_socket(t); | |
98 | + if(t->addr.addr.sa_family==AF_INET6) make_icmp6_socket(t); | |
99 | targets=t; | |
100 | } | |
101 | t->config=tc; | |
f640c300 | 102 | @@ -733,6 +761,7 @@ |
c3818ac3 MK |
103 | assert(t->rbuf!=NULL); |
104 | memset(t->rbuf,0,l); | |
105 | } | |
106 | + | |
107 | if (targets==NULL){ | |
108 | logit("No usable targets found, exiting"); | |
109 | exit(1); | |
f640c300 | 110 | @@ -753,6 +782,8 @@ |
c3818ac3 MK |
111 | nal=al->next; |
112 | free(al); | |
113 | } | |
114 | + if (t->socket) | |
115 | + close(t->socket); | |
116 | free(t->queue); | |
117 | free(t->rbuf); | |
118 | free(t->name); | |
f640c300 | 119 | @@ -800,6 +831,7 @@ |
23868a1a MK |
120 | fprintf(f,"%s\n",ctime(&tm)); |
121 | for(t=targets;t;t=t->next){ | |
a561f599 | 122 | fprintf(f,"Target: %s\n",t->name); |
f640c300 | 123 | + fprintf(f,"Source: %s\n",t->config->srcip); |
a561f599 | 124 | fprintf(f,"Description: %s\n",t->description); |
23868a1a MK |
125 | fprintf(f,"Last reply received: #%i %s",t->last_received, |
126 | ctime(&t->last_received_tv.tv_sec)); | |
f640c300 | 127 | @@ -865,7 +897,7 @@ |
c3818ac3 MK |
128 | void main_loop(void){ |
129 | struct target *t; | |
130 | struct timeval cur_time,next_status={0,0},tv,next_report={0,0},next_rrd_update={0,0}; | |
131 | -struct pollfd pfd[2]; | |
132 | +struct pollfd pfd[1024]; | |
133 | int timeout; | |
134 | int npfd=0; | |
135 | int i; | |
f640c300 | 136 | @@ -876,16 +908,8 @@ |
c3818ac3 MK |
137 | struct alarm_cfg *a; |
138 | ||
139 | configure_targets(); | |
140 | - if (icmp_sock){ | |
141 | - pfd[npfd].events=POLLIN|POLLERR|POLLHUP|POLLNVAL; | |
142 | - pfd[npfd].revents=0; | |
143 | - pfd[npfd++].fd=icmp_sock; | |
144 | - } | |
145 | - if (icmp6_sock){ | |
146 | - pfd[npfd].events=POLLIN|POLLERR|POLLHUP|POLLNVAL; | |
147 | - pfd[npfd++].fd=icmp6_sock; | |
148 | - pfd[npfd].revents=0; | |
149 | - } | |
150 | + memset(&pfd, '\0', sizeof pfd); | |
151 | + | |
152 | if (config->status_interval){ | |
153 | gettimeofday(&cur_time,NULL); | |
154 | tv.tv_sec=config->status_interval/1000; | |
f640c300 | 155 | @@ -893,10 +917,16 @@ |
c3818ac3 MK |
156 | timeradd(&cur_time,&tv,&next_status); |
157 | } | |
158 | while(!interrupted_by){ | |
159 | + npfd = 0; | |
160 | gettimeofday(&cur_time,NULL); | |
161 | if ( !timercmp(&next_probe,&cur_time,>) ) | |
162 | timerclear(&next_probe); | |
163 | for(t=targets;t;t=t->next){ | |
164 | + if (t->socket){ | |
165 | + pfd[npfd].events=POLLIN|POLLERR|POLLHUP|POLLNVAL; | |
166 | + pfd[npfd].revents=0; | |
167 | + pfd[npfd++].fd=t->socket; | |
168 | + } | |
169 | for(al=t->config->alarms;al;al=nal){ | |
170 | a=al->alarm; | |
171 | nal=al->next; | |
f640c300 | 172 | @@ -972,8 +1002,20 @@ |
c3818ac3 MK |
173 | poll(pfd,npfd,timeout); |
174 | for(i=0;i<npfd;i++){ | |
175 | if (!pfd[i].revents&POLLIN) continue; | |
176 | - if (pfd[i].fd==icmp_sock) recv_icmp(); | |
177 | - else if (pfd[i].fd==icmp6_sock) recv_icmp6(); | |
178 | + for(t=targets;t;t=t->next){ | |
179 | + if (t->addr.addr.sa_family==AF_INET) { | |
180 | + if (t->socket == pfd[i].fd) { | |
181 | + recv_icmp(t); | |
182 | + break; | |
183 | + } | |
184 | + } | |
185 | + if (t->addr.addr.sa_family==AF_INET6) { | |
186 | + if (t->socket == pfd[i].fd) { | |
187 | + recv_icmp6(t); | |
188 | + break; | |
189 | + } | |
190 | + } | |
191 | + } | |
192 | pfd[i].revents=0; | |
193 | } | |
194 | if (status_request){ | |
972c05fb MK |
195 | diff -ur apinger-0.6.1.orig//src/apinger.conf apinger-0.6.1/src/apinger.conf |
196 | --- apinger-0.6.1.orig//src/apinger.conf 2012-07-26 11:14:05.000000000 +0000 | |
197 | +++ apinger-0.6.1/src/apinger.conf 2012-07-26 11:21:50.624064932 +0000 | |
198 | @@ -48,6 +48,7 @@ | |
199 | ||
200 | ## Following "macros" may be used in options below: | |
201 | ## %t - target name (address) | |
67a10869 | 202 | + ## %i - source name (address) |
972c05fb MK |
203 | ## %T - target description |
204 | ## %a - alarm name | |
205 | ## %A - alarm type ("down"/"loss"/"delay") | |
c3818ac3 MK |
206 | diff -ur apinger-0.6.1.orig//src/apinger.h apinger-0.6.1/src/apinger.h |
207 | --- apinger-0.6.1.orig//src/apinger.h 2012-07-25 17:46:59.422189729 +0000 | |
208 | +++ apinger-0.6.1/src/apinger.h 2012-07-25 17:44:41.642064536 +0000 | |
209 | @@ -47,6 +47,8 @@ | |
210 | #endif | |
211 | #include "conf.h" | |
212 | ||
213 | +#include <ifaddrs.h> | |
214 | + | |
215 | union addr { | |
216 | struct sockaddr addr; | |
217 | struct sockaddr_in addr4; | |
218 | @@ -67,10 +69,11 @@ | |
219 | char *description; /* description */ | |
220 | ||
221 | union addr addr; /* target address */ | |
222 | - | |
223 | + | |
224 | char *queue; /* | |
225 | contains info about recently sent packets | |
226 | "1" means it was received */ | |
227 | + int socket; | |
228 | int last_sent; /* sequence number of the last ping sent */ | |
229 | int last_received; /* sequence number of the last ping received */ | |
230 | struct timeval last_received_tv; /* timestamp of the last ping received */ | |
231 | @@ -90,6 +93,7 @@ | |
232 | struct target_cfg *config; | |
233 | ||
234 | struct target *next; | |
235 | + union addr ifaddr; /* iface address */ | |
236 | }; | |
237 | ||
238 | #define AVG_DELAY_KNOWN(t) (t->upsent >= t->config->avg_delay_samples) | |
239 | @@ -111,16 +115,16 @@ | |
240 | ||
241 | extern int icmp_sock; | |
242 | extern int icmp6_sock; | |
243 | -extern int ident; | |
244 | +extern uint16_t ident; | |
245 | ||
246 | extern struct timeval next_probe; | |
247 | ||
248 | -int make_icmp_socket(void); | |
249 | -void recv_icmp(void); | |
250 | +int make_icmp_socket(struct target *t); | |
251 | +void recv_icmp(struct target *t); | |
252 | void send_icmp_probe(struct target *t,int seq); | |
253 | ||
254 | -int make_icmp6_socket(void); | |
255 | -void recv_icmp6(void); | |
256 | +int make_icmp6_socket(struct target *t); | |
257 | +void recv_icmp6(struct target *t); | |
258 | void send_icmp6_probe(struct target *t,int seq); | |
259 | ||
260 | void analyze_reply(struct timeval time_recv,int seq,struct trace_info *ti); | |
261 | diff -ur apinger-0.6.1.orig//src/cfgparser1.y apinger-0.6.1/src/cfgparser1.y | |
262 | --- apinger-0.6.1.orig//src/cfgparser1.y 2003-03-26 11:27:47.000000000 +0000 | |
263 | +++ apinger-0.6.1/src/cfgparser1.y 2012-07-25 17:44:41.643063909 +0000 | |
264 | @@ -97,6 +97,7 @@ | |
265 | %token DELAY_HIGH | |
266 | ||
267 | %token DESCRIPTION | |
268 | +%token SRCIP | |
269 | %token ALARMS | |
270 | %token INTERVAL | |
271 | %token AVG_DELAY_SAMPLES | |
272 | @@ -248,6 +249,8 @@ | |
273 | targetcfg: /* */ | |
274 | | DESCRIPTION string | |
275 | { cur_target->description=$2; } | |
276 | + | SRCIP string | |
277 | + { cur_target->srcip = $2; } | |
278 | | ALARMS alarmlist | |
279 | { cur_target->alarms=$2; } | |
280 | | ALARMS OVERRIDE alarmlist | |
281 | diff -ur apinger-0.6.1.orig//src/cfgparser2.l apinger-0.6.1/src/cfgparser2.l | |
282 | --- apinger-0.6.1.orig//src/cfgparser2.l 2003-03-26 11:27:47.000000000 +0000 | |
283 | +++ apinger-0.6.1/src/cfgparser2.l 2012-07-25 17:44:41.643063909 +0000 | |
284 | @@ -82,6 +82,7 @@ | |
285 | delay_high { LOC; LOCINC; return DELAY_HIGH; } | |
286 | delay_low { LOC; LOCINC; return DELAY_LOW; } | |
287 | description { LOC; LOCINC; return DESCRIPTION; } | |
288 | +srcip { LOC; LOCINC; return SRCIP; } | |
289 | down { LOC; LOCINC; return DOWN; } | |
290 | false { LOC; LOCINC; return FALSE; } | |
291 | file { LOC; LOCINC; return FILE_; } | |
f640c300 MK |
292 | diff -ur apinger-0.6.1.orig//src/conf.c apinger-0.6.1/src/conf.c |
293 | --- apinger-0.6.1.orig//src/conf.c 2003-03-26 11:27:47.000000000 +0000 | |
294 | +++ apinger-0.6.1/src/conf.c 2012-07-27 10:54:53.563251145 +0000 | |
295 | @@ -175,6 +175,14 @@ | |
296 | } | |
297 | } | |
298 | for(t=cur_config.targets;t;t=t->next){ | |
299 | + if (t->name==NULL || strlen(t->name)==0){ | |
300 | + logit("Target name can't be empty."); | |
301 | + return 1; | |
302 | + } | |
303 | + else if (t->srcip==NULL){ | |
304 | + logit("No source IP defined for target \"%s\".", t->name); | |
305 | + return 1; | |
306 | + } | |
307 | if (t->description==NULL) | |
308 | t->description=cur_config.target_defaults.description; | |
309 | if (t->interval<=0) | |
c3818ac3 MK |
310 | diff -ur apinger-0.6.1.orig//src/conf.h apinger-0.6.1/src/conf.h |
311 | --- apinger-0.6.1.orig//src/conf.h 2003-03-26 11:27:47.000000000 +0000 | |
312 | +++ apinger-0.6.1/src/conf.h 2012-07-25 17:44:41.643063909 +0000 | |
313 | @@ -72,6 +72,7 @@ | |
314 | struct target_cfg { | |
315 | char *name; | |
316 | char *description; | |
317 | + char *srcip; | |
318 | int interval; | |
319 | int avg_delay_samples; | |
320 | int avg_loss_delay_samples; | |
321 | diff -ur apinger-0.6.1.orig//src/icmp.c apinger-0.6.1/src/icmp.c | |
322 | --- apinger-0.6.1.orig//src/icmp.c 2012-07-25 17:46:59.422189729 +0000 | |
323 | +++ apinger-0.6.1/src/icmp.c 2012-07-25 17:44:41.644063862 +0000 | |
324 | @@ -151,14 +151,14 @@ | |
325 | size=sizeof(*p)+sizeof(ti); | |
326 | ||
327 | p->icmp_cksum = in_cksum((u_short *)p,size,0); | |
328 | - ret=sendto(icmp_sock,p,size,MSG_DONTWAIT, | |
329 | + ret=sendto(t->socket,p,size,MSG_DONTWAIT, | |
330 | (struct sockaddr *)&t->addr.addr4,sizeof(t->addr.addr4)); | |
331 | if (ret<0){ | |
332 | if (config->debug) myperror("sendto"); | |
333 | } | |
334 | } | |
335 | ||
336 | -void recv_icmp(void){ | |
337 | +void recv_icmp(struct target *t){ | |
338 | int len,hlen,icmplen,datalen; | |
339 | char buf[1024]; | |
340 | struct sockaddr_in from; | |
341 | @@ -171,6 +171,7 @@ | |
342 | struct iovec iov; | |
343 | struct msghdr msg; | |
344 | struct cmsghdr *c; | |
345 | +reloophack: | |
346 | ||
347 | iov.iov_base=buf; | |
348 | iov.iov_len=1000; | |
349 | @@ -180,12 +181,13 @@ | |
350 | msg.msg_iovlen=1; | |
351 | msg.msg_control=ans_data; | |
352 | msg.msg_controllen=sizeof(ans_data); | |
353 | - len=recvmsg(icmp_sock, &msg, MSG_DONTWAIT); | |
354 | + len=recvmsg(t->socket, &msg, MSG_DONTWAIT); | |
355 | #else | |
356 | socklen_t sl; | |
357 | +reloophack: | |
358 | ||
359 | sl=sizeof(from); | |
360 | - len=recvfrom(icmp_sock,buf,1024,MSG_DONTWAIT,(struct sockaddr *)&from,&sl); | |
361 | + len=recvfrom(t->socket,buf,1024,MSG_DONTWAIT,(struct sockaddr *)&from,&sl); | |
362 | #endif | |
363 | if (len<0){ | |
364 | if (errno==EAGAIN) return; | |
365 | @@ -197,7 +199,7 @@ | |
366 | debug("checking CMSG..."); | |
367 | for (c = CMSG_FIRSTHDR(&msg); c; c = CMSG_NXTHDR(&msg, c)) { | |
368 | debug("CMSG level: %i type: %i",c->cmsg_level,c->cmsg_type); | |
369 | - if (c->cmsg_level != SOL_SOCKET || c->cmsg_type != SO_TIMESTAMP) | |
370 | + if (c->cmsg_level != SOL_SOCKET || c->cmsg_type != SCM_TIMESTAMP) | |
371 | continue; | |
372 | if (c->cmsg_len < CMSG_LEN(sizeof(struct timeval))) | |
373 | continue; | |
374 | @@ -207,7 +209,7 @@ | |
375 | #endif | |
376 | if (time_recvp==NULL){ | |
377 | #ifdef SIOCGSTAMP | |
378 | - if (!ioctl(icmp_sock, SIOCGSTAMP, &time_recv)){ | |
379 | + if (!ioctl(t->socket, SIOCGSTAMP, &time_recv)){ | |
380 | debug("Got timestampt from ioctl()"); | |
381 | }else | |
382 | #endif | |
383 | @@ -227,7 +229,8 @@ | |
384 | return; | |
385 | } | |
386 | if (icmp->icmp_id != ident){ | |
387 | - debug("Alien echo-reply received"); | |
388 | + debug("Alien echo-reply received from %s. Expected %i, received %i",inet_ntoa(from.sin_addr), ident, icmp->icmp_id); | |
389 | + goto reloophack; | |
390 | return; | |
391 | } | |
392 | debug("Ping reply from %s",inet_ntoa(from.sin_addr)); | |
393 | @@ -239,19 +242,23 @@ | |
394 | analyze_reply(*time_recvp,icmp->icmp_seq,(struct trace_info*)(icmp+1)); | |
395 | } | |
396 | ||
397 | -int make_icmp_socket(void){ | |
398 | +int make_icmp_socket(struct target *t){ | |
399 | int on; | |
400 | ||
401 | - icmp_sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); | |
402 | - if (icmp_sock<0) | |
403 | + t->socket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); | |
404 | + if (t->socket < 0) | |
405 | myperror("socket"); | |
406 | #ifdef SO_TIMESTAMP | |
407 | - else{ | |
408 | + else { | |
409 | on=1; | |
410 | - if (setsockopt(icmp_sock, SOL_SOCKET, SO_TIMESTAMP, &on, sizeof(on))) | |
411 | + if (setsockopt(t->socket, SOL_SOCKET, SO_TIMESTAMP, &on, sizeof(on))) | |
412 | myperror("setsockopt(SO_TIMESTAMP)"); | |
413 | } | |
414 | #endif | |
415 | - return icmp_sock; | |
416 | + | |
417 | + if (bind(t->socket, (struct sockaddr *)&t->ifaddr.addr4, sizeof(t->ifaddr.addr4)) < 0) | |
418 | + myperror("bind socket"); | |
419 | + | |
420 | + return t->socket; | |
421 | } | |
422 | ||
423 | diff -ur apinger-0.6.1.orig//src/icmp6.c apinger-0.6.1/src/icmp6.c | |
424 | --- apinger-0.6.1.orig//src/icmp6.c 2012-07-25 17:46:59.422189729 +0000 | |
425 | +++ apinger-0.6.1/src/icmp6.c 2012-07-25 17:44:41.644063862 +0000 | |
426 | @@ -113,14 +113,14 @@ | |
427 | memcpy(p+1,&ti,sizeof(ti)); | |
428 | size=sizeof(*p)+sizeof(ti); | |
429 | ||
430 | - ret=sendto(icmp6_sock,p,size,MSG_DONTWAIT, | |
431 | + ret=sendto(t->socket,p,size,MSG_DONTWAIT, | |
432 | (struct sockaddr *)&t->addr.addr6,sizeof(t->addr.addr6)); | |
433 | if (ret<0){ | |
434 | if (config->debug) myperror("sendto"); | |
435 | } | |
436 | } | |
437 | ||
438 | -void recv_icmp6(void){ | |
439 | +void recv_icmp6(struct target *t){ | |
440 | int len,icmplen,datalen; | |
441 | char buf[1024]; | |
442 | char abuf[100]; | |
443 | @@ -134,6 +134,7 @@ | |
444 | struct iovec iov; | |
445 | struct msghdr msg; | |
446 | struct cmsghdr *c; | |
447 | +reloophack6: | |
448 | ||
449 | iov.iov_base=buf; | |
450 | iov.iov_len=1000; | |
451 | @@ -143,12 +144,13 @@ | |
452 | msg.msg_iovlen=1; | |
453 | msg.msg_control=ans_data; | |
454 | msg.msg_controllen=sizeof(ans_data); | |
455 | - len=recvmsg(icmp6_sock, &msg, MSG_DONTWAIT); | |
456 | + len=recvmsg(t->socket, &msg, MSG_DONTWAIT); | |
457 | #else | |
458 | socklen_t sl; | |
459 | +reloophack6: | |
460 | ||
461 | sl=sizeof(from); | |
462 | - len=recvfrom(icmp6_sock,buf,1024,0,(struct sockaddr *)&from,&sl); | |
463 | + len=recvfrom(t->socket,buf,1024,0,(struct sockaddr *)&from,&sl); | |
464 | #endif | |
465 | if (len<0){ | |
466 | if (errno==EAGAIN) return; | |
467 | @@ -170,7 +172,7 @@ | |
468 | #endif | |
469 | if (time_recvp==NULL){ | |
470 | #ifdef SIOCGSTAMP | |
471 | - if (!ioctl(icmp6_sock, SIOCGSTAMP, &time_recv)){ | |
472 | + if (!ioctl(t->socket, SIOCGSTAMP, &time_recv)){ | |
473 | debug("Got timestamp from ioctl()"); | |
474 | }else | |
475 | #endif | |
476 | @@ -183,8 +185,11 @@ | |
477 | icmplen=len; | |
478 | icmp=(struct icmp6_hdr *)buf; | |
479 | if (icmp->icmp6_type != ICMP6_ECHO_REPLY) return; | |
480 | - if (icmp->icmp6_id != ident) return; | |
481 | - | |
482 | + if (icmp->icmp6_id != ident){ | |
483 | + debug("Alien echo-reply received from xxx. Expected %i, received %i", ident, icmp->icmp6_id); | |
484 | + goto reloophack6; | |
485 | + return; | |
486 | + } | |
487 | name=inet_ntop(AF_INET6,&from.sin6_addr,abuf,100); | |
488 | debug("Ping reply from %s",name); | |
489 | datalen=icmplen-sizeof(*icmp); | |
490 | @@ -196,33 +201,36 @@ | |
491 | } | |
492 | ||
493 | ||
494 | -int make_icmp6_socket(void){ | |
495 | +int make_icmp6_socket(struct target *t){ | |
496 | int opt; | |
497 | ||
498 | - icmp6_sock = socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6); | |
499 | - if (icmp6_sock<0) | |
500 | + t->socket = socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6); | |
501 | + if (t->socket <0) | |
502 | myperror("socket"); | |
503 | else { | |
504 | opt=2; | |
505 | #if defined(SOL_RAW) && defined(IPV6_CHECKSUM) | |
506 | - if (setsockopt(icmp6_sock, SOL_RAW, IPV6_CHECKSUM, &opt, sizeof(int))) | |
507 | + if (setsockopt(t->socket, SOL_RAW, IPV6_CHECKSUM, &opt, sizeof(int))) | |
508 | myperror("setsockopt(IPV6_CHECKSUM)"); | |
509 | #endif | |
510 | #ifdef SO_TIMESTAMP | |
511 | opt=1; | |
512 | - if (setsockopt(icmp6_sock, SOL_SOCKET, SO_TIMESTAMP, &opt, sizeof(opt))) | |
513 | + if (setsockopt(t->socket, SOL_SOCKET, SO_TIMESTAMP, &opt, sizeof(opt))) | |
514 | myperror("setsockopt(SO_TIMESTAMP)"); | |
515 | #endif | |
516 | /*install_filter6();*/ | |
517 | } | |
518 | - return icmp6_sock; | |
519 | + if (bind(t->socket, (struct sockaddr *)&t->ifaddr.addr6, sizeof(t->ifaddr.addr6)) < 0) | |
520 | + myperror("bind socket"); | |
521 | + | |
522 | + return t->socket; | |
523 | } | |
524 | ||
525 | #else /*HAVE_IPV6*/ | |
526 | #include "apinger.h" | |
527 | ||
528 | -int make_icmp6_socket(void){ return -1; } | |
529 | -void recv_icmp6(void){} | |
530 | +int make_icmp6_socket(struct target *t){ return -1; } | |
531 | +void recv_icmp6(struct target *t){} | |
532 | void send_icmp6_probe(struct target *t,int seq){} | |
533 | ||
534 | #endif /*HAVE_IPV6*/ | |
535 | diff -ur apinger-0.6.1.orig//src/main.c apinger-0.6.1/src/main.c | |
536 | --- apinger-0.6.1.orig//src/main.c 2012-07-25 17:46:59.423189376 +0000 | |
537 | +++ apinger-0.6.1/src/main.c 2012-07-25 17:49:53.167255387 +0000 | |
538 | @@ -72,6 +72,7 @@ | |
539 | { /* target defaults */ | |
540 | "default", /* name */ | |
541 | "", /* description */ | |
542 | + "", /* interface */ | |
543 | 1000, /* interval */ | |
544 | 20, /* avg_delay_samples */ | |
545 | 5, /* avg_loss_delay_samples */ | |
546 | @@ -96,7 +97,7 @@ | |
547 | ||
548 | int icmp_sock; | |
549 | int icmp6_sock; | |
550 | -int ident; | |
551 | +uint16_t ident; | |
552 | ||
553 | struct timeval next_probe={0,0}; | |
554 | ||
555 | @@ -204,12 +205,6 @@ | |
556 | } | |
557 | } | |
558 | ||
559 | - make_icmp_socket(); | |
560 | - make_icmp6_socket(); | |
561 | - if (icmp6_sock<0 && icmp_sock<0){ | |
562 | - return 1; | |
563 | - } | |
564 | - | |
565 | pw=getpwnam(config->user); | |
566 | if (!pw) { | |
567 | debug("getpwnam(\"%s\") failed.",config->user); | |
568 | @@ -264,15 +259,15 @@ | |
569 | return 1; | |
570 | } | |
571 | ||
572 | - ident=getpid(); | |
573 | + ident=getpid() & 0xFFFF; | |
574 | signal(SIGTERM,signal_handler); | |
575 | signal(SIGINT,signal_handler); | |
576 | signal(SIGHUP,signal_handler); | |
577 | signal(SIGUSR1,signal_handler); | |
578 | signal(SIGPIPE,signal_handler); | |
579 | + logit("Starting Alarm Pinger, apinger(%i)", ident); | |
580 | + | |
581 | main_loop(); | |
582 | - if (icmp_sock>=0) close(icmp_sock); | |
583 | - if (icmp6_sock>=0) close(icmp6_sock); | |
584 | ||
585 | logit("Exiting on signal %i.",interrupted_by); | |
586 |