diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
commit | 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (patch) | |
tree | 0bba044c4ce775e45a88a51686b5d9f90697ea9d /net/sctp/ssnmap.c |
Linux-2.6.12-rc2v2.6.12-rc2
Initial git repository build. I'm not bothering with the full history,
even though we have it. We can create a separate "historical" git
archive of that later if we want to, and in the meantime it's about
3.2GB when imported into git - space that would just make the early
git days unnecessarily complicated, when we don't have a lot of good
infrastructure for it.
Let it rip!
Diffstat (limited to 'net/sctp/ssnmap.c')
-rw-r--r-- | net/sctp/ssnmap.c | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/net/sctp/ssnmap.c b/net/sctp/ssnmap.c new file mode 100644 index 000000000000..e627d2b451b6 --- /dev/null +++ b/net/sctp/ssnmap.c | |||
@@ -0,0 +1,131 @@ | |||
1 | /* SCTP kernel reference Implementation | ||
2 | * Copyright (c) 2003 International Business Machines, Corp. | ||
3 | * | ||
4 | * This file is part of the SCTP kernel reference Implementation | ||
5 | * | ||
6 | * These functions manipulate sctp SSN tracker. | ||
7 | * | ||
8 | * The SCTP reference implementation is free software; | ||
9 | * you can redistribute it and/or modify it under the terms of | ||
10 | * the GNU General Public License as published by | ||
11 | * the Free Software Foundation; either version 2, or (at your option) | ||
12 | * any later version. | ||
13 | * | ||
14 | * The SCTP reference implementation is distributed in the hope that it | ||
15 | * will be useful, but WITHOUT ANY WARRANTY; without even the implied | ||
16 | * ************************ | ||
17 | * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||
18 | * See the GNU General Public License for more details. | ||
19 | * | ||
20 | * You should have received a copy of the GNU General Public License | ||
21 | * along with GNU CC; see the file COPYING. If not, write to | ||
22 | * the Free Software Foundation, 59 Temple Place - Suite 330, | ||
23 | * Boston, MA 02111-1307, USA. | ||
24 | * | ||
25 | * Please send any bug reports or fixes you make to the | ||
26 | * email address(es): | ||
27 | * lksctp developers <lksctp-developers@lists.sourceforge.net> | ||
28 | * | ||
29 | * Or submit a bug report through the following website: | ||
30 | * http://www.sf.net/projects/lksctp | ||
31 | * | ||
32 | * Written or modified by: | ||
33 | * Jon Grimm <jgrimm@us.ibm.com> | ||
34 | * | ||
35 | * Any bugs reported given to us we will try to fix... any fixes shared will | ||
36 | * be incorporated into the next SCTP release. | ||
37 | */ | ||
38 | |||
39 | #include <linux/types.h> | ||
40 | #include <net/sctp/sctp.h> | ||
41 | #include <net/sctp/sm.h> | ||
42 | |||
43 | #define MAX_KMALLOC_SIZE 131072 | ||
44 | |||
45 | static struct sctp_ssnmap *sctp_ssnmap_init(struct sctp_ssnmap *map, __u16 in, | ||
46 | __u16 out); | ||
47 | |||
48 | /* Storage size needed for map includes 2 headers and then the | ||
49 | * specific needs of in or out streams. | ||
50 | */ | ||
51 | static inline size_t sctp_ssnmap_size(__u16 in, __u16 out) | ||
52 | { | ||
53 | return sizeof(struct sctp_ssnmap) + (in + out) * sizeof(__u16); | ||
54 | } | ||
55 | |||
56 | |||
57 | /* Create a new sctp_ssnmap. | ||
58 | * Allocate room to store at least 'len' contiguous TSNs. | ||
59 | */ | ||
60 | struct sctp_ssnmap *sctp_ssnmap_new(__u16 in, __u16 out, int gfp) | ||
61 | { | ||
62 | struct sctp_ssnmap *retval; | ||
63 | int size; | ||
64 | |||
65 | size = sctp_ssnmap_size(in, out); | ||
66 | if (size <= MAX_KMALLOC_SIZE) | ||
67 | retval = kmalloc(size, gfp); | ||
68 | else | ||
69 | retval = (struct sctp_ssnmap *) | ||
70 | __get_free_pages(gfp, get_order(size)); | ||
71 | if (!retval) | ||
72 | goto fail; | ||
73 | |||
74 | if (!sctp_ssnmap_init(retval, in, out)) | ||
75 | goto fail_map; | ||
76 | |||
77 | retval->malloced = 1; | ||
78 | SCTP_DBG_OBJCNT_INC(ssnmap); | ||
79 | |||
80 | return retval; | ||
81 | |||
82 | fail_map: | ||
83 | if (size <= MAX_KMALLOC_SIZE) | ||
84 | kfree(retval); | ||
85 | else | ||
86 | free_pages((unsigned long)retval, get_order(size)); | ||
87 | fail: | ||
88 | return NULL; | ||
89 | } | ||
90 | |||
91 | |||
92 | /* Initialize a block of memory as a ssnmap. */ | ||
93 | static struct sctp_ssnmap *sctp_ssnmap_init(struct sctp_ssnmap *map, __u16 in, | ||
94 | __u16 out) | ||
95 | { | ||
96 | memset(map, 0x00, sctp_ssnmap_size(in, out)); | ||
97 | |||
98 | /* Start 'in' stream just after the map header. */ | ||
99 | map->in.ssn = (__u16 *)&map[1]; | ||
100 | map->in.len = in; | ||
101 | |||
102 | /* Start 'out' stream just after 'in'. */ | ||
103 | map->out.ssn = &map->in.ssn[in]; | ||
104 | map->out.len = out; | ||
105 | |||
106 | return map; | ||
107 | } | ||
108 | |||
109 | /* Clear out the ssnmap streams. */ | ||
110 | void sctp_ssnmap_clear(struct sctp_ssnmap *map) | ||
111 | { | ||
112 | size_t size; | ||
113 | |||
114 | size = (map->in.len + map->out.len) * sizeof(__u16); | ||
115 | memset(map->in.ssn, 0x00, size); | ||
116 | } | ||
117 | |||
118 | /* Dispose of a ssnmap. */ | ||
119 | void sctp_ssnmap_free(struct sctp_ssnmap *map) | ||
120 | { | ||
121 | if (map && map->malloced) { | ||
122 | int size; | ||
123 | |||
124 | size = sctp_ssnmap_size(map->in.len, map->out.len); | ||
125 | if (size <= MAX_KMALLOC_SIZE) | ||
126 | kfree(map); | ||
127 | else | ||
128 | free_pages((unsigned long)map, get_order(size)); | ||
129 | SCTP_DBG_OBJCNT_DEC(ssnmap); | ||
130 | } | ||
131 | } | ||