Linux Headquarters
[ Register ]
[ About us ] [ Home Page ]

Advertisement
[ Kernel ] [ Documentation ] [ Links ] [ Books ]

Advertisement

Kernel v2.6.25-rc7 /net/sctp/bind_addr.c

Filename:/net/sctp/bind_addr.c
Lines Added:38
Lines Deleted:9
Also changed in: (Previous) 2.6.25-rc6  2.6.25-rc5-git7  2.6.25-rc5-git6  2.6.25-rc5-git5  2.6.25-rc5-git4  2.6.25-rc5-git3 
(Following) 2.6.25-rc8  2.6.25-rc9  2.6.25  2.6.25-git2  2.6.25-git3  2.6.25-git4 

Location
[  2.6.25-rc7
  [  net
    [  sctp
       o  bind_addr.c

Patch

diff --git a/net/sctp/bind_addr.c b/net/sctp/bind_addr.c
index 6a7d010..ceefda0 100644
--- a/net/sctp/bind_addr.c
+++ b/net/sctp/bind_addr.c
@@ -1,20 +1,20 @@
-/* SCTP kernel reference Implementation
+/* SCTP kernel implementation
  * (C) Copyright IBM Corp. 2001, 2003
  * Copyright (c) Cisco 1999,2000
  * Copyright (c) Motorola 1999,2000,2001
  * Copyright (c) La Monte H.P. Yarroll 2001
  *
- * This file is part of the SCTP kernel reference implementation.
+ * This file is part of the SCTP kernel implementation.
  *
  * A collection class to handle the storage of transport addresses.
  *
- * The SCTP reference implementation is free software;
+ * This SCTP implementation is free software;
  * you can redistribute it and/or modify it under the terms of
  * the GNU General Public License as published by
  * the Free Software Foundation; either version 2, or (at your option)
  * any later version.
  *
- * The SCTP reference implementation is distributed in the hope that it
+ * This SCTP implementation is distributed in the hope that it
  * will be useful, but WITHOUT ANY WARRANTY; without even the implied
  *                 ************************
  * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
@@ -171,7 +171,7 @@ void sctp_bind_addr_free(struct sctp_bind_addr *bp)
 
 /* Add an address to the bind address list in the SCTP_bind_addr structure. */
 int sctp_add_bind_addr(struct sctp_bind_addr *bp, union sctp_addr *new,
-             __u8 use_as_src, gfp_t gfp)
+             __u8 addr_state, gfp_t gfp)
 {
    struct sctp_sockaddr_entry *addr;
 
@@ -188,7 +188,7 @@ int sctp_add_bind_addr(struct sctp_bind_addr *bp, union sctp_addr *new,
    if (!addr->a.v4.sin_port)
       addr->a.v4.sin_port = htons(bp->port);
 
-   addr->use_as_src = use_as_src;
+   addr->state = addr_state;
    addr->valid = 1;
 
    INIT_LIST_HEAD(&addr->list);
@@ -209,6 +209,7 @@ int sctp_add_bind_addr(struct sctp_bind_addr *bp, union sctp_addr *new,
 int sctp_del_bind_addr(struct sctp_bind_addr *bp, union sctp_addr *del_addr)
 {
    struct sctp_sockaddr_entry *addr, *temp;
+   int found = 0;
 
    /* We hold the socket lock when calling this function,
     * and that acts as a writer synchronizing lock.
@@ -216,13 +217,14 @@ int sctp_del_bind_addr(struct sctp_bind_addr *bp, union sctp_addr *del_addr)
    list_for_each_entry_safe(addr, temp, &bp->address_list, list) {
       if (sctp_cmp_addr_exact(&addr->a, del_addr)) {
          /* Found the exact match. */
+         found = 1;
          addr->valid = 0;
          list_del_rcu(&addr->list);
          break;
       }
    }
 
-   if (addr && !addr->valid) {
+   if (found) {
       call_rcu(&addr->rcu, sctp_local_addr_free);
       SCTP_DBG_OBJCNT_DEC(addr);
       return 0;
@@ -312,7 +314,7 @@ int sctp_raw_to_bind_addrs(struct sctp_bind_addr *bp, __u8 *raw_addr_list,
       }
 
       af->from_addr_param(&addr, rawaddr, htons(port), 0);
-      retval = sctp_add_bind_addr(bp, &addr, 1, gfp);
+      retval = sctp_add_bind_addr(bp, &addr, SCTP_ADDR_SRC, gfp);
       if (retval) {
          /* Can't finish building the list, clean up. */
          sctp_bind_addr_clean(bp);
@@ -353,6 +355,32 @@ int sctp_bind_addr_match(struct sctp_bind_addr *bp,
    return match;
 }
 
+/* Get the state of the entry in the bind_addr_list */
+int sctp_bind_addr_state(const struct sctp_bind_addr *bp,
+          const union sctp_addr *addr)
+{
+   struct sctp_sockaddr_entry *laddr;
+   struct sctp_af *af;
+   int state = -1;
+
+   af = sctp_get_af_specific(addr->sa.sa_family);
+   if (unlikely(!af))
+      return state;
+
+   rcu_read_lock();
+   list_for_each_entry_rcu(laddr, &bp->address_list, list) {
+      if (!laddr->valid)
+         continue;
+      if (af->cmp_addr(&laddr->a, addr)) {
+         state = laddr->state;
+         break;
+      }
+   }
+   rcu_read_unlock();
+
+   return state;
+}
+
 /* Find the first address in the bind address list that is not present in
  * the addrs packed array.
  */
@@ -411,7 +439,8 @@ static int sctp_copy_one_addr(struct sctp_bind_addr *dest,
           (((AF_INET6 == addr->sa.sa_family) &&
             (flags & SCTP_ADDR6_ALLOWED) &&
             (flags & SCTP_ADDR6_PEERSUPP))))
-         error = sctp_add_bind_addr(dest, addr, 1, gfp);
+         error = sctp_add_bind_addr(dest, addr, SCTP_ADDR_SRC,
+                      gfp);
    }
 
    return error;


Comments: webmaster (at) linuxhq.com.
Advertising: banners (at) linuxhq.com.
Compilation ©1998-2008 Linux Headquarters, Inc.