/branches/network/uspace/srv/net/nil/eth/eth.c |
---|
49,7 → 49,7 |
#include "../../modules.h" |
#include "../../include/byteorder.h" |
#include "../../include/crc.h" |
#include "../../include/checksum.h" |
#include "../../include/ethernet_lsap.h" |
#include "../../include/ethernet_protocols.h" |
#include "../../include/protocol_map.h" |
191,7 → 191,7 |
* @returns ENOMEM if there is not enough memory left. |
* @returns Other error codes as defined for the net_get_device_conf_req() function. |
* @returns Other error codes as defined for the netif_bind_service() function. |
* @returns Other error codes as defined for the netif_get_addr() function. |
* @returns Other error codes as defined for the netif_get_addr_req() function. |
*/ |
int eth_device_message( device_id_t device_id, services_t service, size_t mtu ); |
363,9 → 363,7 |
if( ! str_lcmp( configuration[ 0 ].value, "DIX", configuration[ 0 ].length )){ |
device->flags |= ETH_DIX; |
}else if( ! str_lcmp( configuration[ 0 ].value, "8023_2_LSAP", configuration[ 0 ].length )){ |
// TODO 8023_2_LSAP |
printf( "8023_2_LSAP is not supported (yet?), DIX used instead\n" ); |
device->flags |= ETH_DIX; |
device->flags |= ETH_8023_2_LSAP; |
}else device->flags |= ETH_8023_2_SNAP; |
if(( configuration[ 1 ].value ) && ( configuration[ 1 ].value[ 0 ] == 'y' )){ |
device->flags |= ETH_DUMMY; |
382,7 → 380,7 |
return device->phone; |
} |
// get hardware address |
if( ERROR_OCCURRED( netif_get_addr( device->phone, device->device_id, & device->addr, & device->addr_data ))){ |
if( ERROR_OCCURRED( netif_get_addr_req( device->phone, device->device_id, & device->addr, & device->addr_data ))){ |
fibril_rwlock_write_unlock( & eth_globals.devices_lock ); |
free( device ); |
return ERROR_CODE; |
405,7 → 403,7 |
eth_proto_ref eth_process_packet( int flags, packet_t packet ){ |
ERROR_DECLARE; |
eth_header_ex_ref header; |
eth_header_snap_ref header; |
size_t length; |
eth_type_t type; |
size_t prefix; |
419,7 → 417,7 |
} |
if( length < sizeof( eth_header_t ) + ETH_MIN_CONTENT + ( IS_DUMMY( flags ) ? ETH_SUFFIX : 0 )) return NULL; |
data = packet_get_data( packet ); |
header = ( eth_header_ex_ref ) data; |
header = ( eth_header_snap_ref ) data; |
type = ntohs( header->header.ethertype ); |
if( type >= ETH_MIN_PROTO ){ |
// DIX Ethernet |
566,7 → 564,8 |
} |
int eth_prepare_packet( int flags, packet_t packet, uint8_t * src_addr, int ethertype, size_t mtu ){ |
eth_header_ex_ref header; |
eth_header_snap_ref header; |
eth_header_lsap_ref header_lsap; |
eth_header_ref header_dix; |
eth_fcs_ref fcs; |
uint8_t * src; |
592,8 → 591,7 |
for( i = 0; i < 7; ++ i ) preamble->preamble[ i ] = ETH_PREAMBLE; |
preamble->sfd = ETH_SFD; |
} |
// TODO LSAP only device |
if( IS_DIX( flags ) || IS_8023_2_LSAP( flags )){ |
if( IS_DIX( flags )){ |
header_dix = PACKET_PREFIX( packet, eth_header_t ); |
if( ! header_dix ) return ENOMEM; |
header_dix->ethertype = ( uint16_t ) ethertype; |
600,13 → 598,23 |
memcpy( header_dix->source_address, src_addr, ETH_ADDR ); |
memcpy( header_dix->destination_address, dest, ETH_ADDR ); |
src = & header_dix->destination_address[ 0 ]; |
}else if( IS_8023_2_LSAP( flags )){ |
header_lsap = PACKET_PREFIX( packet, eth_header_lsap_t ); |
if( ! header_lsap ) return ENOMEM; |
header_lsap->header.ethertype = htons( length + sizeof( eth_header_lsap_t )); |
header_lsap->lsap.dsap = lsap_unmap( ntohs( ethertype )); |
header_lsap->lsap.ssap = header_lsap->lsap.dsap; |
header_lsap->lsap.ctrl = IEEE_8023_2_UI; |
memcpy( header_lsap->header.source_address, src_addr, ETH_ADDR ); |
memcpy( header_lsap->header.destination_address, dest, ETH_ADDR ); |
src = & header_lsap->header.destination_address[ 0 ]; |
}else if( IS_8023_2_SNAP( flags )){ |
header = PACKET_PREFIX( packet, eth_header_ex_t ); |
header = PACKET_PREFIX( packet, eth_header_snap_t ); |
if( ! header ) return ENOMEM; |
header->header.ethertype = htons( length + sizeof( eth_header_lsap_t ) + sizeof( eth_header_snap_t )); |
header->lsap.dsap = ( uint16_t ) ETH_LSAP_SNAP; |
header->lsap.ssap = header->lsap.dsap; |
header->lsap.ctrl = 0; |
header->lsap.ctrl = IEEE_8023_2_UI; |
for( i = 0; i < 3; ++ i ) header->snap.protocol[ i ] = 0; |
header->snap.ethertype = ( uint16_t ) ethertype; |
memcpy( header->header.source_address, src_addr, ETH_ADDR ); |
/branches/network/uspace/srv/net/nil/eth/Makefile |
---|
35,7 → 35,7 |
SOURCES = \ |
$(NAME).c \ |
$(NAME)_module.c \ |
$(NET_BASE)crc.c \ |
$(NET_BASE)checksum.c \ |
$(NET_BASE)module.c \ |
$(NET_BASE)modules.c \ |
$(NET_BASE)net/net_remote.c \ |
/branches/network/uspace/srv/net/nil/eth/eth_header.h |
---|
52,35 → 52,49 |
*/ |
#define ETH_SFD 0xD5 |
/** Type definition of the Ethernet header with all the extensions. |
* @see eth_header_ex |
/** IEEE 802.2 unordered information control field. |
*/ |
typedef struct eth_header_ex eth_header_ex_t; |
#define IEEE_8023_2_UI 0x03 |
/** Type definition of the Ethernet header with all the extensions pointer. |
* @see eth_header |
/** Type definition of the Ethernet header IEEE 802.3 + 802.2 + SNAP extensions. |
* @see eth_header_snap |
*/ |
typedef eth_header_ex_t * eth_header_ex_ref; |
typedef struct eth_header_snap eth_header_snap_t; |
/** Type definition of the Ethernet header LSAP extension. |
/** Type definition of the Ethernet header IEEE 802.3 + 802.2 + SNAP extensions pointer. |
* @see eth_header_snap |
*/ |
typedef eth_header_snap_t * eth_header_snap_ref; |
/** Type definition of the Ethernet header IEEE 802.3 + 802.2 + SNAP extensions. |
* @see eth_header_lsap |
*/ |
typedef struct eth_header_lsap eth_header_lsap_t; |
/** Type definition of the Ethernet header LSAP extension pointer. |
/** Type definition of the Ethernet header IEEE 802.3 + 802.2 extension pointer. |
* @see eth_header_lsap |
*/ |
typedef eth_header_lsap_t * eth_header_lsap_ref; |
/** Type definition of the Ethernet header LSAP extension. |
* @see eth_ieee_lsap |
*/ |
typedef struct eth_ieee_lsap eth_ieee_lsap_t; |
/** Type definition of the Ethernet header LSAP extension pointer. |
* @see eth_ieee_lsap |
*/ |
typedef eth_ieee_lsap_t * eth_ieee_lsap_ref; |
/** Type definition of the Ethernet header SNAP extension. |
* @see eth_header_snap |
* @see eth_snap |
*/ |
typedef struct eth_header_snap eth_header_snap_t; |
typedef struct eth_snap eth_snap_t; |
/** Type definition of the Ethernet header SNAP extension pointer. |
* @see eth_header_snap |
* @see eth_snap |
*/ |
typedef eth_header_snap_t * eth_header_snap_ref; |
typedef eth_snap_t * eth_snap_ref; |
/** Type definition of the Ethernet header preamble. |
* @see preamble |
104,7 → 118,7 |
/** Ethernet header Link Service Access Point extension. |
*/ |
struct eth_header_lsap{ |
struct eth_ieee_lsap{ |
/** Destination Service Access Point identifier. |
* The possible values are assigned by an IEEE committee. |
*/ |
121,7 → 135,7 |
/** Ethernet header SNAP extension. |
*/ |
struct eth_header_snap{ |
struct eth_snap{ |
/** Protocol identifier or organization code. |
*/ |
uint8_t protocol[ 3 ]; |
160,9 → 174,9 |
uint16_t ethertype; |
} __attribute__ ((packed)); |
/** Ethernet header with all the extensions. |
/** Ethernet header IEEE 802.3 + 802.2 extension. |
*/ |
struct eth_header_ex{ |
struct eth_header_lsap{ |
/** Ethernet header. |
*/ |
eth_header_t header; |
170,10 → 184,23 |
* If DSAP and SSAP are set to ETH_LSAP_SNAP the SNAP extension is being used. |
* If DSAP and SSAP fields are equal to ETH_RAW the raw Ethernet packet without any extensions is being used and the frame content starts rigth after the two fields. |
*/ |
eth_header_lsap_t lsap; |
eth_ieee_lsap_t lsap; |
} __attribute__ ((packed)); |
/** Ethernet header IEEE 802.3 + 802.2 + SNAP extensions. |
*/ |
struct eth_header_snap{ |
/** Ethernet header. |
*/ |
eth_header_t header; |
/** LSAP extension. |
* If DSAP and SSAP are set to ETH_LSAP_SNAP the SNAP extension is being used. |
* If DSAP and SSAP fields are equal to ETH_RAW the raw Ethernet packet without any extensions is being used and the frame content starts rigth after the two fields. |
*/ |
eth_ieee_lsap_t lsap; |
/** SNAP extension. |
*/ |
eth_header_snap_t snap; |
eth_snap_t snap; |
} __attribute__ ((packed)); |
/** Ethernet Frame Check Sequence. |
/branches/network/uspace/srv/net/nil/nildummy/nildummy.c |
---|
87,7 → 87,7 |
* @returns EEXIST if the device with the different service exists. |
* @returns ENOMEM if there is not enough memory left. |
* @returns Other error codes as defined for the netif_bind_service() function. |
* @returns Other error codes as defined for the netif_get_addr() function. |
* @returns Other error codes as defined for the netif_get_addr_req() function. |
*/ |
int nildummy_device_message( device_id_t device_id, services_t service, size_t mtu ); |
208,7 → 208,7 |
return device->phone; |
} |
// get hardware address |
if( ERROR_OCCURRED( netif_get_addr( device->phone, device->device_id, & device->addr, & device->addr_data ))){ |
if( ERROR_OCCURRED( netif_get_addr_req( device->phone, device->device_id, & device->addr, & device->addr_data ))){ |
fibril_rwlock_write_unlock( & nildummy_globals.devices_lock ); |
free( device ); |
return ERROR_CODE; |