ead: allow the client to override the source ip of the server, so that it can work...
authorFelix Fietkau <nbd@openwrt.org>
Tue, 6 Jan 2009 14:08:07 +0000 (14:08 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Tue, 6 Jan 2009 14:08:07 +0000 (14:08 +0000)
SVN-Revision: 13883

package/ead/src/ead-client.c
package/ead/src/ead.c
package/ead/src/ead.h

index 74b0b4361a3934bac7a1f831e2b4ee8083cf73e6..2592c8f15ef278deb65b5917bd874d1481618910 100644 (file)
@@ -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;
index b6a9310f0fb3382d76ec109524d23806c1b1d49a..91f6fbaf70ca1a9748173b3dd3aa0c03e8588869 100644 (file)
@@ -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 */
index 3cc12c8a4deede45418aa1c4f37fbd0a2de7a088..36db0f5529c4113c90117fdea7be0e9b5211fe3f 100644 (file)
@@ -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;