Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 4731 → Rev 4743

/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
90,7 → 104,7
/** Type definition of the Ethernet header preamble pointer.
* @see eth_preamble
*/
typedef eth_preamble_t * eth_preamble_ref;
typedef eth_preamble_t * eth_preamble_ref;
 
/** Type definition of the Ethernet header.
* @see eth_header
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;