Hi j_clifton,
as far as I know, the E&S can use UDP, too. But I�ve written a little
C-program to send raw ethernet form linux which compiles fine (I am
using SuSE-Linux, but this should not matter). The code is attached.
I've got the information out of the man pages.
Hope this helps
Bernd
[EMAIL PROTECTED] wrote:
>
> Anyone (especially simulation types) have any examples of using raw ethernet? I
> am trying to connect a Evans & Sutherland ESIG 5350 Image generator and they use
> raw ethernet. I am running Redhat 6.0/6.1 SMP.
>
> I read the network newsgroups and cobbled up some code but it doesn't compile.
> Man 4 packet refers to using a sockaddr_ll struct to pass the MAC address but
> bind, sendto, and recvfrom all complain about type errors because they want a
> sockaddr, not a sockaddr_ll. Also, what is a sll_ifindex?
>
> -- [rtl] ---
> To unsubscribe:
> echo "unsubscribe rtl" | mail [EMAIL PROTECTED] OR
> echo "unsubscribe rtl <Your_email>" | mail [EMAIL PROTECTED]
> ---
> For more information on Real-Time Linux see:
> http://www.rtlinux.org/rtlinux/
/*
* $Id: rp_send.c,v 1.2 2000/01/27 21:43:27 bernd Exp bernd $
*
* raw packet sender for testing rtl-ethernet receiver
* - - ----
*
* this uses PF_PACKET and SOCK_RAW and must be run as root
*
* (c) Bernd Blessmann
*
* Author: Bernd Blessmann, 26.01.2000
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <features.h> /* for the glibc version number */
#if __GLIBC__ >= 2 && __GLIBC_MINOR >= 1
#include <netpacket/packet.h>
#include <net/ethernet.h> /* the L2 protocols */
#else
#include <asm/types.h>
#include <linux/if_packet.h>
#include <linux/if_ether.h> /* the L2 protocols */
#endif
#include "rt_test.h"
int main () {
char hw_source_addr[ETH_ALEN] = {0x00, 0x00, 0xF8, 0x09, 0x9C, 0x71};
char hw_dest_addr[ETH_ALEN] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
char* msg; /* to send; contains header and data */
short int proto = ETH_P_IP;
int i;
int msg_size;
int packet_socket;
struct sockaddr_ll ll_source_addr;
struct sockaddr_ll ll_dest_addr;
struct ethhdr ether_header;
data_struct_t data;
if ( (packet_socket = socket(PF_PACKET, SOCK_RAW, htons(proto))) == -1 ) {
perror("rp_send: main(): socket()");
exit (1);
}
/* source address for bind */
ll_source_addr.sll_family = AF_PACKET;
ll_source_addr.sll_protocol = htons(proto);
ll_source_addr.sll_ifindex = 3;
ll_source_addr.sll_halen = ETH_ALEN;
memcpy (ll_source_addr.sll_addr, hw_source_addr, ETH_ALEN);
/* destinatin address for sendto */
ll_dest_addr.sll_family = AF_PACKET;
ll_dest_addr.sll_protocol = htons(proto);
ll_dest_addr.sll_ifindex = 3;
ll_dest_addr.sll_halen = ETH_ALEN;
memcpy (ll_dest_addr.sll_addr, hw_dest_addr, ETH_ALEN);
if (bind (packet_socket,
(struct sockaddr*)&ll_source_addr,
sizeof(ll_source_addr)) == -1 ) {
perror("rp_send: main(): bind()");
exit (1);
}
/* ethernet header */
memcpy (ether_header.h_dest, hw_dest_addr, ETH_ALEN);
memcpy (ether_header.h_source, hw_source_addr, ETH_ALEN);
/* length of data instead of protocol */
/* ether_header.h_proto = htons(proto); */
ether_header.h_proto = htons(sizeof(data));
/* data */
data.len = sizeof(data);
data.timestamp = ~0; /* no timestamp for now */
data.da_len = DATA_COUNT;
for (i = 0; i < DATA_COUNT; i++) {
data.da[i] = i;
}
/* msg */
msg_size = sizeof(ether_header) + sizeof(data);
if ( (msg = malloc(msg_size)) == NULL ) {
fprintf(stderr, "rp_send: main(): malloc(): No memory available\n");
exit (1);
}
memcpy (msg, ðer_header, sizeof(ether_header));
for (i = 0; i < 5; i++) {
int j;
data.seq_nr = i;
memcpy (msg + sizeof(ether_header), &data, sizeof(data));
for (j = 0; j < msg_size; j++) {
printf ("0x%2.2X ", msg[j] & 0x000000FF);
}
printf ("\n\n");
if ( sendto(packet_socket, msg, msg_size, 0,
(struct sockaddr*)&ll_dest_addr,
sizeof(ll_dest_addr)) == -1 ) {
perror("rp_send: main(): sendto()");
exit (1);
}
}
close (packet_socket);
return 0;
}
/*
* $Id: rt_test.h,v 1.6 2000/03/02 14:37:31 e6t40 Exp e6t40 $
*
* RealtimeLinuxEthernet
* Header fuer Testmodule
*
* Autor: Bernd Blessmann
* Datum: 19.01.2000
*
*/
#ifndef rt_test_h
#define rt_test_h
#ifdef __RTL__
# include <rtl.h>
#endif /* __RTL__ */
#define MS 1000000 /* one ms in ns */
#define PERIOD (2*MS) /* send period; recv period is half of that */
#define DATA_COUNT 2000
typedef struct {
int len;
int seq_nr;
#ifdef __RTL__
hrtime_t timestamp;
#else
long long timestamp;
#endif /* __RTL__ */
int da_len;
int da[DATA_COUNT];
} data_struct_t;
#endif /* rt_test_h */