From: Wolfgang <wutz@unterderbruecke.de>
To: linux-can@vger.kernel.org
Subject: promiscuous mode
Date: Wed, 11 Jan 2012 16:06:03 +0000 (UTC) [thread overview]
Message-ID: <loom.20120111T163604-92@post.gmane.org> (raw)
In-Reply-To: 20120110152341.GD2524@e-circ.dyndns.org
static struct {
struct sockaddr_can src;
int pkt_len;
} ss = {
.pkt_len = 1024,
.src.can_addr.j1939 = {
.name = J1939_NO_NAME,
.addr = J1939_NO_ADDR,
.pgn = J1939_NO_PGN,
},
};
int main (void)
{
int s;
s = socket(PF_CAN, SOCK_DGRAM, CAN_J1939);
struct sockaddr_can addr;
memset(&addr, 0, sizeof(addr));
addr.can_ifindex = ss.src.can_ifindex;
addr.can_addr.j1939.name = J1939_NO_NAME;
addr.can_addr.j1939.addr = J1939_NO_ADDR;
addr.can_addr.j1939.pgn = J1939_NO_PGN;
addr.can_family = AF_CAN;
if (bind(s, (void *)&addr, sizeof(addr))<0)
perror ("bind failed");
else
printf("bind of promiscuous socket successful\n");
int s2;
s2 = socket(PF_CAN, SOCK_DGRAM, CAN_J1939);
struct sockaddr_can addr2;
memset(&addr2, 0, sizeof(addr2));
addr2.can_ifindex = if_nametoindex("can1");
addr2.can_addr.j1939.name = J1939_NO_NAME;
addr2.can_addr.j1939.addr = 0x3d;
addr2.can_addr.j1939.pgn = J1939_NO_PGN;
addr2.can_family = AF_CAN;
if (bind(s2, (void *)&addr2, sizeof(addr2))<0)
perror ("bind2 failed");
else
printf("bind of s2 on can1 addr 0x3d successful\n");
int ret;
socklen_t len;
struct sockaddr_can src_addr;
char buf[128];
;
while (1)
{
len = sizeof(src_addr);
ret = recvfrom(s, buf, sizeof(buf), 0, (void *)&src_addr, &len);
if (ret < 0)
perror ("recvfrom failed");
}
}
return 0;
}
It is working, is it possible to use it or do I have to use recvmsg, because
when I do sendto it is receiving the sent message again and again or is it
possible to clear the buffer somehow? Recvmsg is working as well but how do I
have to change the sendto, 'sendto failed: Invalid argument'?
static char ctrlmsg[
CMSG_SPACE(sizeof(uint8_t)) /* dest addr */
+ CMSG_SPACE(sizeof(uint64_t)) /* dest name */
+ CMSG_SPACE(sizeof(uint8_t)) /* priority */
];
static struct {
struct sockaddr_can addr;
int pkt_len;
} s = {
.pkt_len = 1024,
.addr.can_addr.j1939 = {
.name = J1939_NO_NAME,
.addr = J1939_NO_ADDR,
.pgn = J1939_NO_PGN,
},
};
int main (void)
{
int sock, ret, j;
unsigned int len;
struct msghdr msg;
struct iovec iov;
static uint8_t *buf;
struct sockaddr_can src;
socklen_t leng;
buf = malloc(s.pkt_len);
if (!buf)
error(1, errno, "malloc %u", s.pkt_len);
sock = socket(PF_CAN,SOCK_DGRAM,CAN_J1939);
memset(&src, 0, sizeof(src));
src.can_ifindex = s.addr.can_ifindex;
src.can_family = AF_CAN;
src.can_addr.j1939.name = J1939_NO_NAME;
src.can_addr.j1939.addr = J1939_NO_ADDR;
src.can_addr.j1939.pgn = J1939_NO_PGN;
bind(sock,(void*)&src,sizeof(src));
len = sizeof(src);
iov.iov_base = &buf[0];
msg.msg_name = &src;
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
msg.msg_control = &ctrlmsg;
msg.msg_namelen = len;
int s2;
s2 = socket(PF_CAN, SOCK_DGRAM, CAN_J1939);
struct sockaddr_can addr2;
memset(&addr2, 0, sizeof(addr2));
addr2.can_ifindex = if_nametoindex("can1");
addr2.can_addr.j1939.name = J1939_NO_NAME;
addr2.can_addr.j1939.addr = 0x3d;
addr2.can_addr.j1939.pgn = J1939_NO_PGN;
addr2.can_family = AF_CAN;
if (bind(s2, (void *)&addr2, sizeof(addr2))<0)
perror ("bind2 failed");
else
printf("bind of s2 on can1 addr 0x3d successful\n");
while (1) {
/* these settings may be modified by recvmsg() */
iov.iov_len = s.pkt_len;
msg.msg_namelen = sizeof(src);
msg.msg_controllen = sizeof(ctrlmsg);
msg.msg_flags = 0;
ret = recvmsg(sock, &msg, 0);
len = ret;
if ((sendto(s2, buf, ret, 0, (void *)&src, leng))<0);
perror("sendto failed");
}
free(buf);
return 0;
}
Thanks
Best regards,
Wolfgang
next prev parent reply other threads:[~2012-01-11 16:06 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-01-09 13:26 recv list Kurt Van Dijck
2012-01-09 16:35 ` Wolfgang
2012-01-10 8:51 ` Kurt Van Dijck
2012-01-10 10:45 ` Wolfgang
2012-01-10 15:23 ` Kurt Van Dijck
2012-01-11 16:06 ` Wolfgang [this message]
2012-01-12 15:37 ` bridge Kurt Van Dijck
2012-01-12 15:23 ` recv list Wolfgang
2012-01-12 15:43 ` Kurt Van Dijck
2012-01-12 18:08 ` bridging with can-gw - was " Oliver Hartkopp
2012-01-13 11:12 ` bridging with can-gw Kurt Van Dijck
2012-01-13 11:31 ` Wolfgang
2012-01-16 10:04 ` MSG_DONTROUTE Wolfgang
2012-01-16 13:31 ` MSG_DONTROUTE Kurt Van Dijck
2012-01-16 15:28 ` sendmsg Wolfgang
2012-01-16 15:36 ` sendmsg Kurt Van Dijck
2012-02-07 14:21 ` max dlc Wolfgang
2012-02-07 15:11 ` sendmsg Wolfgang
2012-02-08 8:46 ` sendmsg Kurt Van Dijck
2012-02-16 9:58 ` How to get the DA Wolfgang Wagner
2012-02-16 19:49 ` Kurt Van Dijck
2012-02-24 15:23 ` Transport Protocol Wolfgang Wagner
2012-02-27 14:05 ` Kurt Van Dijck
2012-02-28 10:46 ` Transport Protocol: example Kurt Van Dijck
2012-02-28 15:21 ` Wolfgang Wagner
2012-02-28 16:26 ` Kurt Van Dijck
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=loom.20120111T163604-92@post.gmane.org \
--to=wutz@unterderbruecke.de \
--cc=linux-can@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).