]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
tests: Shorter TX/RX test frame support for hostapd
authorJouni Malinen <jouni@codeaurora.org>
Mon, 3 Jun 2019 14:48:47 +0000 (17:48 +0300)
committerJouni Malinen <jouni@codeaurora.org>
Mon, 3 Jun 2019 17:27:44 +0000 (20:27 +0300)
wpa_supplicant already included support for this, but hostapd
DATA_TEST_* commands did not yet have support for using a shorter test
frame. This is needed for MACsec testing.

Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
hostapd/ctrl_iface.c

index e4b16e61af0ecc6042a1432593d52b59f760bd34..0f6dfa13d8f34df25c9d7e62565e91afc946817a 100644 (file)
@@ -1830,26 +1830,40 @@ static void hostapd_data_test_rx(void *ctx, const u8 *src_addr, const u8 *buf,
        struct iphdr ip;
        const u8 *pos;
        unsigned int i;
+       char extra[30];
 
-       if (len != HWSIM_PACKETLEN)
+       if (len < sizeof(*eth) + sizeof(ip) || len > HWSIM_PACKETLEN) {
+               wpa_printf(MSG_DEBUG,
+                          "test data: RX - ignore unexpected length %d",
+                          (int) len);
                return;
+       }
 
        eth = (const struct ether_header *) buf;
        os_memcpy(&ip, eth + 1, sizeof(ip));
        pos = &buf[sizeof(*eth) + sizeof(ip)];
 
        if (ip.ihl != 5 || ip.version != 4 ||
-           ntohs(ip.tot_len) != HWSIM_IP_LEN)
+           ntohs(ip.tot_len) > HWSIM_IP_LEN) {
+               wpa_printf(MSG_DEBUG,
+                          "test data: RX - ignore unexpect IP header");
                return;
+       }
 
-       for (i = 0; i < HWSIM_IP_LEN - sizeof(ip); i++) {
-               if (*pos != (u8) i)
+       for (i = 0; i < ntohs(ip.tot_len) - sizeof(ip); i++) {
+               if (*pos != (u8) i) {
+                       wpa_printf(MSG_DEBUG,
+                                  "test data: RX - ignore mismatching payload");
                        return;
+               }
                pos++;
        }
 
-       wpa_msg(hapd->msg_ctx, MSG_INFO, "DATA-TEST-RX " MACSTR " " MACSTR,
-               MAC2STR(eth->ether_dhost), MAC2STR(eth->ether_shost));
+       extra[0] = '\0';
+       if (ntohs(ip.tot_len) != HWSIM_IP_LEN)
+               os_snprintf(extra, sizeof(extra), " len=%d", ntohs(ip.tot_len));
+       wpa_msg(hapd->msg_ctx, MSG_INFO, "DATA-TEST-RX " MACSTR " " MACSTR "%s",
+               MAC2STR(eth->ether_dhost), MAC2STR(eth->ether_shost), extra);
 }
 
 
@@ -1894,7 +1908,7 @@ static int hostapd_ctrl_iface_data_test_config(struct hostapd_data *hapd,
 static int hostapd_ctrl_iface_data_test_tx(struct hostapd_data *hapd, char *cmd)
 {
        u8 dst[ETH_ALEN], src[ETH_ALEN];
-       char *pos;
+       char *pos, *pos2;
        int used;
        long int val;
        u8 tos;
@@ -1903,11 +1917,12 @@ static int hostapd_ctrl_iface_data_test_tx(struct hostapd_data *hapd, char *cmd)
        struct iphdr *ip;
        u8 *dpos;
        unsigned int i;
+       size_t send_len = HWSIM_IP_LEN;
 
        if (hapd->l2_test == NULL)
                return -1;
 
-       /* format: <dst> <src> <tos> */
+       /* format: <dst> <src> <tos> [len=<length>] */
 
        pos = cmd;
        used = hwaddr_aton2(pos, dst);
@@ -1921,11 +1936,19 @@ static int hostapd_ctrl_iface_data_test_tx(struct hostapd_data *hapd, char *cmd)
                return -1;
        pos += used;
 
-       val = strtol(pos, NULL, 0);
+       val = strtol(pos, &pos2, 0);
        if (val < 0 || val > 0xff)
                return -1;
        tos = val;
 
+       pos = os_strstr(pos2, " len=");
+       if (pos) {
+               i = atoi(pos + 5);
+               if (i < sizeof(*ip) || i > HWSIM_IP_LEN)
+                       return -1;
+               send_len = i;
+       }
+
        eth = (struct ether_header *) &buf[2];
        os_memcpy(eth->ether_dhost, dst, ETH_ALEN);
        os_memcpy(eth->ether_shost, src, ETH_ALEN);
@@ -1936,17 +1959,17 @@ static int hostapd_ctrl_iface_data_test_tx(struct hostapd_data *hapd, char *cmd)
        ip->version = 4;
        ip->ttl = 64;
        ip->tos = tos;
-       ip->tot_len = htons(HWSIM_IP_LEN);
+       ip->tot_len = htons(send_len);
        ip->protocol = 1;
        ip->saddr = htonl(192U << 24 | 168 << 16 | 1 << 8 | 1);
        ip->daddr = htonl(192U << 24 | 168 << 16 | 1 << 8 | 2);
        ip->check = ipv4_hdr_checksum(ip, sizeof(*ip));
        dpos = (u8 *) (ip + 1);
-       for (i = 0; i < HWSIM_IP_LEN - sizeof(*ip); i++)
+       for (i = 0; i < send_len - sizeof(*ip); i++)
                *dpos++ = i;
 
        if (l2_packet_send(hapd->l2_test, dst, ETHERTYPE_IP, &buf[2],
-                          HWSIM_PACKETLEN) < 0)
+                          sizeof(struct ether_header) + send_len) < 0)
                return -1;
 
        wpa_dbg(hapd->msg_ctx, MSG_DEBUG, "test data: TX dst=" MACSTR