Date: Wed, 8 Jul 2009 15:02:57 +0000 (UTC) From: Rui Paulo <rpaulo@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r195457 - projects/mesh11s/sys/net80211 Message-ID: <200907081502.n68F2vaq054612@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: rpaulo Date: Wed Jul 8 15:02:56 2009 New Revision: 195457 URL: http://svn.freebsd.org/changeset/base/195457 Log: Implement setter/getter for protocol ioctls. Sponsored by: The FreeBSD Foundation Modified: projects/mesh11s/sys/net80211/ieee80211_mesh.c projects/mesh11s/sys/net80211/ieee80211_mesh.h Modified: projects/mesh11s/sys/net80211/ieee80211_mesh.c ============================================================================== --- projects/mesh11s/sys/net80211/ieee80211_mesh.c Wed Jul 8 14:52:31 2009 (r195456) +++ projects/mesh11s/sys/net80211/ieee80211_mesh.c Wed Jul 8 15:02:56 2009 (r195457) @@ -98,6 +98,9 @@ static const int ieee80211_mesh_maxretri #define IEEE80211_MESH_DEFAULT_TTL 31 +static const uint8_t broadcastaddr[IEEE80211_ADDR_LEN] = + { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; + static ieee80211_recv_action_func mesh_recv_action_meshpeering_open; static ieee80211_recv_action_func mesh_recv_action_meshpeering_confirm; static ieee80211_recv_action_func mesh_recv_action_meshpeering_close; @@ -151,8 +154,6 @@ ieee80211_mesh_rt_add(struct ieee80211va { struct ieee80211_mesh_state *ms = vap->iv_mesh; struct ieee80211_mesh_route *rt; - static const uint8_t broadcastaddr[IEEE80211_ADDR_LEN] = - { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; KASSERT(ieee80211_mesh_rt_find(vap, dest) == NULL, ("%s: duplicate entry in the routing table", __func__)); @@ -275,8 +276,6 @@ mesh_select_proto_metric(struct ieee8021 for (i = 0; i < N(mesh_proto_metrics); i++) { if (strcmp(mesh_proto_metrics[i].mpm_descr, name) == 0) { ms->ms_pmetric = &mesh_proto_metrics[i]; - if (vap->iv_state == IEEE80211_S_RUN) - vap->iv_newstate(vap, IEEE80211_S_INIT, 0); return 0; } } @@ -2453,6 +2452,22 @@ mesh_ioctl_get80211(struct ieee80211vap return ENOSYS; } break; + case IEEE80211_IOC_MESH_PR_METRIC: + len = strlen(ms->ms_pmetric->mpm_descr); + if (ireq->i_len < len) + return EINVAL; + ireq->i_len = len; + error = copyout(ms->ms_pmetric->mpm_descr, + (uint8_t *)ireq->i_data, len); + break; + case IEEE80211_IOC_MESH_PR_PATH: + len = strlen(ms->ms_ppath->mpp_descr); + if (ireq->i_len < len) + return EINVAL; + ireq->i_len = len; + error = copyout(ms->ms_ppath->mpp_descr, + (uint8_t *)ireq->i_data, len); + break; default: return ENOSYS; } @@ -2465,8 +2480,10 @@ static int mesh_ioctl_set80211(struct ieee80211vap *vap, struct ieee80211req *ireq) { struct ieee80211_mesh_state *ms = vap->iv_mesh; - int error; uint8_t tmpmeshid[IEEE80211_NWID_LEN]; + uint8_t tmpaddr[IEEE80211_ADDR_LEN]; + char tmpproto[IEEE80211_MESH_PROTO_DSZ]; + int error; if (vap->iv_opmode != IEEE80211_M_MBSS) return ENOSYS; @@ -2506,9 +2523,13 @@ mesh_ioctl_set80211(struct ieee80211vap ieee80211_mesh_rt_flush(vap); break; case IEEE80211_MESH_RTCMD_ADD: - if (IEEE80211_ADDR_EQ(vap->iv_myaddr, ireq->i_data)) + if (IEEE80211_ADDR_EQ(vap->iv_myaddr, ireq->i_data) || + IEEE80211_ADDR_EQ(broadcastaddr, ireq->i_data)) return EINVAL; - ieee80211_mesh_rt_add(vap, ireq->i_data); + error = copyin(ireq->i_data, &tmpaddr, + IEEE80211_ADDR_LEN); + if (!error) + ieee80211_mesh_discover(vap, tmpaddr, NULL); break; case IEEE80211_MESH_RTCMD_DELETE: ieee80211_mesh_rt_del(vap, ireq->i_data); @@ -2517,6 +2538,16 @@ mesh_ioctl_set80211(struct ieee80211vap return ENOSYS; } break; + case IEEE80211_IOC_MESH_PR_METRIC: + error = copyin(ireq->i_data, tmpproto, sizeof(tmpproto)); + if (!error) + return mesh_select_proto_metric(vap, tmpproto); + break; + case IEEE80211_IOC_MESH_PR_PATH: + error = copyin(ireq->i_data, tmpproto, sizeof(tmpproto)); + if (!error) + return mesh_select_proto_path(vap, tmpproto); + break; default: return ENOSYS; } Modified: projects/mesh11s/sys/net80211/ieee80211_mesh.h ============================================================================== --- projects/mesh11s/sys/net80211/ieee80211_mesh.h Wed Jul 8 14:52:31 2009 (r195456) +++ projects/mesh11s/sys/net80211/ieee80211_mesh.h Wed Jul 8 15:02:56 2009 (r195457) @@ -393,12 +393,13 @@ struct ieee80211_mesh_route { }; #define IEEE80211_MESH_ROUTE_PRIV(rt, cast) (cast *)rt->rt_priv +#define IEEE80211_MESH_PROTO_DSZ 12 /* description size */ /* * Mesh Path Selection Protocol. */ enum ieee80211_state; struct ieee80211_mesh_proto_path { - char mpp_descr[12]; + char mpp_descr[IEEE80211_MESH_PROTO_DSZ]; uint8_t mpp_ie[4]; struct ieee80211_node * (*mpp_discover)(struct ieee80211vap *, @@ -416,7 +417,7 @@ struct ieee80211_mesh_proto_path { * Mesh Link Metric Report Protocol. */ struct ieee80211_mesh_proto_metric { - char mpm_descr[12]; + char mpm_descr[IEEE80211_MESH_PROTO_DSZ]; uint8_t mpm_ie[4]; uint32_t (*mpm_metric)(struct ieee80211_node *); };
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200907081502.n68F2vaq054612>