2 * Copyright (c) 1985, 1993
3 * The Regents of the University of California. All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of the University nor the names of its contributors
14 * may be used to endorse or promote products derived from this software
15 * without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * @(#)acksend.c 8.1 (Berkeley) 6/6/93
30 * $FreeBSD: src/usr.sbin/timed/timed/acksend.c,v 1.4 1999/08/28 01:20:16 peter Exp $
37 extern u_short sequence;
40 xmit(int type, u_int seq, struct sockaddr_in *addr)
42 static struct tsp msg;
46 msg.tsp_vers = TSPVERSION;
47 strlcpy(msg.tsp_name, hostname, sizeof(msg.tsp_name));
49 if (sendto(sock, (char *)&msg, sizeof(struct tsp), 0,
50 (struct sockaddr*)addr, sizeof(struct sockaddr)) < 0) {
51 trace_sendto_err(addr->sin_addr);
57 * Acksend implements reliable datagram transmission by using sequence
58 * numbers and retransmission when necessary.
59 * If `name' is ANYADDR, this routine implements reliable broadcast.
61 * Because this function calls readmsg(), none of its args may be in
62 * a message provided by readmsg().
65 acksend(struct tsp *message, /* this message */
66 struct sockaddr_in *addr, /* to here */
68 int ack, /* look for this ack */
69 struct netinfo *net, /* receive from this network */
70 int bad) /* 1=losing patience */
76 message->tsp_vers = TSPVERSION;
77 message->tsp_seq = sequence;
79 fprintf(fd, "acksend: to %s: ",
80 (name == ANYADDR ? "broadcast" : name));
83 bytenetorder(message);
86 count = bad ? 1 : 5; /* 5 packets in 6.4 seconds */
90 /* do not go crazy transmitting just because the
91 * other guy cannot keep our sequence numbers
94 if (sendto(sock, (char *)message, sizeof(struct tsp),
95 0, (struct sockaddr*)addr,
96 sizeof(struct sockaddr)) < 0) {
97 trace_sendto_err(addr->sin_addr);
102 mstotvround(&twait, msec);
103 answer = readmsg(ack, name, &twait, net);
104 if (answer != NULL) {
105 if (answer->tsp_seq != sequence) {
107 fprintf(fd,"acksend: seq # %u!=%u\n",
108 answer->tsp_seq, sequence);
115 } while (--count > 0);