From owner-svn-src-projects@FreeBSD.ORG Wed Jun 24 17:16:14 2009 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 472C3106566C; Wed, 24 Jun 2009 17:16:14 +0000 (UTC) (envelope-from rpaulo@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 34C5B8FC1A; Wed, 24 Jun 2009 17:16:14 +0000 (UTC) (envelope-from rpaulo@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n5OHGDbJ021690; Wed, 24 Jun 2009 17:16:13 GMT (envelope-from rpaulo@svn.freebsd.org) Received: (from rpaulo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n5OHGDBb021688; Wed, 24 Jun 2009 17:16:13 GMT (envelope-from rpaulo@svn.freebsd.org) Message-Id: <200906241716.n5OHGDBb021688@svn.freebsd.org> From: Rui Paulo Date: Wed, 24 Jun 2009 17:16:13 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r194862 - projects/mesh11s/sys/net80211 X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 24 Jun 2009 17:16:14 -0000 Author: rpaulo Date: Wed Jun 24 17:16:13 2009 New Revision: 194862 URL: http://svn.freebsd.org/changeset/base/194862 Log: Add functions to manipulate the HWMP routing table and use them. Sponsored by: The FreeBSD Foundation Modified: projects/mesh11s/sys/net80211/ieee80211_hwmp.c Modified: projects/mesh11s/sys/net80211/ieee80211_hwmp.c ============================================================================== --- projects/mesh11s/sys/net80211/ieee80211_hwmp.c Wed Jun 24 17:03:06 2009 (r194861) +++ projects/mesh11s/sys/net80211/ieee80211_hwmp.c Wed Jun 24 17:16:13 2009 (r194862) @@ -63,9 +63,16 @@ __FBSDID("$FreeBSD$"); #include #include +static struct ieee80211_hwmp_fi * + hwmp_rt_find(struct ieee80211vap *, + const uint8_t [IEEE80211_ADDR_LEN]); +static struct ieee80211_hwmp_fi * + hwmp_rt_add(struct ieee80211vap *, + const uint8_t [IEEE80211_ADDR_LEN]); +static void hwmp_rt_flush(struct ieee80211vap *); static int ieee80211_hwmp_send_action(struct ieee80211_node *, - const uint8_t [IEEE80211_ADDR_LEN], const uint8_t [IEEE80211_ADDR_LEN], - uint8_t *, size_t); + const uint8_t [IEEE80211_ADDR_LEN], const uint8_t [IEEE80211_ADDR_LEN], + uint8_t *, size_t); static uint8_t *hwmp_add_meshpreq(uint8_t *, const struct ieee80211_meshpreq_ie *); static uint8_t *hwmp_add_meshprep(uint8_t *, @@ -145,6 +152,62 @@ MALLOC_DEFINE(M_80211_HWMP, "80211hwmp", extern int ieee80211_mesh_ttl; +/* + * Helper functions to manipulate the HWMP routing table. + */ +static struct ieee80211_hwmp_fi * +hwmp_rt_find(struct ieee80211vap *vap, const uint8_t dest[IEEE80211_ADDR_LEN]) +{ + struct ieee80211_hwmp_state *hs = vap->iv_hwmp; + struct ieee80211_hwmp_fi *fi; + + HWMP_LOCK(hs); + TAILQ_FOREACH(fi, &hs->hs_head, fi_next) { + if (IEEE80211_ADDR_EQ(dest, fi->fi_dest)) { + HWMP_UNLOCK(hs); + return fi; + } + } + HWMP_UNLOCK(hs); + return NULL; +} + +static struct ieee80211_hwmp_fi * +hwmp_rt_add(struct ieee80211vap *vap, const uint8_t dest[IEEE80211_ADDR_LEN]) +{ + struct ieee80211_hwmp_state *hs = vap->iv_hwmp; + struct ieee80211_hwmp_fi *fi; + + KASSERT(hwmp_rt_find(vap, dest) == NULL, + ("%s: duplicate entry in the routing table", __func__)); + + fi = malloc(sizeof(struct ieee80211_hwmp_fi), M_80211_HWMP, + M_NOWAIT | M_ZERO); + memset(fi, 0, sizeof(*fi)); + IEEE80211_ADDR_COPY(fi->fi_dest, dest); + HWMP_LOCK(hs); + TAILQ_INSERT_TAIL(&hs->hs_head, fi, fi_next); + HWMP_UNLOCK(hs); + + return fi; +} + +static void +hwmp_rt_flush(struct ieee80211vap *vap) +{ + struct ieee80211_hwmp_state *hs = vap->iv_hwmp; + struct ieee80211_hwmp_fi *fi, *next; + + if (hs == NULL) + return; + HWMP_LOCK(hs); + TAILQ_FOREACH_SAFE(fi, &hs->hs_head, fi_next, next) { + TAILQ_REMOVE(&hs->hs_head, fi, fi_next); + free(fi, M_80211_HWMP); + } + HWMP_UNLOCK(hs); +} + void ieee80211_hwmp_vattach(struct ieee80211vap *vap) { @@ -168,12 +231,8 @@ void ieee80211_hwmp_vdetach(struct ieee80211vap *vap) { struct ieee80211_hwmp_state *hs = vap->iv_hwmp; - struct ieee80211_hwmp_fi *fi, *next; - TAILQ_FOREACH_SAFE(fi, &hs->hs_head, fi_next, next) { - TAILQ_REMOVE(&hs->hs_head, fi, fi_next); - free(fi, M_80211_HWMP); - } + hwmp_rt_flush(vap); mtx_destroy(&hs->hs_lock); free(vap->iv_hwmp, M_80211_HWMP); } @@ -182,22 +241,12 @@ int ieee80211_hwmp_newstate(struct ieee80211vap *vap, enum ieee80211_state ostate, int arg) { enum ieee80211_state nstate = vap->iv_state; - struct ieee80211_hwmp_state *hs = vap->iv_hwmp; - struct ieee80211_hwmp_fi *fi, *next; switch (nstate) { case IEEE80211_S_SCAN: switch (ostate) { case IEEE80211_S_INIT: - /* - * Flush the HWMP routing table - */ - if (hs == NULL) - return 0; - TAILQ_FOREACH_SAFE(fi, &hs->hs_head, fi_next, next) { - TAILQ_REMOVE(&hs->hs_head, fi, fi_next); - free(fi, M_80211_HWMP); - } + hwmp_rt_flush(vap); break; default: break; @@ -537,27 +586,16 @@ hwmp_recv_preq(struct ieee80211vap *vap, return; } - HWMP_LOCK(hs); - TAILQ_FOREACH(fi, &hs->hs_head, fi_next) { - if (IEEE80211_ADDR_EQ(PREQ_TADDR(0), fi->fi_dest)) - break; - } - HWMP_UNLOCK(hs); + fi = hwmp_rt_find(vap, PREQ_TADDR(0)); #if 0 /* * Record the PREQ ID and the originator MAC address. */ if (fi == NULL) { - fi = malloc(sizeof(struct ieee80211_hwmp_fi), M_80211_HWMP, - M_NOWAIT | M_ZERO); - memset(fi, 0, sizeof(*fi)); - IEEE80211_ADDR_COPY(fi->fi_dest, PREQ_TADDR(0)); + fi = hwmp_rt_add(vap, PREQ_TADDR(0)); fi->fi_seq = preq->preq_origseq; fi->fi_metric = preq->preq_metric; fi->fi_lifetime = preq->preq_lifetime; - HWMP_LOCK(hs); - TAILQ_INSERT_TAIL(&hs->hs_head, fi, fi_next); - HWMP_UNLOCK(hs); } fi->fi_preqid = preq->preq_id; #endif @@ -729,7 +767,6 @@ static void hwmp_recv_prep(struct ieee80211vap *vap, struct ieee80211_node *ni, const struct ieee80211_frame *wh, const struct ieee80211_meshprep_ie *prep) { - struct ieee80211_hwmp_state *hs = vap->iv_hwmp; struct ieee80211_hwmp_fi *fi = NULL; /* @@ -743,12 +780,7 @@ hwmp_recv_prep(struct ieee80211vap *vap, IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, "received PREP from %s", ether_sprintf(prep->prep_origaddr)); - HWMP_LOCK(hs); - TAILQ_FOREACH(fi, &hs->hs_head, fi_next) { - if (IEEE80211_ADDR_EQ(prep->prep_origaddr, fi->fi_dest)) - break; - } - HWMP_UNLOCK(hs); + fi = hwmp_rt_find(vap, prep->prep_origaddr); /* * If it's NOT for us, propagate the PREP if TTL is @@ -834,7 +866,6 @@ static void hwmp_recv_perr(struct ieee80211vap *vap, struct ieee80211_node *ni, const struct ieee80211_frame *wh, const struct ieee80211_meshperr_ie *perr) { - struct ieee80211_hwmp_state *hs = vap->iv_hwmp; struct ieee80211_hwmp_fi *fi = NULL; /* struct ieee80211_meshperr_ie pperr;*/ @@ -847,12 +878,7 @@ hwmp_recv_perr(struct ieee80211vap *vap, !(vap->iv_meshflags & IEEE80211_MFLAGS_FWRD)) return; - HWMP_LOCK(hs); - TAILQ_FOREACH(fi, &hs->hs_head, fi_next) { - if (IEEE80211_ADDR_EQ(PERR_DADDR(0), fi->fi_dest)) - break; - } - HWMP_UNLOCK(hs); + fi = hwmp_rt_find(vap, PERR_DADDR(0)); if (fi == NULL) return; @@ -901,13 +927,10 @@ hwmp_recv_rann(struct ieee80211vap *vap, /* * Acceptance criteria: check the HWMP sequence number * and the path metric is better than what we have. + * XXX: TBD */ - HWMP_LOCK(hs); - TAILQ_FOREACH(fi, &hs->hs_head, fi_next) { - if (IEEE80211_ADDR_EQ(rann->rann_addr, fi->fi_dest)) - break; - } - HWMP_UNLOCK(hs); + + fi = hwmp_rt_find(vap, rann->rann_addr); if (fi == NULL) { struct ieee80211_meshpreq_ie preq; @@ -985,30 +1008,17 @@ ieee80211_hwmp_discover(struct ieee80211 if (IEEE80211_IS_MULTICAST(dest)) return ieee80211_find_txnode(vap, dest); - HWMP_LOCK(hs); - TAILQ_FOREACH(fi, &hs->hs_head, fi_next) { - if (IEEE80211_ADDR_EQ(fi->fi_dest, dest)) { - if (IEEE80211_ADDR_EQ(fi->fi_nexthop, invalidaddr)) { - /* XXX check preq retries */ - sendpreq = 1; - unknowndst = 1; - } - break; - } - } - HWMP_UNLOCK(hs); - + fi = hwmp_rt_find(vap, dest); if (fi == NULL) { - fi = malloc(sizeof(struct ieee80211_hwmp_fi), M_80211_HWMP, - M_NOWAIT | M_ZERO); - IEEE80211_ADDR_COPY(fi->fi_dest, dest); + fi = hwmp_rt_add(vap, dest); fi->fi_seq = ++hs->hs_seq; fi->fi_preqid = ++hs->hs_preqid; fi->fi_metric = IEEE80211_MESHLMETRIC_INITIALVAL; fi->fi_lifetime = timeval2msecs(ieee80211_hwmp_pathtimeout); - HWMP_LOCK(hs); - TAILQ_INSERT_TAIL(&hs->hs_head, fi, fi_next); - HWMP_UNLOCK(hs); + sendpreq = 1; + unknowndst = 1; + } else if (IEEE80211_ADDR_EQ(fi->fi_nexthop, invalidaddr)) { + /* XXX check preq retries */ sendpreq = 1; unknowndst = 1; } @@ -1062,15 +1072,9 @@ struct ieee80211_node * ieee80211_hwmp_find_txnode(struct ieee80211vap *vap, uint8_t dest[IEEE80211_ADDR_LEN]) { - struct ieee80211_hwmp_state *hs = vap->iv_hwmp; struct ieee80211_hwmp_fi *fi; - HWMP_LOCK(hs); - TAILQ_FOREACH(fi, &hs->hs_head, fi_next) { - if (IEEE80211_ADDR_EQ(fi->fi_dest, dest)) - break; - } - HWMP_UNLOCK(hs); + fi = hwmp_rt_find(vap, dest); if (fi == NULL) return NULL; return ieee80211_find_txnode(vap, fi->fi_nexthop); @@ -1142,12 +1146,7 @@ hwmp_ioctl_set80211(struct ieee80211vap case IEEE80211_HWMP_CMD_LIST: return EINVAL; case IEEE80211_HWMP_CMD_FLUSH: - HWMP_LOCK(hs); - TAILQ_FOREACH_SAFE(fi, &hs->hs_head, fi_next, next) { - TAILQ_REMOVE(&hs->hs_head, fi, fi_next); - free(fi, M_80211_HWMP); - } - HWMP_UNLOCK(hs); + hwmp_rt_flush(vap); break; case IEEE80211_HWMP_CMD_ADD: HWMP_LOCK(hs);