diff options
author | Felix Fietkau <nbd@openwrt.org> | 2009-01-06 14:08:07 +0000 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2009-01-06 14:08:07 +0000 |
commit | 6a997e1e2f3ca07eeec9143ca2811150213c52c2 (patch) | |
tree | 4b636a11df7ac12fdd99ab45cf950d1171e785b9 | |
parent | 6a8092ea2178ba80740a2e96c0532c6489f305e0 (diff) | |
download | master-187ad058-6a997e1e2f3ca07eeec9143ca2811150213c52c2.tar.gz master-187ad058-6a997e1e2f3ca07eeec9143ca2811150213c52c2.tar.bz2 master-187ad058-6a997e1e2f3ca07eeec9143ca2811150213c52c2.zip |
ead: allow the client to override the source ip of the server, so that it can work with route filtering properly
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@13883 3c298f89-4303-0410-b956-a3cf2f4a3e73
-rw-r--r-- | package/ead/src/ead-client.c | 14 | ||||
-rw-r--r-- | package/ead/src/ead.c | 2 | ||||
-rw-r--r-- | package/ead/src/ead.h | 3 |
3 files changed, 15 insertions, 4 deletions
diff --git a/package/ead/src/ead-client.c b/package/ead/src/ead-client.c index 74b0b4361a..2592c8f15e 100644 --- a/package/ead/src/ead-client.c +++ b/package/ead/src/ead-client.c @@ -44,6 +44,9 @@ static uint16_t nid = 0xffff; struct sockaddr_in local, remote; static int s = 0; static int sockflags; +static struct in_addr serverip = { + .s_addr = 0x01010101 /* dummy */ +}; static unsigned char *skey = NULL; static unsigned char bbuf[MAXPARAMLEN]; @@ -80,6 +83,7 @@ send_packet(int type, bool (*handler)(void), unsigned int max) int res = 0; type = htonl(type); + memcpy(&msg->ip, &serverip.s_addr, sizeof(msg->ip)); set_nonblock(0); sendto(s, msgbuf, sizeof(struct ead_msg) + ntohl(msg->len), 0, (struct sockaddr *) &remote, sizeof(remote)); set_nonblock(1); @@ -294,8 +298,9 @@ send_command(const char *command) static int usage(const char *prog) { - fprintf(stderr, "Usage: %s [-b <addr>] <node> <username>[:<password>] <command>\n" + fprintf(stderr, "Usage: %s [-s <addr>] [-b <addr>] <node> <username>[:<password>] <command>\n" "\n" + "\t-s <addr>: Set the server's source address to <addr>\n" "\t-b <addr>: Set the broadcast address to <addr>\n" "\t<node>: Node ID (4 digits hex)\n" "\t<username>: Username to authenticate with\n" @@ -328,11 +333,16 @@ int main(int argc, char **argv) local.sin_addr.s_addr = INADDR_ANY; local.sin_port = 0; - while ((ch = getopt(argc, argv, "b:")) != -1) { + while ((ch = getopt(argc, argv, "b:s:h")) != -1) { switch(ch) { + case 's': + inet_aton(optarg, &serverip); + break; case 'b': inet_aton(optarg, &remote.sin_addr); break; + case 'h': + return usage(prog); } } argv += optind; diff --git a/package/ead/src/ead.c b/package/ead/src/ead.c index b6a9310f0f..91f6fbaf70 100644 --- a/package/ead/src/ead.c +++ b/package/ead/src/ead.c @@ -250,7 +250,7 @@ ead_send_packet_clone(struct ead_packet *pkt) len = sizeof(struct ead_packet) - sizeof(struct ether_header) + ntohl(pktbuf->msg.len); pktbuf->len[0] = len >> 8; pktbuf->len[1] = len & 0xff; - memcpy(pktbuf->srcipaddr, pkt->destipaddr, 4); + memcpy(pktbuf->srcipaddr, &pkt->msg.ip, 4); memcpy(pktbuf->destipaddr, pkt->srcipaddr, 4); /* ip checksum */ diff --git a/package/ead/src/ead.h b/package/ead/src/ead.h index 3cc12c8a4d..36db0f5529 100644 --- a/package/ead/src/ead.h +++ b/package/ead/src/ead.h @@ -14,7 +14,7 @@ #ifndef __EAD_H #define __EAD_H -#define EAD_DEBUGLEVEL 2 +#define EAD_DEBUGLEVEL 1 #include <stdint.h> #include <stddef.h> @@ -120,6 +120,7 @@ struct ead_msg { uint32_t type; uint16_t nid; /* node id */ uint16_t tid; /* transaction id */ + uint32_t ip; /* source ip for responses from the server */ union { struct ead_msg_pong pong; struct ead_msg_user user; |