Rev 3886 | Rev 3912 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 3886 | Rev 3901 | ||
|---|---|---|---|
| Line 49... | Line 49... | ||
| 49 | #include "../../include/protocol_map.h" |
49 | #include "../../include/protocol_map.h" |
| 50 | #include "../../netif/device.h" |
50 | #include "../../netif/device.h" |
| 51 | 51 | ||
| 52 | #include "../../structures/measured_strings.h" |
52 | #include "../../structures/measured_strings.h" |
| 53 | #include "../../structures/packet/packet.h" |
53 | #include "../../structures/packet/packet.h" |
| - | 54 | #include "../../structures/packet/packet_client.h" |
|
| 54 | 55 | ||
| 55 | #include "arp.h" |
56 | #include "arp.h" |
| 56 | #include "arp_header.h" |
57 | #include "arp_header.h" |
| 57 | #include "arp_oc.h" |
58 | #include "arp_oc.h" |
| 58 | //#include "arp_messages.h" |
59 | //#include "arp_messages.h" |
| 59 | #include "arp_module.h" |
60 | #include "arp_module.h" |
| 60 | 61 | ||
| 61 | #define IPC_GET_DEVICE( call ) ( device_id_t ) IPC_GET_ARG1( * call ) |
62 | #define IPC_GET_DEVICE( call ) ( device_id_t ) IPC_GET_ARG1( * call ) |
| - | 63 | #define IPC_GET_PACKET( call ) ( packet_id_t ) IPC_GET_ARG2( * call ) |
|
| 62 | #define IPC_GET_PROTO( call ) ( services_t ) IPC_GET_ARG2( * call ) |
64 | #define IPC_GET_PROTO( call ) ( services_t ) IPC_GET_ARG2( * call ) |
| 63 | #define IPC_GET_SERVICE( call ) ( services_t ) IPC_GET_ARG3( * call ) |
65 | #define IPC_GET_SERVICE( call ) ( services_t ) IPC_GET_ARG3( * call ) |
| 64 | 66 | ||
| 65 | arp_globals_t arp_globals; |
67 | arp_globals_t arp_globals; |
| 66 | 68 | ||
| Line 145... | Line 147... | ||
| 145 | } |
147 | } |
| 146 | device->service = service; |
148 | device->service = service; |
| 147 | // bind the new one |
149 | // bind the new one |
| 148 | device->phone = bind_service( device->service, device->device_id, SERVICE_ARP, 0, arp_receiver ); |
150 | device->phone = bind_service( device->service, device->device_id, SERVICE_ARP, 0, arp_receiver ); |
| 149 | // get packet dimensions |
151 | // get packet dimensions |
| 150 | if( ERROR_OCCURED( async_req_1_3( device->phone, NET_NIL_PACKET_SPACE, device_id, & device->prefix, & device->content, & device->sufix ))){ |
152 | if( ERROR_OCCURED( async_req_1_4( device->phone, NET_NIL_PACKET_SPACE, device_id, & device->addr_len, & device->prefix, & device->content, & device->sufix ))){ |
| 151 | arp_protos_destroy( & device->protos ); |
153 | arp_protos_destroy( & device->protos ); |
| 152 | free( device ); |
154 | free( device ); |
| 153 | return ERROR_CODE; |
155 | return ERROR_CODE; |
| 154 | } |
156 | } |
| 155 | // get hardware address |
157 | // get hardware address |
| Line 214... | Line 216... | ||
| 214 | // ARP packet content size = header + ( address + translation ) * 2 |
216 | // ARP packet content size = header + ( address + translation ) * 2 |
| 215 | length = 8 + ( CONVERT_SIZE( char, uint8_t, proto->addr->length ) + CONVERT_SIZE( char, uint8_t, device->addr->length )) * 2; |
217 | length = 8 + ( CONVERT_SIZE( char, uint8_t, proto->addr->length ) + CONVERT_SIZE( char, uint8_t, device->addr->length )) * 2; |
| 216 | if( length > device->content ){ |
218 | if( length > device->content ){ |
| 217 | return NULL; |
219 | return NULL; |
| 218 | } |
220 | } |
| 219 | packet = packet_create( device->prefix, length, device->sufix ); |
221 | packet = packet_get_5( arp_globals.networking_phone, SERVICE_ARP, device->addr_len, device->prefix, length, device->sufix ); |
| 220 | if( ! packet ) return NULL; |
222 | if( ! packet ) return NULL; |
| 221 | header = ( arp_header_ref ) packet_append( packet, length ); |
223 | header = ( arp_header_ref ) packet_append( packet, length ); |
| 222 | header->hardware = device->hardware; |
224 | header->hardware = device->hardware; |
| 223 | header->hardware_length = device->addr->length; |
225 | header->hardware_length = device->addr->length; |
| 224 | header->protocol = protocol_map( device->service, protocol ); |
226 | header->protocol = protocol_map( device->service, protocol ); |
| Line 231... | Line 233... | ||
| 231 | length += proto->addr->length; |
233 | length += proto->addr->length; |
| 232 | memset((( uint8_t * ) header ) + length, 0, device->addr->length ); |
234 | memset((( uint8_t * ) header ) + length, 0, device->addr->length ); |
| 233 | length += device->addr->length; |
235 | length += device->addr->length; |
| 234 | memcpy((( uint8_t * ) header ) + length, target->value, target->length ); |
236 | memcpy((( uint8_t * ) header ) + length, target->value, target->length ); |
| 235 | // TODO send to the device->broadcast_addr as arp protocol |
237 | // TODO send to the device->broadcast_addr as arp protocol |
| 236 | packet_send( packet, device->phone ); |
238 | async_msg_3( device->phone, NET_NETIF_SEND, device_id, SERVICE_ARP, packet_get_id( packet )); |
| 237 | return NULL; |
239 | return NULL; |
| 238 | } |
240 | } |
| 239 | 241 | ||
| 240 | int arp_receive_message( device_id_t device_id, packet_t packet ){ |
242 | int arp_receive_message( device_id_t device_id, packet_t packet ){ |
| 241 | ERROR_DECLARE; |
243 | ERROR_DECLARE; |
| Line 309... | Line 311... | ||
| 309 | */ memcpy( des_proto, src_proto, header->protocol_length ); |
311 | */ memcpy( des_proto, src_proto, header->protocol_length ); |
| 310 | memcpy( src_proto, proto->addr->value, header->protocol_length ); |
312 | memcpy( src_proto, proto->addr->value, header->protocol_length ); |
| 311 | memcpy( src_hw, des_hw, header->hardware_length ); |
313 | memcpy( src_hw, des_hw, header->hardware_length ); |
| 312 | memcpy( des_hw, hw_source->value, hw_source->length ); |
314 | memcpy( des_hw, hw_source->value, hw_source->length ); |
| 313 | // TODO send to the hw_source as arp protocol |
315 | // TODO send to the hw_source as arp protocol |
| - | 316 | async_msg_3( device->phone, NET_NETIF_SEND, device_id, SERVICE_ARP, packet_get_id( packet )); |
|
| - | 317 | }else{ |
|
| 314 | packet_send( packet, device->phone ); |
318 | packet_release( arp_globals.networking_phone, packet_get_id( packet )); |
| 315 | } |
319 | } |
| 316 | } |
320 | } |
| 317 | return EOK; |
321 | return EOK; |
| 318 | } |
322 | } |
| 319 | 323 | ||
| Line 412... | Line 416... | ||
| 412 | switch( IPC_GET_METHOD( call )){ |
416 | switch( IPC_GET_METHOD( call )){ |
| 413 | case NET_IL_DEVICE_STATE: |
417 | case NET_IL_DEVICE_STATE: |
| 414 | //TODO clear device if off? |
418 | //TODO clear device if off? |
| 415 | break; |
419 | break; |
| 416 | case NET_IL_RECEIVED: |
420 | case NET_IL_RECEIVED: |
| 417 | if( ! ERROR_OCCURED( packet_receive( & packet ))){ |
421 | if( ! ERROR_OCCURED( packet_translate( arp_globals.networking_phone, & packet, IPC_GET_PACKET( & call )))){ |
| 418 | ERROR_CODE = arp_receive_message( IPC_GET_DEVICE( & call ), packet ); |
422 | ERROR_CODE = arp_receive_message( IPC_GET_DEVICE( & call ), packet ); |
| 419 | } |
423 | } |
| 420 | ipc_answer_0( callid, ERROR_CODE ); |
424 | ipc_answer_0( callid, ERROR_CODE ); |
| 421 | break; |
425 | break; |
| 422 | default: |
426 | default: |