Return-path: Received: from fg-out-1718.google.com ([72.14.220.158]:31800 "EHLO fg-out-1718.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751703AbZA0Jda (ORCPT ); Tue, 27 Jan 2009 04:33:30 -0500 Received: by fg-out-1718.google.com with SMTP id 13so61344fge.17 for ; Tue, 27 Jan 2009 01:33:28 -0800 (PST) MIME-Version: 1.0 In-Reply-To: References: <497E1B90.4060803@cosetrain.com> Date: Tue, 27 Jan 2009 11:33:28 +0200 Message-ID: (sfid-20090127_103336_350917_8250A818) Subject: Re: [PATCH 1/6] mac80211: Virtualize mesh path selection ops From: Rami Rosen To: Florian Sesser Cc: linux-wireless@vger.kernel.org Content-Type: text/plain; charset=ISO-8859-1 Sender: linux-wireless-owner@vger.kernel.org List-ID: Hello, A little comment: Maybe it is better to omit from the patch the remark : /* From mesh_hwmp.c: */ (which appears twice) and add to the changelog an item like this: -Moved mpath_frame_type enum definition and max_preq_retries() macro definition from mesh_hwmp.c to mesh.h. Regards, Rami Rosen On Mon, Jan 26, 2009 at 10:39 PM, Florian Sesser wrote: > Struct mesh_path_sel_ops, central to the abstraction > of the Path Selection Protocol. > > Signed-off-by: Florian Sesser > --- > net/mac80211/mesh.h | 78 +++++++++++++++++++++++++++++++++++++++++++++++++-- > 1 files changed, 75 insertions(+), 3 deletions(-) > > diff --git a/net/mac80211/mesh.h b/net/mac80211/mesh.h > index 9e064ee..a4141d8 100644 > --- a/net/mac80211/mesh.h > +++ b/net/mac80211/mesh.h > @@ -169,6 +169,72 @@ struct mesh_rmc { > */ > #define MESH_PREQ_MIN_INT 10 > #define MESH_DIAM_TRAVERSAL_TIME 50 > + > +/* Default Path Selection, Path Metric, Congestion Control Mode */ > +#define MESH_PATH_SELECTION_PROTOCOL_ID 0x000FACFF > +#define MESH_PATH_SELECTION_METRIC_ID 0x000FACFF > +#define MESH_CONGESTION_CONTROL_MODE_ID 0x000FACFF > + > +/* From mesh_hwmp.c: */ > +enum mpath_frame_type { > + MPATH_PREQ = 0, > + MPATH_PREP, > + MPATH_PERR > +}; > +/* Function pointer typedefs for struct mesh_path_sel_ops */ > +typedef void (mesh_path_start_discovery_fn) (struct ieee80211_sub_if_data *sdata); > +typedef int (mesh_nexthop_lookup_fn) (struct sk_buff *skb, struct ieee80211_sub_if_data *sdata); > +typedef void (mesh_queue_preq_fn) (struct mesh_path *mpath, u8 flags); > +typedef int (mesh_path_sel_frame_tx_fn) (enum mpath_frame_type action, u8 flags, > + u8 *orig_addr, __le32 orig_dsn, u8 dst_flags, u8 *dst, __le32 dst_dsn, u8 *da, > + u8 hop_count, u8 ttl, __le32 lifetime, __le32 metric, __le32 preq_id, > + struct ieee80211_sub_if_data *sdata); > +typedef int (mesh_path_error_tx_fn) (u8 *dst, __le32 dst_dsn, u8 *ra, > + struct ieee80211_sub_if_data *sdata); > +typedef void (mesh_path_timer_fn) (unsigned long data); > +typedef u32 (mesh_route_info_get_fn) (struct ieee80211_sub_if_data *sdata, > + struct ieee80211_mgmt *mgmt, u8 *ie); > +typedef void (mesh_rx_path_sel_frame_fn) (struct ieee80211_sub_if_data *sdata, > + struct ieee80211_mgmt *mgmt, size_t len); > +typedef void (mesh_preq_frame_process_fn) (struct ieee80211_sub_if_data *sdata, > + struct ieee80211_mgmt *mgmt, u8 *preq_elem, u32 metric); > +typedef void (mesh_prep_frame_process_fn) (struct ieee80211_sub_if_data *sdata, > + struct ieee80211_mgmt *mgmt, u8 *prep_elem, u32 metric); > +typedef void (mesh_perr_frame_process_fn) (struct ieee80211_sub_if_data *sdata, > + struct ieee80211_mgmt *mgmt, u8 *perr_elem); > +typedef void (mesh_path_sel_start_fn) (struct ieee80211_if_mesh *sta); > +typedef void (mesh_path_sel_stop_fn) (struct ieee80211_if_mesh *sta); > +struct mesh_path_sel_ops { > + mesh_path_start_discovery_fn *path_start_discovery_fn; > + mesh_nexthop_lookup_fn *nexthop_lookup_fn; > + /* Needed by mesh_path_timer from mesh_pathtbl.c */ > + mesh_queue_preq_fn *queue_preq_fn; > + /* To my surprise this seems to not be needed: > + mesh_path_sel_frame_tx_fn *path_sel_frame_tx_fn; */ > + mesh_path_error_tx_fn *path_error_tx_fn; > + /* Doesn't this timer belong into mesh.c? */ > + mesh_path_timer_fn *path_timer_fn; > + mesh_rx_path_sel_frame_fn *rx_path_sel_frame_fn; > + /* Belongs into the mesh routing protocol module > + mesh_preq_frame_process_fn *preq_frame_process_fn; > + mesh_prep_frame_process_fn *prep_frame_process_fn; > + mesh_perr_frame_process_fn *perr_frame_process_fn; */ > + mesh_path_sel_start_fn *path_sel_start_fn; > + mesh_path_sel_stop_fn *path_sel_stop_fn; > +}; > + > +#define MESH_ALGO_NAME_MAX (16) > +struct mesh_path_sel_algo { > + struct list_head list; > + char name[MESH_ALGO_NAME_MAX]; > + u32 id; > + struct mesh_path_sel_ops* ops; > + struct module* owner; > +}; > + > +void mesh_path_sel_algo_register (struct mesh_path_sel_algo *algo); > +void mesh_path_sel_algo_unregister (struct mesh_path_sel_algo *algo); > + > /* Paths will be refreshed if they are closer than PATH_REFRESH_TIME to their > * expiration > */ > @@ -205,6 +271,9 @@ int mesh_rmc_check(u8 *addr, struct ieee80211s_hdr *mesh_hdr, > bool mesh_matches_local(struct ieee802_11_elems *ie, > struct ieee80211_sub_if_data *sdata); > void mesh_ids_set_default(struct ieee80211_if_mesh *mesh); > +void mesh_ids_set_pp(struct ieee80211_if_mesh *sta, u32 pp); > +void mesh_ids_set_pm(struct ieee80211_if_mesh *sta, u32 pm); > +void mesh_ids_set_cc(struct ieee80211_if_mesh *sta, u32 cc); > void mesh_mgmt_ies_add(struct sk_buff *skb, > struct ieee80211_sub_if_data *sdata); > void mesh_rmc_free(struct ieee80211_sub_if_data *sdata); > @@ -219,9 +288,9 @@ void ieee80211_start_mesh(struct ieee80211_sub_if_data *sdata); > void ieee80211_stop_mesh(struct ieee80211_sub_if_data *sdata); > > /* Mesh paths */ > -int mesh_nexthop_lookup(struct sk_buff *skb, > - struct ieee80211_sub_if_data *sdata); > -void mesh_path_start_discovery(struct ieee80211_sub_if_data *sdata); > +struct mesh_path_sel_algo* mesh_path_sel_algo_find_by_name (const char* name); > +struct mesh_path_sel_algo* mesh_path_sel_algo_find_by_id (u32 id); > +void mesh_path_sel_algo_set (struct ieee80211_if_mesh *sta, struct mesh_path_sel_algo* algo); > struct mesh_path *mesh_path_lookup(u8 *dst, > struct ieee80211_sub_if_data *sdata); > struct mesh_path *mpp_path_lookup(u8 *dst, > @@ -293,6 +362,9 @@ static inline void mesh_path_activate(struct mesh_path *mpath) > for (i = 0; i <= x->hash_mask; i++) \ > hlist_for_each_entry_rcu(node, p, &x->hash_buckets[i], list) > > +/* Moved here from mesh_hwmp.c */ > +#define max_preq_retries(s) (s->u.mesh.mshcfg.dot11MeshHWMPmaxPREQretries) > + > void ieee80211_mesh_notify_scan_completed(struct ieee80211_local *local); > > #else > -- > 1.5.6.5 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-wireless" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html >