Changeset eb522e8 in mainline for uspace/srv/net/netif/lo/lo.c
- Timestamp:
- 2011-06-01T08:43:42Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 8d6c1f1
- Parents:
- 9e2e715 (diff), e51a514 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/netif/lo/lo.c
r9e2e715 reb522e8 39 39 #include <stdio.h> 40 40 #include <str.h> 41 42 #include <ipc/ipc.h>43 41 #include <ipc/services.h> 44 42 #include <ipc/nil.h> 45 46 43 #include <net/modules.h> 47 44 #include <adt/measured_strings.h> 48 45 #include <packet_client.h> 49 46 #include <net/device.h> 50 #include <nil_interface.h> 51 #include <netif_interface.h> 52 #include <netif_local.h> 53 54 /** Default hardware address. */ 55 #define DEFAULT_ADDR "\0\0\0\0\0\0" 47 #include <netif_skel.h> 48 #include <nil_remote.h> 56 49 57 50 /** Default address length. */ 58 #define DEFAULT_ADDR_LEN (sizeof(DEFAULT_ADDR) / sizeof(char))51 #define DEFAULT_ADDR_LEN 6 59 52 60 53 /** Loopback module name. */ 61 54 #define NAME "lo" 62 55 63 /** Network interface global data. */ 64 netif_globals_t netif_globals;56 static uint8_t default_addr[DEFAULT_ADDR_LEN] = 57 {0, 0, 0, 0, 0, 0}; 65 58 66 59 int netif_specific_message(ipc_callid_t callid, ipc_call_t *call, 67 ipc_call_t *answer, int *answer_count)60 ipc_call_t *answer, size_t *count) 68 61 { 69 62 return ENOTSUP; 70 63 } 71 64 72 int netif_get_addr_message(device_id_t device_id, measured_string_ refaddress)65 int netif_get_addr_message(device_id_t device_id, measured_string_t *address) 73 66 { 74 67 if (!address) 75 68 return EBADMEM; 76 77 address->value = str_dup(DEFAULT_ADDR);69 70 address->value = default_addr; 78 71 address->length = DEFAULT_ADDR_LEN; 79 80 return EOK; 81 } 82 83 int netif_get_device_stats(device_id_t device_id, device_stats_ref stats) 84 { 85 netif_device_t *device; 86 int rc; 87 72 73 return EOK; 74 } 75 76 int netif_get_device_stats(device_id_t device_id, device_stats_t *stats) 77 { 88 78 if (!stats) 89 79 return EBADMEM; 90 91 rc = find_device(device_id, &device); 80 81 netif_device_t *device; 82 int rc = find_device(device_id, &device); 92 83 if (rc != EOK) 93 84 return rc; 94 95 memcpy(stats, (device_stats_ ref) device->specific,85 86 memcpy(stats, (device_stats_t *) device->specific, 96 87 sizeof(device_stats_t)); 97 98 return EOK; 99 } 100 101 /** Changes the loopback state. 102 * 103 * @param[in] device The device structure. 104 * @param[in] state The new device state. 105 * @returns The new state if changed. 106 * @returns EOK otherwise. 107 */ 108 static int change_state_message(netif_device_t *device, device_state_t state) 88 89 return EOK; 90 } 91 92 /** Change the loopback state. 93 * 94 * @param[in] device The device structure. 95 * @param[in] state The new device state. 96 * 97 * @return New state if changed. 98 * @return EOK otherwise. 99 * 100 */ 101 static void change_state_message(netif_device_t *device, device_state_t state) 109 102 { 110 103 if (device->state != state) { 111 104 device->state = state; 112 105 113 printf("%s: State changed to %s\n", NAME, 114 (state == NETIF_ACTIVE) ? "active" : "stopped"); 106 const char *desc; 107 switch (state) { 108 case NETIF_ACTIVE: 109 desc = "active"; 110 break; 111 case NETIF_STOPPED: 112 desc = "stopped"; 113 break; 114 default: 115 desc = "unknown"; 116 } 115 117 116 return state; 117 } 118 119 return EOK; 120 } 121 122 /** Creates and returns the loopback network interface structure. 123 * 124 * @param[in] device_id The new devce identifier. 125 * @param[out] device The device structure. 126 * @returns EOK on success. 127 * @returns EXDEV if one loopback network interface already exists. 128 * @returns ENOMEM if there is not enough memory left. 129 */ 130 static int create(device_id_t device_id, netif_device_t **device) 131 { 132 int index; 133 118 printf("%s: State changed to %s\n", NAME, desc); 119 } 120 } 121 122 /** Create and return the loopback network interface structure. 123 * 124 * @param[in] device_id New devce identifier. 125 * @param[out] device Device structure. 126 * 127 * @return EOK on success. 128 * @return EXDEV if one loopback network interface already exists. 129 * @return ENOMEM if there is not enough memory left. 130 * 131 */ 132 static int lo_create(device_id_t device_id, netif_device_t **device) 133 { 134 134 if (netif_device_map_count(&netif_globals.device_map) > 0) 135 135 return EXDEV; 136 136 137 137 *device = (netif_device_t *) malloc(sizeof(netif_device_t)); 138 138 if (!*device) 139 139 return ENOMEM; 140 140 141 141 (*device)->specific = (device_stats_t *) malloc(sizeof(device_stats_t)); 142 142 if (!(*device)->specific) { … … 144 144 return ENOMEM; 145 145 } 146 147 null_device_stats((device_stats_ ref) (*device)->specific);146 147 null_device_stats((device_stats_t *) (*device)->specific); 148 148 (*device)->device_id = device_id; 149 149 (*device)->nil_phone = -1; 150 150 (*device)->state = NETIF_STOPPED; 151 in dex = netif_device_map_add(&netif_globals.device_map,151 int index = netif_device_map_add(&netif_globals.device_map, 152 152 (*device)->device_id, *device); 153 153 154 154 if (index < 0) { 155 155 free(*device); … … 164 164 int netif_initialize(void) 165 165 { 166 ipcarg_t phonehash; 167 168 return REGISTER_ME(SERVICE_LO, &phonehash); 169 } 170 171 int netif_probe_message(device_id_t device_id, int irq, uintptr_t io) 172 { 166 return async_connect_to_me(PHONE_NS, SERVICE_LO, 0, 0, NULL); 167 } 168 169 int netif_probe_message(device_id_t device_id, int irq, void *io) 170 { 171 /* Create a new device */ 173 172 netif_device_t *device; 174 int rc; 175 176 /* Create a new device */ 177 rc = create(device_id, &device); 173 int rc = lo_create(device_id, &device); 178 174 if (rc != EOK) 179 175 return rc; 180 181 /* Print the settings */ 176 182 177 printf("%s: Device created (id: %d)\n", NAME, device->device_id); 183 184 return EOK; 185 } 186 187 int netif_send_message(device_id_t device_id, packet_t packet, services_t sender) 178 return EOK; 179 } 180 181 int netif_send_message(device_id_t device_id, packet_t *packet, services_t sender) 188 182 { 189 183 netif_device_t *device; 190 size_t length; 191 packet_t next; 192 int phone; 193 int rc; 194 195 rc = find_device(device_id, &device); 184 int rc = find_device(device_id, &device); 196 185 if (rc != EOK) 197 186 return EOK; 198 187 199 188 if (device->state != NETIF_ACTIVE) { 200 189 netif_pq_release(packet_get_id(packet)); 201 190 return EFORWARD; 202 191 } 203 204 next = packet;192 193 packet_t *next = packet; 205 194 do { 206 ((device_stats_ ref) device->specific)->send_packets++;207 ((device_stats_ ref) device->specific)->receive_packets++;208 length = packet_get_data_length(next);209 ((device_stats_ ref) device->specific)->send_bytes += length;210 ((device_stats_ ref) device->specific)->receive_bytes += length;195 ((device_stats_t *) device->specific)->send_packets++; 196 ((device_stats_t *) device->specific)->receive_packets++; 197 size_t length = packet_get_data_length(next); 198 ((device_stats_t *) device->specific)->send_bytes += length; 199 ((device_stats_t *) device->specific)->receive_bytes += length; 211 200 next = pq_next(next); 212 } while (next);213 214 phone = device->nil_phone;201 } while (next); 202 203 int phone = device->nil_phone; 215 204 fibril_rwlock_write_unlock(&netif_globals.lock); 205 216 206 nil_received_msg(phone, device_id, packet, sender); 207 217 208 fibril_rwlock_write_lock(&netif_globals.lock); 218 219 209 return EOK; 220 210 } … … 222 212 int netif_start_message(netif_device_t *device) 223 213 { 224 return change_state_message(device, NETIF_ACTIVE); 214 change_state_message(device, NETIF_ACTIVE); 215 return device->state; 225 216 } 226 217 227 218 int netif_stop_message(netif_device_t *device) 228 219 { 229 return change_state_message(device, NETIF_STOPPED); 230 } 231 232 /** Default thread for new connections. 233 * 234 * @param[in] iid The initial message identifier. 235 * @param[in] icall The initial message call structure. 236 */ 237 static void netif_client_connection(ipc_callid_t iid, ipc_call_t *icall) 238 { 239 /* 240 * Accept the connection 241 * - Answer the first IPC_M_CONNECT_ME_TO call. 242 */ 243 ipc_answer_0(iid, EOK); 244 245 while (true) { 246 ipc_call_t answer; 247 int answer_count; 248 249 /* Clear the answer structure */ 250 refresh_answer(&answer, &answer_count); 251 252 /* Fetch the next message */ 253 ipc_call_t call; 254 ipc_callid_t callid = async_get_call(&call); 255 256 /* Process the message */ 257 int res = netif_module_message(NAME, callid, &call, &answer, 258 &answer_count); 259 260 /* 261 * End if told to either by the message or the processing 262 * result. 263 */ 264 if ((IPC_GET_METHOD(call) == IPC_M_PHONE_HUNGUP) || 265 (res == EHANGUP)) 266 return; 267 268 /* Answer the message */ 269 answer_call(callid, res, &answer, answer_count); 270 } 220 change_state_message(device, NETIF_STOPPED); 221 return device->state; 271 222 } 272 223 273 224 int main(int argc, char *argv[]) 274 225 { 275 int rc;276 277 226 /* Start the module */ 278 rc = netif_module_start(netif_client_connection); 279 return rc; 227 return netif_module_start(); 280 228 } 281 229
Note:
See TracChangeset
for help on using the changeset viewer.