Hi everybody, I'm not sure if this is what Emmanuel and Jean had in mind, but hopefully this will of some help to us... ;-) Most of the information in this diagram can be found at http://www-classic.be.com/aboutbe/benewsletter/volume_IV/Issue05.html. The rest is contained in BE's bone.zip (if someone needs the archive I can e-mail it); I'm not entirely clear on how Data Link module should interface with framing module and ethernet (or whatever) driver; I made an attempt to list possible functions which an ethernet driver would have to implement by looking at the header files in BONE example. Anyway, it is only a first approach so a lot of thnigs will change; Let me know if you have any suggestions, corrections, etc... Enjoy, Dmitri _______________ | | | libsocket.so | |_______________| user land | - - - - - - - - - - - - - - - - -+- - - - - - - - - - - - - kernel land | ________|________ | | ______________ | net api driver | | | |_________________| | bone_util | | |______________| ________|________ | | network/transport | protocol module | (e.g.,. udp) layer |_________________| | ________|________ | | (contains ARP, data link layer | datalink module | etc.) |_________________| / \ _____________/___ _\_______________ | loopback | | 802.3 | | framing module | | framing module | |_________________| |_________________| | | physical layer | | ________|________ ________|________ | | | | | loopback driver | | ethernet driver | |_________________| |_________________| - libsocket.so interfaces with user-land applications using Network Kit/Posix (BSD sockets) API; - Net API driver is responsible for creating bone_endpoint_t structure and handles all communications between the socket and protocol stack. Interfaces with libsocket.so via ioctls; - Protocol module interfaces with Net API driver via (as found in bone_proto.h in bone.zip example): status_t (*init_protocol)(struct bone_proto_node *you); - called when a new endpoint is created status_t (*uninit_protocol)(struct bone_proto_node *you); - called when deleting an endpoint status_t (*close)(struct bone_proto_node *you); - called when a user calls "close" on a socket status_t (*connect)(struct bone_proto_node *you, struct sockaddr *them); status_t (*send_data)(struct bone_proto_node *you, bone_data_t *data); int32 (*send_avail)(struct bone_proto_node *you); - called to determine how many bytes can be sent without blocking status_t (*read_data)(struct bone_proto_node *you, struct iovec *into, int numiov, int32 flags, bigtime_t timeout, struct sockaddr *addr, int len); int32 (*read_avail)(struct bone_proto_node *you);- called to determine how many bytes can be read without blocking status_t (*accept)(struct bone_proto_node *you, struct bone_proto_node *clone); status_t (*bind)(struct bone_proto_node *you, struct sockaddr *sa); status_t (*unbind)(struct bone_proto_node *you, struct sockaddr *sa); - I'm not sure about the purpose of this call status_t (*listen)(struct bone_proto_node *you, int count); status_t (*shutdown)(struct bone_proto_node *you, int direction); - closes our side of the connection status_t (*control)(struct bone_proto_node *you, int level, int cmd, void *arg, int arglen); - called on ioctl or setsockopt status_t (*error)(int32 error_code, bone_data_t *error_data); - interface for error reporting (ICMP) status_t (*error_reply)(struct bone_proto_node *you, bone_data_t *caused_error, uint32 error_code, void *error_data); - interface for error replies (ICMP) int32 (*getMTU)(struct bone_proto_node *you, struct sockaddr *sa); - get route MTU route_t (*get_route)(struct bone_proto_node *you, struct sockaddr *addr); - get route -Protocol module interfaces with Data Link module via: status_t (*receive_data)(bone_data_t *data); -Datalink module - manages network interfaces, handles ARP operations: void (*register_interface)(ifnet_t *ifnet); status_t (*up)(ifnet_t *ifnet); void (*down)(ifnet_t *ifnet); status_t (*setMedia)(ifnet_t *ifnet, uint32 media); status_t (*setPromiscuous)(ifnet_t *ifnet, int on); status_t (*getHardwareAddr)(ifnet_t *ifnet, bone_iface_hwaddr_t *addr); status_t (*send_data)(ifnet_t *ifnet, bone_data_t *data); - send data on the specified interface status_t (*send_data_nonblocking)(ifnet_t *ifnet, bone_data_t *data); -Framing module - ecapsulates into packet into a frame/decapsulates frame into a packet, performs checksum (FCS) calculations -I'm not sure if this is all we need... status_t (*frame_data)(ifnet_t *ifnet, bone_data_t *data); status_t (*deframe_data)(ifnet_t *ifnet, bone_data_t *data); void (*compute_fcs)(bone_data_t *data); - calculates FCS (frame check sequence) -Physical layer [Ethernet] driver status_t (*up)(void); void (*down)(void); status_t (*setMedia)(uint32 media); status_t (*send_data)(bone_data_t *data); status_t (*send_data_nonblocking)(bone_data_t *data); status_t (*receive_data)(bone_data_t **data); status_t (*setMTU)(uint32 mtu); status_t (*setPromiscuous)(int on); status_t (*getHardwareAddr)(bone_iface_hwaddr_t *addr);