diff options
Diffstat (limited to 'device/net_io.c')
-rw-r--r-- | device/net_io.c | 271 |
1 files changed, 118 insertions, 153 deletions
diff --git a/device/net_io.c b/device/net_io.c index 4ebf9964..47ef2ea8 100644 --- a/device/net_io.c +++ b/device/net_io.c @@ -144,7 +144,7 @@ vm_size_t net_kmsg_size; /* initialized below */ ipc_kmsg_t net_kmsg_get(void) { - register ipc_kmsg_t kmsg; + ipc_kmsg_t kmsg; spl_t s; /* @@ -196,7 +196,7 @@ net_kmsg_get(void) } void -net_kmsg_put(register ipc_kmsg_t kmsg) +net_kmsg_put(const ipc_kmsg_t kmsg) { spl_t s; @@ -212,7 +212,7 @@ net_kmsg_put(register ipc_kmsg_t kmsg) void net_kmsg_collect(void) { - register ipc_kmsg_t kmsg; + ipc_kmsg_t kmsg; spl_t s; s = splimp(); @@ -238,7 +238,7 @@ net_kmsg_collect(void) void net_kmsg_more(void) { - register ipc_kmsg_t kmsg; + ipc_kmsg_t kmsg; /* * Replenish net kmsg pool if low. We don't have the locks @@ -301,17 +301,13 @@ struct net_rcv_port { filter_t filter[NET_MAX_FILTER]; /* filter operations */ }; -typedef struct net_rcv_port *net_rcv_port_t; struct kmem_cache net_rcv_cache; /* cache of net_rcv_port structs */ - #define NET_HASH_SIZE 256 #define N_NET_HASH 4 #define N_NET_HASH_KEYS 4 -unsigned int bpf_hash (int, unsigned int *); - /* * A single hash entry. */ @@ -323,7 +319,6 @@ struct net_hash_entry { int rcv_qlimit; /* qlimit for the port */ unsigned int keys[N_NET_HASH_KEYS]; }; -typedef struct net_hash_entry *net_hash_entry_t; struct kmem_cache net_hash_entry_cache; @@ -342,8 +337,6 @@ struct net_hash_header { net_hash_entry_t table[NET_HASH_SIZE]; } filter_hash_header[N_NET_HASH]; -typedef struct net_hash_header *net_hash_header_t; - decl_simple_lock_data(,net_hash_header_lock) #define HASH_ITERATE(head, elt) (elt) = (net_hash_entry_t) (head); do { @@ -351,7 +344,6 @@ decl_simple_lock_data(,net_hash_header_lock) (elt) = (net_hash_entry_t) queue_next((queue_entry_t) (elt)); \ } while ((elt) != (head)); - #define FILTER_ITERATE(if_port_list, fp, nextfp, chain) \ for ((fp) = (net_rcv_port_t) queue_first(if_port_list); \ !queue_end(if_port_list, (queue_entry_t)(fp)); \ @@ -361,44 +353,10 @@ decl_simple_lock_data(,net_hash_header_lock) /* entry_p must be net_rcv_port_t or net_hash_entry_t */ #define ENQUEUE_DEAD(dead, entry_p, chain) { \ - queue_next(&(entry_p)->chain) = (queue_entry_t) (dead); \ + (entry_p)->chain.next = (queue_entry_t) (dead); \ (dead) = (queue_entry_t)(entry_p); \ } -extern boolean_t net_do_filter(); /* CSPF */ -extern int bpf_do_filter(); /* BPF */ - -int hash_ent_remove ( - struct ifnet *ifp, - net_hash_header_t hp, - int used, - net_hash_entry_t *head, - net_hash_entry_t entp, - queue_entry_t *dead_p); - -void net_free_dead_infp (queue_entry_t dead_infp); -void net_free_dead_entp (queue_entry_t dead_entp); - -int bpf_validate( - bpf_insn_t f, - int bytes, - bpf_insn_t *match); - -int bpf_eq ( - bpf_insn_t f1, - bpf_insn_t f2, - register int bytes); - -int net_add_q_info (ipc_port_t rcv_port); - -int bpf_match ( - net_hash_header_t hash, - int n_keys, - unsigned long *keys, - net_hash_entry_t **hash_headpp, - net_hash_entry_t *entpp); - - /* * ethernet_priority: * @@ -411,9 +369,9 @@ int bpf_match ( */ boolean_t ethernet_priority(kmsg) - ipc_kmsg_t kmsg; + const ipc_kmsg_t kmsg; { - register unsigned char *addr = + unsigned char *addr = (unsigned char *) net_kmsg(kmsg)->header; /* @@ -454,10 +412,9 @@ mach_msg_type_t packet_type = { * Dequeues a message and delivers it at spl0. * Returns FALSE if no messages. */ -boolean_t net_deliver(nonblocking) - boolean_t nonblocking; +boolean_t net_deliver(boolean_t nonblocking) { - register ipc_kmsg_t kmsg; + ipc_kmsg_t kmsg; boolean_t high_priority; struct ipc_kmsg_queue send_list; @@ -510,6 +467,7 @@ boolean_t net_deliver(nonblocking) /* remember message sizes must be rounded up */ kmsg->ikm_header.msgh_size = (((mach_msg_size_t) (sizeof(struct net_rcv_msg) + - sizeof net_kmsg(kmsg)->sent - NET_RCV_MAX + count)) + 3) &~ 3; kmsg->ikm_header.msgh_local_port = MACH_PORT_NULL; kmsg->ikm_header.msgh_kind = MACH_MSGH_KIND_NORMAL; @@ -562,7 +520,7 @@ boolean_t net_deliver(nonblocking) * net_kmsg_get will do a wakeup. */ -void net_ast() +void net_ast(void) { spl_t s; @@ -591,7 +549,7 @@ void net_ast() (void) splx(s); } -void net_thread_continue() +void __attribute__ ((noreturn)) net_thread_continue(void) { for (;;) { spl_t s; @@ -617,7 +575,7 @@ void net_thread_continue() } } -void net_thread() +void net_thread(void) { spl_t s; @@ -645,10 +603,11 @@ void net_thread() } void -reorder_queue(first, last) - register queue_t first, last; +reorder_queue( + queue_t first, + queue_t last) { - register queue_entry_t prev, next; + queue_entry_t prev, next; prev = first->prev; next = last->next; @@ -668,11 +627,11 @@ reorder_queue(first, last) * We are already at splimp. */ void -net_packet(ifp, kmsg, count, priority) - register struct ifnet *ifp; - register ipc_kmsg_t kmsg; - unsigned int count; - boolean_t priority; +net_packet( + struct ifnet *ifp, + ipc_kmsg_t kmsg, + unsigned int count, + boolean_t priority) { boolean_t awake; @@ -681,7 +640,7 @@ net_packet(ifp, kmsg, count, priority) * Do a quick check to see if it is a kernel TTD packet. * * Only check if KernelTTD is enabled, ie. the current - * device driver supports TTD, and the bootp succeded. + * device driver supports TTD, and the bootp succeeded. */ if (kttd_enabled && kttd_handle_async(kmsg)) { /* @@ -732,12 +691,12 @@ int net_filter_queue_reorder = 0; /* non-zero to enable reordering */ */ void net_filter(kmsg, send_list) - register ipc_kmsg_t kmsg; + const ipc_kmsg_t kmsg; ipc_kmsg_queue_t send_list; { - register struct ifnet *ifp; - register net_rcv_port_t infp, nextfp; - register ipc_kmsg_t new_kmsg; + struct ifnet *ifp; + net_rcv_port_t infp, nextfp; + ipc_kmsg_t new_kmsg; net_hash_entry_t entp, *hash_headp; ipc_port_t dest; @@ -857,7 +816,7 @@ net_filter(kmsg, send_list) ipc_kmsg_enqueue(send_list, new_kmsg); { - register net_rcv_port_t prevfp; + net_rcv_port_t prevfp; int rcount = ++infp->rcv_count; /* @@ -914,14 +873,14 @@ net_filter(kmsg, send_list) boolean_t net_do_filter(infp, data, data_count, header) net_rcv_port_t infp; - char * data; + const char * data; unsigned int data_count; - char * header; + const char * header; { int stack[NET_FILTER_STACK_DEPTH+1]; - register int *sp; - register filter_t *fp, *fpe; - register unsigned int op, arg; + int *sp; + filter_t *fp, *fpe; + unsigned int op, arg; /* * The filter accesses the header and data @@ -1052,13 +1011,13 @@ net_do_filter(infp, data, data_count, header) * Check filter for invalid operations or stack over/under-flow. */ boolean_t -parse_net_filter(filter, count) - register filter_t *filter; - unsigned int count; +parse_net_filter( + filter_t *filter, + unsigned int count) { - register int sp; - register filter_t *fpe = &filter[count]; - register filter_t op, arg; + int sp; + filter_t *fpe = &filter[count]; + filter_t op, arg; /* * count is at least 1, and filter[0] is used for flags. @@ -1146,19 +1105,19 @@ parse_net_filter(filter, count) * If we are successful, we must consume that right. */ io_return_t -net_set_filter(ifp, rcv_port, priority, filter, filter_count) - struct ifnet *ifp; - ipc_port_t rcv_port; - int priority; - filter_t *filter; - unsigned int filter_count; +net_set_filter( + struct ifnet *ifp, + ipc_port_t rcv_port, + int priority, + filter_t *filter, + unsigned int filter_count) { int filter_bytes; bpf_insn_t match; - register net_rcv_port_t infp, my_infp; + net_rcv_port_t infp, my_infp; net_rcv_port_t nextfp; net_hash_header_t hhp; - register net_hash_entry_t entp, hash_entp; + net_hash_entry_t entp; net_hash_entry_t *head, nextentp; queue_entry_t dead_infp, dead_entp; int i; @@ -1166,6 +1125,13 @@ net_set_filter(ifp, rcv_port, priority, filter, filter_count) io_return_t rval; boolean_t in, out; + /* Initialize hash_entp to NULL to quiet GCC + * warning about uninitialized variable. hash_entp is only + * used when match != 0; in that case it is properly initialized + * by kmem_cache_alloc(). + */ + net_hash_entry_t hash_entp = NULL; + /* * Check the filter syntax. */ @@ -1404,16 +1370,16 @@ clean_and_return: * Other network operations */ io_return_t -net_getstat(ifp, flavor, status, count) - struct ifnet *ifp; - dev_flavor_t flavor; - dev_status_t status; /* pointer to OUT array */ - natural_t *count; /* OUT */ +net_getstat( + struct ifnet *ifp, + dev_flavor_t flavor, + dev_status_t status, /* pointer to OUT array */ + natural_t *count) /* OUT */ { switch (flavor) { case NET_STATUS: { - register struct net_status *ns = (struct net_status *)status; + struct net_status *ns = (struct net_status *)status; if (*count < NET_STATUS_COUNT) return (D_INVALID_OPERATION); @@ -1431,9 +1397,9 @@ net_getstat(ifp, flavor, status, count) } case NET_ADDRESS: { - register int addr_byte_count; - register int addr_int_count; - register int i; + int addr_byte_count; + int addr_int_count; + int i; addr_byte_count = ifp->if_address_size; addr_int_count = (addr_byte_count + (sizeof(int)-1)) @@ -1454,7 +1420,7 @@ printf ("net_getstat: count: %d, addr_int_count: %d\n", - addr_byte_count)); for (i = 0; i < addr_int_count; i++) { - register int word; + int word; word = status[i]; status[i] = htonl(word); @@ -1469,10 +1435,10 @@ printf ("net_getstat: count: %d, addr_int_count: %d\n", } io_return_t -net_write(ifp, start, ior) - register struct ifnet *ifp; - int (*start)(); - io_req_t ior; +net_write( + struct ifnet *ifp, + int (*start)(), + io_req_t ior) { spl_t s; kern_return_t rc; @@ -1523,9 +1489,9 @@ net_write(ifp, start, ior) * Initialize the whole package. */ void -net_io_init() +net_io_init(void) { - register vm_size_t size; + vm_size_t size; size = sizeof(struct net_rcv_port); kmem_cache_init(&net_rcv_cache, "net_rcv_port", size, 0, @@ -1625,20 +1591,21 @@ net_io_init() */ int -bpf_do_filter(infp, p, wirelen, header, hlen, hash_headpp, entpp) - net_rcv_port_t infp; - char * p; /* packet data */ - unsigned int wirelen; /* data_count (in bytes) */ - char * header; - unsigned int hlen; /* header len (in bytes) */ - net_hash_entry_t **hash_headpp, *entpp; /* out */ +bpf_do_filter( + net_rcv_port_t infp, + char * p, /* packet data */ + unsigned int wirelen, /* data_count (in bytes) */ + char * header, + unsigned int hlen, /* header len (in bytes) */ + net_hash_entry_t **hash_headpp, + net_hash_entry_t *entpp) /* out */ { - register bpf_insn_t pc, pc_end; - register unsigned int buflen; + bpf_insn_t pc, pc_end; + unsigned int buflen; - register unsigned long A, X; - register int k; - unsigned long mem[BPF_MEMWORDS]; + unsigned int A, X; + int k; + unsigned int mem[BPF_MEMWORDS]; /* Generic pointer to either HEADER or P according to the specified offset. */ char *data = NULL; @@ -1689,9 +1656,9 @@ bpf_do_filter(infp, p, wirelen, header, hlen, hash_headpp, entpp) k = pc->k; load_word: - if ((u_int)k + sizeof(long) <= hlen) + if ((u_int)k + sizeof(int) <= hlen) data = header; - else if ((u_int)k + sizeof(long) <= buflen) { + else if ((u_int)k + sizeof(int) <= buflen) { k -= hlen; data = p; } else @@ -1702,7 +1669,7 @@ bpf_do_filter(infp, p, wirelen, header, hlen, hash_headpp, entpp) A = EXTRACT_LONG(&data[k]); else #endif - A = ntohl(*(long *)(data + k)); + A = ntohl(*(int *)(data + k)); continue; case BPF_LD|BPF_H|BPF_ABS: @@ -1924,13 +1891,13 @@ bpf_do_filter(infp, p, wirelen, header, hlen, hash_headpp, entpp) * Otherwise, a bogus program could easily crash the system. */ int -bpf_validate(f, bytes, match) - bpf_insn_t f; - int bytes; - bpf_insn_t *match; +bpf_validate( + bpf_insn_t f, + int bytes, + bpf_insn_t *match) { - register int i, j, len; - register bpf_insn_t p; + int i, j, len; + bpf_insn_t p; len = BPF_BYTES2LEN(bytes); @@ -1946,7 +1913,7 @@ bpf_validate(f, bytes, match) */ p = &f[i]; if (BPF_CLASS(p->code) == BPF_JMP) { - register int from = i + 1; + int from = i + 1; if (BPF_OP(p->code) == BPF_JA) { if (from + p->k >= len) @@ -1996,11 +1963,12 @@ bpf_validate(f, bytes, match) } int -bpf_eq (f1, f2, bytes) - register bpf_insn_t f1, f2; - register int bytes; +bpf_eq( + bpf_insn_t f1, + bpf_insn_t f2, + int bytes) { - register int count; + int count; count = BPF_BYTES2LEN(bytes); for (; count--; f1++, f2++) { @@ -2016,10 +1984,10 @@ bpf_eq (f1, f2, bytes) unsigned int bpf_hash (n, keys) - register int n; - register unsigned int *keys; + int n; + const unsigned int *keys; { - register unsigned int hval = 0; + unsigned int hval = 0; while (n--) { hval += *keys++; @@ -2031,12 +1999,12 @@ bpf_hash (n, keys) int bpf_match (hash, n_keys, keys, hash_headpp, entpp) net_hash_header_t hash; - register int n_keys; - register unsigned long *keys; + int n_keys; + const unsigned int *keys; net_hash_entry_t **hash_headpp, *entpp; { - register net_hash_entry_t head, entp; - register int i; + net_hash_entry_t head, entp; + int i; if (n_keys != hash->n_keys) return FALSE; @@ -2070,12 +2038,13 @@ bpf_match (hash, n_keys, keys, hash_headpp, entpp) */ int -hash_ent_remove (ifp, hp, used, head, entp, dead_p) - struct ifnet *ifp; - net_hash_header_t hp; - int used; - net_hash_entry_t *head, entp; - queue_entry_t *dead_p; +hash_ent_remove( + struct ifnet *ifp, + net_hash_header_t hp, + int used, + net_hash_entry_t *head, + net_hash_entry_t entp, + queue_entry_t *dead_p) { hp->ref_count--; @@ -2107,8 +2076,7 @@ hash_ent_remove (ifp, hp, used, head, entp, dead_p) } int -net_add_q_info (rcv_port) - ipc_port_t rcv_port; +net_add_q_info(ipc_port_t rcv_port) { mach_port_msgcount_t qlimit = 0; @@ -2133,8 +2101,7 @@ net_add_q_info (rcv_port) } void -net_del_q_info (qlimit) - int qlimit; +net_del_q_info(int qlimit) { simple_lock(&net_kmsg_total_lock); net_queue_free_min--; @@ -2151,10 +2118,9 @@ net_del_q_info (qlimit) * No locks should be held when called. */ void -net_free_dead_infp (dead_infp) - queue_entry_t dead_infp; +net_free_dead_infp(queue_entry_t dead_infp) { - register net_rcv_port_t infp, nextfp; + net_rcv_port_t infp, nextfp; for (infp = (net_rcv_port_t) dead_infp; infp != 0; infp = nextfp) { @@ -2173,10 +2139,9 @@ net_free_dead_infp (dead_infp) * No locks should be held when called. */ void -net_free_dead_entp (dead_entp) - queue_entry_t dead_entp; +net_free_dead_entp(queue_entry_t dead_entp) { - register net_hash_entry_t entp, nextentp; + net_hash_entry_t entp, nextentp; for (entp = (net_hash_entry_t)dead_entp; entp != 0; entp = nextentp) { |