From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-io1-xd34.google.com (mail-io1-xd34.google.com [IPv6:2607:f8b0:4864:20::d34]) by sourceware.org (Postfix) with ESMTPS id E33FD384A029 for ; Wed, 3 Mar 2021 20:01:38 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org E33FD384A029 Received: by mail-io1-xd34.google.com with SMTP id o9so12212187iow.6 for ; Wed, 03 Mar 2021 12:01:38 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=5lA29K0WRBOHoDPcGubSog2+rmImlySnwFYwrW/PbCI=; b=c+w6KkOJGWYHoVPsWYK5z/ikJyNvwOSvXHWJ7o6J11teqej8e0gARNj1Evrif0vm2Q pCjrUYBUKHu3y59LOis2ZFc8ZHNsH5atkGa5n5+yMJco9/bHvjfLyGk2btFF9ySJOvKn zpqocIJHHx9W0OdzPAfs+cTukqpXwKgBau0sU9d5XI/lzPPW/XYwfTZMrxIKvT+v70it qnAEj3Iqa4aKS03YFP6L4Hw68jsnRYJLehnTOonb9Semf9FvrTNDvVEWwPAzuU+fsyY+ A0zzdQuV8cwU2wgA6xD1kNZXU+nSWi1WO14D+wIkpEFLphOsI0Y3sX/V88bA38VbHuu9 yuiw== X-Gm-Message-State: AOAM530bKsqF61ZusDr1oynmdV9M299EptIDB+RIYbj4QQJJ5ZkEM3VE ao8h7JkqIC3nV4M+dhGyAo2sVjIbE+u3KqD0Y3WqwPiKuxdkBw== X-Google-Smtp-Source: ABdhPJy6g3yjvvKbn2kruveQp0cVBRAHfLheKsmILTBZFQHdRING2C1ubTVa3gWL1sdNeNX0EKqX/7Cl/FLSUDTHGCE= X-Received: by 2002:a5d:93ce:: with SMTP id j14mr769318ioo.172.1614801698160; Wed, 03 Mar 2021 12:01:38 -0800 (PST) MIME-Version: 1.0 From: Peng Yu Date: Wed, 3 Mar 2021 14:01:27 -0600 Message-ID: Subject: How to get ICMP reply packet correctly? To: libc-help Content-Type: multipart/mixed; boundary="0000000000009a1e2f05bca751fb" X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libc-help@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-help mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 03 Mar 2021 20:01:41 -0000 --0000000000009a1e2f05bca751fb Content-Type: text/plain; charset="UTF-8" Hi, When I run the following program on Linux. It prints like this. The source and destination IP addresses ("08 08 08 08 c0 a8 01 68") are on the data (pckt.msg) of ICMP reply packet. What are "76 01 72 89"? I don't think ICMP data should have such IP addresses. And I check with tcpdump. The packet received by tcpdump is correct. Therefore, I think there is something wrong with the receive code in my program. Could anybody help make the program correctly receive the packet. (I still want to send the raw packet as is.) Thanks. $ ./main 8.8.8.8 sin_family = 2 s_addr = 8080808 sin_port = 0 Packet received with ICMP type 69 code 0 pckt.hdr.checksum 5400 id=0 sequence=0, ttl=96 76 01 72 89 08 08 08 08 c0 a8 01 68 00 00 c8 a2 83 01 78 03 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 $ cat main.c // vim: set noexpandtab tabstop=2: #include #include #include #include #include #include // Gives the timeout delay for receiving packets // in seconds #define RECV_TIMEOUT 1 // ping packet size #define PING_PKT_S 64 // ping packet structure struct ping_pkt { struct icmphdr hdr; unsigned char msg[PING_PKT_S-sizeof(struct icmphdr)]; }; unsigned short checksum(void *b, int len) { unsigned short *buf = b; unsigned int sum=0; unsigned short result; for ( sum = 0; len > 1; len -= 2 ) sum += *buf++; if ( len == 1 ) sum += *(unsigned char*)buf; sum = (sum >> 16) + (sum & 0xFFFF); sum += (sum >> 16); result = ~sum; return result; } int main(int argc, char *argv[]) { struct sockaddr_in addr_con; addr_con.sin_family = AF_INET; addr_con.sin_port = htons(0); const char *server_ip_addr = argv[1]; int rval; if((rval = inet_pton(AF_INET, server_ip_addr, &addr_con.sin_addr.s_addr)) == 0) { fprintf(stderr, "Invalid IPv4 address: %s\n", server_ip_addr); return 1; } else if(rval == -1) { perror("inet_pton()"); return 1; } int sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); if(sockfd<0) { perror("socket()"); return 1; } // set socket options at ip to TTL and value to 64, // change to what you want by setting ttl_val int ttl_val=96; if (setsockopt(sockfd, SOL_IP, IP_TTL, &ttl_val, sizeof(ttl_val)) != 0) { perror("setsockopt()"); return 1; } // setting timeout of recv setting struct timeval tv_out; tv_out.tv_sec = RECV_TIMEOUT; tv_out.tv_usec = 0; setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv_out, sizeof tv_out); // send icmp packet in an infinite loop struct ping_pkt pckt; memset(&pckt, 0, sizeof(pckt)); pckt.hdr.type = ICMP_ECHO; pckt.hdr.un.echo.id = 387; pckt.hdr.un.echo.sequence = 888; for (int i = 0; i < sizeof(pckt.msg); i++) pckt.msg[i] = i+'0'; pckt.hdr.checksum = checksum(&pckt, sizeof(pckt)); //send packet if (sendto(sockfd, &pckt, sizeof(pckt), 0, (struct sockaddr*) &addr_con, sizeof(addr_con)) <= 0) { puts("Packet Sending Failed!"); return 1; } //receive packet struct sockaddr_in r_addr; unsigned int addr_len=sizeof(r_addr); if (recvfrom(sockfd, &pckt, sizeof(pckt), 0, (struct sockaddr*)&r_addr, &addr_len) <= 0) { puts("Packet receive failed!"); } else { printf("sin_family = %0x\n", r_addr.sin_family); printf("s_addr = %0x\n", r_addr.sin_addr.s_addr); printf("sin_port = %0x\n", r_addr.sin_port); printf("Packet received with ICMP type %d code %d\n", pckt.hdr.type, pckt.hdr.code); printf("pckt.hdr.checksum %04x\n", pckt.hdr.checksum); printf("id=%d sequence=%d, ttl=%d\n", pckt.hdr.un.echo.id, pckt.hdr.un.echo.sequence, ttl_val); for(int i=0; i X-Attachment-Id: f_kltv4yq50 Ly8gdmltOiBzZXQgbm9leHBhbmR0YWIgdGFic3RvcD0yOgoKI2luY2x1ZGUgPHN0ZGlvLmg+IAoj aW5jbHVkZSA8c3lzL3NvY2tldC5oPiAKI2luY2x1ZGUgPGFycGEvaW5ldC5oPiAKI2luY2x1ZGUg PHN0cmluZy5oPiAKI2luY2x1ZGUgPG5ldGluZXQvaXBfaWNtcC5oPiAKI2luY2x1ZGUgPHRpbWUu aD4gCgovLyBHaXZlcyB0aGUgdGltZW91dCBkZWxheSBmb3IgcmVjZWl2aW5nIHBhY2tldHMgCi8v IGluIHNlY29uZHMgCiNkZWZpbmUgUkVDVl9USU1FT1VUIDEgIAoKLy8gcGluZyBwYWNrZXQgc2l6 ZSAKI2RlZmluZSBQSU5HX1BLVF9TIDY0IAovLyBwaW5nIHBhY2tldCBzdHJ1Y3R1cmUgCnN0cnVj dCBwaW5nX3BrdCB7IAoJc3RydWN0IGljbXBoZHIgaGRyOyAKCXVuc2lnbmVkIGNoYXIgbXNnW1BJ TkdfUEtUX1Mtc2l6ZW9mKHN0cnVjdCBpY21waGRyKV07IAp9OyAKCnVuc2lnbmVkIHNob3J0IGNo ZWNrc3VtKHZvaWQgKmIsIGludCBsZW4pIHsKCXVuc2lnbmVkIHNob3J0ICpidWYgPSBiOyAKCXVu c2lnbmVkIGludCBzdW09MDsgCgl1bnNpZ25lZCBzaG9ydCByZXN1bHQ7IAoKCWZvciAoIHN1bSA9 IDA7IGxlbiA+IDE7IGxlbiAtPSAyICkgCgkJc3VtICs9ICpidWYrKzsgCglpZiAoIGxlbiA9PSAx ICkgCgkJc3VtICs9ICoodW5zaWduZWQgY2hhciopYnVmOyAKCXN1bSA9IChzdW0gPj4gMTYpICsg KHN1bSAmIDB4RkZGRik7CglzdW0gKz0gKHN1bSA+PiAxNik7IAoJcmVzdWx0ID0gfnN1bTsgCgly ZXR1cm4gcmVzdWx0OyAKfSAKCmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsgCglz dHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcl9jb247CglhZGRyX2Nvbi5zaW5fZmFtaWx5ID0gQUZfSU5F VDsKCWFkZHJfY29uLnNpbl9wb3J0ID0gaHRvbnMoMCk7CgoJY29uc3QgY2hhciAqc2VydmVyX2lw X2FkZHIgPSBhcmd2WzFdOwoJaW50IHJ2YWw7CglpZigocnZhbCA9IGluZXRfcHRvbihBRl9JTkVU LCBzZXJ2ZXJfaXBfYWRkciwgJmFkZHJfY29uLnNpbl9hZGRyLnNfYWRkcikpID09IDApIHsKCQlm cHJpbnRmKHN0ZGVyciwgIkludmFsaWQgSVB2NCBhZGRyZXNzOiAlc1xuIiwgc2VydmVyX2lwX2Fk ZHIpOwoJCXJldHVybiAxOwoJfSBlbHNlIGlmKHJ2YWwgPT0gLTEpIHsKCQlwZXJyb3IoImluZXRf cHRvbigpIik7CgkJcmV0dXJuIDE7Cgl9CgoJaW50IHNvY2tmZCA9IHNvY2tldChBRl9JTkVULCBT T0NLX1JBVywgSVBQUk9UT19JQ01QKTsgCglpZihzb2NrZmQ8MCkgeyAKCQlwZXJyb3IoInNvY2tl dCgpIik7IAoJCXJldHVybiAxOyAKCX0KCgkvLyBzZXQgc29ja2V0IG9wdGlvbnMgYXQgaXAgdG8g VFRMIGFuZCB2YWx1ZSB0byA2NCwgCgkvLyBjaGFuZ2UgdG8gd2hhdCB5b3Ugd2FudCBieSBzZXR0 aW5nIHR0bF92YWwgCglpbnQgdHRsX3ZhbD05NjsKCWlmIChzZXRzb2Nrb3B0KHNvY2tmZCwgU09M X0lQLCBJUF9UVEwsICAmdHRsX3ZhbCwgc2l6ZW9mKHR0bF92YWwpKSAhPSAwKSB7IAoJCXBlcnJv cigic2V0c29ja29wdCgpIik7IAoJCXJldHVybiAxOyAKCX0KCgkvLyBzZXR0aW5nIHRpbWVvdXQg b2YgcmVjdiBzZXR0aW5nIAoJc3RydWN0IHRpbWV2YWwgdHZfb3V0OyAKCXR2X291dC50dl9zZWMg PSBSRUNWX1RJTUVPVVQ7Cgl0dl9vdXQudHZfdXNlYyA9IDA7CglzZXRzb2Nrb3B0KHNvY2tmZCwg U09MX1NPQ0tFVCwgU09fUkNWVElNRU8sIChjb25zdCBjaGFyKikmdHZfb3V0LCBzaXplb2YgdHZf b3V0KTsKCgkvLyBzZW5kIGljbXAgcGFja2V0IGluIGFuIGluZmluaXRlIGxvb3AgCglzdHJ1Y3Qg cGluZ19wa3QgcGNrdDsgCgltZW1zZXQoJnBja3QsIDAsIHNpemVvZihwY2t0KSk7IAoJcGNrdC5o ZHIudHlwZSA9IElDTVBfRUNITzsgCglwY2t0Lmhkci51bi5lY2hvLmlkID0gMzg3OwoJcGNrdC5o ZHIudW4uZWNoby5zZXF1ZW5jZSA9IDg4ODsKCglmb3IgKGludCBpID0gMDsgaSA8IHNpemVvZihw Y2t0Lm1zZyk7IGkrKykgCgkJcGNrdC5tc2dbaV0gPSBpKycwJzsKCglwY2t0Lmhkci5jaGVja3N1 bSA9IGNoZWNrc3VtKCZwY2t0LCBzaXplb2YocGNrdCkpOwoKCS8vc2VuZCBwYWNrZXQKCWlmIChz ZW5kdG8oc29ja2ZkLCAmcGNrdCwgc2l6ZW9mKHBja3QpLCAwLAoJCQkJKHN0cnVjdCBzb2NrYWRk ciopICZhZGRyX2NvbiwKCQkJCXNpemVvZihhZGRyX2NvbikpIDw9IDApIHsKCQlwdXRzKCJQYWNr ZXQgU2VuZGluZyBGYWlsZWQhIik7CgkJcmV0dXJuIDE7Cgl9CgoJLy9yZWNlaXZlIHBhY2tldAoJ c3RydWN0IHNvY2thZGRyX2luIHJfYWRkcjsgCgl1bnNpZ25lZCBpbnQgYWRkcl9sZW49c2l6ZW9m KHJfYWRkcik7CglpZiAocmVjdmZyb20oc29ja2ZkLCAmcGNrdCwgc2l6ZW9mKHBja3QpLCAwLCAo c3RydWN0IHNvY2thZGRyKikmcl9hZGRyLCAmYWRkcl9sZW4pIDw9IDApIHsKCQlwdXRzKCJQYWNr ZXQgcmVjZWl2ZSBmYWlsZWQhIik7Cgl9IGVsc2UgewoJCXByaW50Zigic2luX2ZhbWlseSA9ICUw eFxuIiwgcl9hZGRyLnNpbl9mYW1pbHkpOwoJCXByaW50Zigic19hZGRyID0gJTB4XG4iLCByX2Fk ZHIuc2luX2FkZHIuc19hZGRyKTsKCQlwcmludGYoInNpbl9wb3J0ID0gJTB4XG4iLCByX2FkZHIu c2luX3BvcnQpOwoKCQlwcmludGYoIlBhY2tldCByZWNlaXZlZCB3aXRoIElDTVAgdHlwZSAlZCBj b2RlICVkXG4iLCBwY2t0Lmhkci50eXBlLCBwY2t0Lmhkci5jb2RlKTsKCQlwcmludGYoInBja3Qu aGRyLmNoZWNrc3VtICUwNHhcbiIsIHBja3QuaGRyLmNoZWNrc3VtKTsKCQlwcmludGYoImlkPSVk IHNlcXVlbmNlPSVkLCB0dGw9JWRcbiIsIHBja3QuaGRyLnVuLmVjaG8uaWQsIHBja3QuaGRyLnVu LmVjaG8uc2VxdWVuY2UsIHR0bF92YWwpOwoKCQlmb3IoaW50IGk9MDsgaTxzaXplb2YocGNrdC5t c2cpOyArK2kpIHsKCQkJcHJpbnRmKCIlMDJ4ICIsIHBja3QubXNnW2ldKTsKCQl9CgkJcHV0cygi Iik7Cgl9CglyZXR1cm4gMDsKfSAK --0000000000009a1e2f05bca751fb--