diff options
author | Dmitry Torokhov <dtor@insightbb.com> | 2007-05-01 00:24:54 -0400 |
---|---|---|
committer | Dmitry Torokhov <dtor@insightbb.com> | 2007-05-01 00:24:54 -0400 |
commit | bc95f3669f5e6f63cf0b84fe4922c3c6dd4aa775 (patch) | |
tree | 427fcf2a7287c16d4b5aa6cbf494d59579a6a8b1 /net/ax25 | |
parent | 3d29cdff999c37b3876082278a8134a0642a02cd (diff) | |
parent | dc87c3985e9b442c60994308a96f887579addc39 (diff) |
Merge master.kernel.org:/pub/scm/linux/kernel/git/torvalds/linux-2.6
Conflicts:
drivers/usb/input/Makefile
drivers/usb/input/gtco.c
Diffstat (limited to 'net/ax25')
-rw-r--r-- | net/ax25/Kconfig | 61 | ||||
-rw-r--r-- | net/ax25/af_ax25.c | 113 | ||||
-rw-r--r-- | net/ax25/ax25_ds_subr.c | 2 | ||||
-rw-r--r-- | net/ax25/ax25_in.c | 24 | ||||
-rw-r--r-- | net/ax25/ax25_ip.c | 4 | ||||
-rw-r--r-- | net/ax25/ax25_out.c | 12 | ||||
-rw-r--r-- | net/ax25/ax25_subr.c | 4 |
7 files changed, 117 insertions, 103 deletions
diff --git a/net/ax25/Kconfig b/net/ax25/Kconfig index a8993a041724..43dd86fca4d3 100644 --- a/net/ax25/Kconfig +++ b/net/ax25/Kconfig | |||
@@ -1,30 +1,27 @@ | |||
1 | # | 1 | # |
2 | # Amateur Radio protocols and AX.25 device configuration | 2 | # Amateur Radio protocols and AX.25 device configuration |
3 | # | 3 | # |
4 | # 19971130 Now in an own category to make correct compilation of the | ||
5 | # AX.25 stuff easier... | ||
6 | # Joerg Reuter DL1BKE <jreuter@yaina.de> | ||
7 | # 19980129 Moved to net/ax25/Config.in, sourcing device drivers. | ||
8 | 4 | ||
9 | menuconfig HAMRADIO | 5 | menuconfig HAMRADIO |
10 | depends on NET | 6 | depends on NET |
11 | bool "Amateur Radio support" | 7 | bool "Amateur Radio support" |
12 | help | 8 | help |
13 | If you want to connect your Linux box to an amateur radio, answer Y | 9 | If you want to connect your Linux box to an amateur radio, answer Y |
14 | here. You want to read <http://www.tapr.org/tapr/html/pkthome.html> and | 10 | here. You want to read <http://www.tapr.org/tapr/html/pkthome.html> |
15 | the AX25-HOWTO, available from <http://www.tldp.org/docs.html#howto>. | 11 | and more specifically about AX.25 on Linux |
12 | <http://www.linux-ax25.org/>. | ||
16 | 13 | ||
17 | Note that the answer to this question won't directly affect the | 14 | Note that the answer to this question won't directly affect the |
18 | kernel: saying N will just cause the configurator to skip all | 15 | kernel: saying N will just cause the configurator to skip all |
19 | the questions about amateur radio. | 16 | the questions about amateur radio. |
20 | 17 | ||
21 | comment "Packet Radio protocols" | 18 | comment "Packet Radio protocols" |
22 | depends on HAMRADIO && NET | 19 | depends on HAMRADIO |
23 | 20 | ||
24 | config AX25 | 21 | config AX25 |
25 | tristate "Amateur Radio AX.25 Level 2 protocol" | 22 | tristate "Amateur Radio AX.25 Level 2 protocol" |
26 | depends on HAMRADIO && NET | 23 | depends on HAMRADIO |
27 | ---help--- | 24 | help |
28 | This is the protocol used for computer communication over amateur | 25 | This is the protocol used for computer communication over amateur |
29 | radio. It is either used by itself for point-to-point links, or to | 26 | radio. It is either used by itself for point-to-point links, or to |
30 | carry other protocols such as tcp/ip. To use it, you need a device | 27 | carry other protocols such as tcp/ip. To use it, you need a device |
@@ -52,6 +49,7 @@ config AX25 | |||
52 | 49 | ||
53 | config AX25_DAMA_SLAVE | 50 | config AX25_DAMA_SLAVE |
54 | bool "AX.25 DAMA Slave support" | 51 | bool "AX.25 DAMA Slave support" |
52 | default y | ||
55 | depends on AX25 | 53 | depends on AX25 |
56 | help | 54 | help |
57 | DAMA is a mechanism to prevent collisions when doing AX.25 | 55 | DAMA is a mechanism to prevent collisions when doing AX.25 |
@@ -59,23 +57,38 @@ config AX25_DAMA_SLAVE | |||
59 | from clients (called "slaves") and redistributes it to other slaves. | 57 | from clients (called "slaves") and redistributes it to other slaves. |
60 | If you say Y here, your Linux box will act as a DAMA slave; this is | 58 | If you say Y here, your Linux box will act as a DAMA slave; this is |
61 | transparent in that you don't have to do any special DAMA | 59 | transparent in that you don't have to do any special DAMA |
62 | configuration. (Linux cannot yet act as a DAMA server.) If unsure, | 60 | configuration. Linux cannot yet act as a DAMA server. This option |
63 | say N. | 61 | only compiles DAMA slave support into the kernel. It still needs to |
62 | be enabled at runtime. For more about DAMA see | ||
63 | <http://www.linux-ax25.org>. If unsure, say Y. | ||
64 | |||
65 | # placeholder until implemented | ||
66 | config AX25_DAMA_MASTER | ||
67 | bool 'AX.25 DAMA Master support' | ||
68 | depends on AX25_DAMA_SLAVE && BROKEN | ||
69 | help | ||
70 | DAMA is a mechanism to prevent collisions when doing AX.25 | ||
71 | networking. A DAMA server (called "master") accepts incoming traffic | ||
72 | from clients (called "slaves") and redistributes it to other slaves. | ||
73 | If you say Y here, your Linux box will act as a DAMA master; this is | ||
74 | transparent in that you don't have to do any special DAMA | ||
75 | configuration. Linux cannot yet act as a DAMA server. This option | ||
76 | only compiles DAMA slave support into the kernel. It still needs to | ||
77 | be explicitly enabled, so if unsure, say Y. | ||
64 | 78 | ||
65 | # bool ' AX.25 DAMA Master support' CONFIG_AX25_DAMA_MASTER | ||
66 | config NETROM | 79 | config NETROM |
67 | tristate "Amateur Radio NET/ROM protocol" | 80 | tristate "Amateur Radio NET/ROM protocol" |
68 | depends on AX25 | 81 | depends on AX25 |
69 | ---help--- | 82 | help |
70 | NET/ROM is a network layer protocol on top of AX.25 useful for | 83 | NET/ROM is a network layer protocol on top of AX.25 useful for |
71 | routing. | 84 | routing. |
72 | 85 | ||
73 | A comprehensive listing of all the software for Linux amateur radio | 86 | A comprehensive listing of all the software for Linux amateur radio |
74 | users as well as information about how to configure an AX.25 port is | 87 | users as well as information about how to configure an AX.25 port is |
75 | contained in the AX25-HOWTO, available from | 88 | contained in the Linux Ham Wiki, available from |
76 | <http://www.tldp.org/docs.html#howto>. You also might want to | 89 | <http://www.linux-ax25.org>. You also might want to check out the |
77 | check out the file <file:Documentation/networking/ax25.txt>. More | 90 | file <file:Documentation/networking/ax25.txt>. More information about |
78 | information about digital amateur radio in general is on the WWW at | 91 | digital amateur radio in general is on the WWW at |
79 | <http://www.tapr.org/tapr/html/pkthome.html>. | 92 | <http://www.tapr.org/tapr/html/pkthome.html>. |
80 | 93 | ||
81 | To compile this driver as a module, choose M here: the | 94 | To compile this driver as a module, choose M here: the |
@@ -84,27 +97,25 @@ config NETROM | |||
84 | config ROSE | 97 | config ROSE |
85 | tristate "Amateur Radio X.25 PLP (Rose)" | 98 | tristate "Amateur Radio X.25 PLP (Rose)" |
86 | depends on AX25 | 99 | depends on AX25 |
87 | ---help--- | 100 | help |
88 | The Packet Layer Protocol (PLP) is a way to route packets over X.25 | 101 | The Packet Layer Protocol (PLP) is a way to route packets over X.25 |
89 | connections in general and amateur radio AX.25 connections in | 102 | connections in general and amateur radio AX.25 connections in |
90 | particular, essentially an alternative to NET/ROM. | 103 | particular, essentially an alternative to NET/ROM. |
91 | 104 | ||
92 | A comprehensive listing of all the software for Linux amateur radio | 105 | A comprehensive listing of all the software for Linux amateur radio |
93 | users as well as information about how to configure an AX.25 port is | 106 | users as well as information about how to configure an AX.25 port is |
94 | contained in the AX25-HOWTO, available from | 107 | contained in the Linux Ham Wiki, available from |
95 | <http://www.tldp.org/docs.html#howto>. You also might want to | 108 | <http://www.linux-ax25.org>. You also might want to check out the |
96 | check out the file <file:Documentation/networking/ax25.txt>. More | 109 | file <file:Documentation/networking/ax25.txt>. More information about |
97 | information about digital amateur radio in general is on the WWW at | 110 | digital amateur radio in general is on the WWW at |
98 | <http://www.tapr.org/tapr/html/pkthome.html>. | 111 | <http://www.tapr.org/tapr/html/pkthome.html>. |
99 | 112 | ||
100 | To compile this driver as a module, choose M here: the | 113 | To compile this driver as a module, choose M here: the |
101 | module will be called rose. | 114 | module will be called rose. |
102 | 115 | ||
103 | |||
104 | menu "AX.25 network device drivers" | 116 | menu "AX.25 network device drivers" |
105 | depends on HAMRADIO && NET && AX25!=n | 117 | depends on HAMRADIO && AX25 |
106 | 118 | ||
107 | source "drivers/net/hamradio/Kconfig" | 119 | source "drivers/net/hamradio/Kconfig" |
108 | 120 | ||
109 | endmenu | 121 | endmenu |
110 | |||
diff --git a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c index 1c07c6a50eb8..6ded95272a53 100644 --- a/net/ax25/af_ax25.c +++ b/net/ax25/af_ax25.c | |||
@@ -1127,22 +1127,22 @@ static int __must_check ax25_connect(struct socket *sock, | |||
1127 | switch (sk->sk_state) { | 1127 | switch (sk->sk_state) { |
1128 | case TCP_SYN_SENT: /* still trying */ | 1128 | case TCP_SYN_SENT: /* still trying */ |
1129 | err = -EINPROGRESS; | 1129 | err = -EINPROGRESS; |
1130 | goto out; | 1130 | goto out_release; |
1131 | 1131 | ||
1132 | case TCP_ESTABLISHED: /* connection established */ | 1132 | case TCP_ESTABLISHED: /* connection established */ |
1133 | sock->state = SS_CONNECTED; | 1133 | sock->state = SS_CONNECTED; |
1134 | goto out; | 1134 | goto out_release; |
1135 | 1135 | ||
1136 | case TCP_CLOSE: /* connection refused */ | 1136 | case TCP_CLOSE: /* connection refused */ |
1137 | sock->state = SS_UNCONNECTED; | 1137 | sock->state = SS_UNCONNECTED; |
1138 | err = -ECONNREFUSED; | 1138 | err = -ECONNREFUSED; |
1139 | goto out; | 1139 | goto out_release; |
1140 | } | 1140 | } |
1141 | } | 1141 | } |
1142 | 1142 | ||
1143 | if (sk->sk_state == TCP_ESTABLISHED && sk->sk_type == SOCK_SEQPACKET) { | 1143 | if (sk->sk_state == TCP_ESTABLISHED && sk->sk_type == SOCK_SEQPACKET) { |
1144 | err = -EISCONN; /* No reconnect on a seqpacket socket */ | 1144 | err = -EISCONN; /* No reconnect on a seqpacket socket */ |
1145 | goto out; | 1145 | goto out_release; |
1146 | } | 1146 | } |
1147 | 1147 | ||
1148 | sk->sk_state = TCP_CLOSE; | 1148 | sk->sk_state = TCP_CLOSE; |
@@ -1159,12 +1159,12 @@ static int __must_check ax25_connect(struct socket *sock, | |||
1159 | /* Valid number of digipeaters ? */ | 1159 | /* Valid number of digipeaters ? */ |
1160 | if (fsa->fsa_ax25.sax25_ndigis < 1 || fsa->fsa_ax25.sax25_ndigis > AX25_MAX_DIGIS) { | 1160 | if (fsa->fsa_ax25.sax25_ndigis < 1 || fsa->fsa_ax25.sax25_ndigis > AX25_MAX_DIGIS) { |
1161 | err = -EINVAL; | 1161 | err = -EINVAL; |
1162 | goto out; | 1162 | goto out_release; |
1163 | } | 1163 | } |
1164 | 1164 | ||
1165 | if ((digi = kmalloc(sizeof(ax25_digi), GFP_KERNEL)) == NULL) { | 1165 | if ((digi = kmalloc(sizeof(ax25_digi), GFP_KERNEL)) == NULL) { |
1166 | err = -ENOBUFS; | 1166 | err = -ENOBUFS; |
1167 | goto out; | 1167 | goto out_release; |
1168 | } | 1168 | } |
1169 | 1169 | ||
1170 | digi->ndigi = fsa->fsa_ax25.sax25_ndigis; | 1170 | digi->ndigi = fsa->fsa_ax25.sax25_ndigis; |
@@ -1194,7 +1194,7 @@ static int __must_check ax25_connect(struct socket *sock, | |||
1194 | current->comm); | 1194 | current->comm); |
1195 | if ((err = ax25_rt_autobind(ax25, &fsa->fsa_ax25.sax25_call)) < 0) { | 1195 | if ((err = ax25_rt_autobind(ax25, &fsa->fsa_ax25.sax25_call)) < 0) { |
1196 | kfree(digi); | 1196 | kfree(digi); |
1197 | goto out; | 1197 | goto out_release; |
1198 | } | 1198 | } |
1199 | 1199 | ||
1200 | ax25_fillin_cb(ax25, ax25->ax25_dev); | 1200 | ax25_fillin_cb(ax25, ax25->ax25_dev); |
@@ -1203,7 +1203,7 @@ static int __must_check ax25_connect(struct socket *sock, | |||
1203 | if (ax25->ax25_dev == NULL) { | 1203 | if (ax25->ax25_dev == NULL) { |
1204 | kfree(digi); | 1204 | kfree(digi); |
1205 | err = -EHOSTUNREACH; | 1205 | err = -EHOSTUNREACH; |
1206 | goto out; | 1206 | goto out_release; |
1207 | } | 1207 | } |
1208 | } | 1208 | } |
1209 | 1209 | ||
@@ -1213,7 +1213,7 @@ static int __must_check ax25_connect(struct socket *sock, | |||
1213 | kfree(digi); | 1213 | kfree(digi); |
1214 | err = -EADDRINUSE; /* Already such a connection */ | 1214 | err = -EADDRINUSE; /* Already such a connection */ |
1215 | ax25_cb_put(ax25t); | 1215 | ax25_cb_put(ax25t); |
1216 | goto out; | 1216 | goto out_release; |
1217 | } | 1217 | } |
1218 | 1218 | ||
1219 | ax25->dest_addr = fsa->fsa_ax25.sax25_call; | 1219 | ax25->dest_addr = fsa->fsa_ax25.sax25_call; |
@@ -1223,7 +1223,7 @@ static int __must_check ax25_connect(struct socket *sock, | |||
1223 | if (sk->sk_type != SOCK_SEQPACKET) { | 1223 | if (sk->sk_type != SOCK_SEQPACKET) { |
1224 | sock->state = SS_CONNECTED; | 1224 | sock->state = SS_CONNECTED; |
1225 | sk->sk_state = TCP_ESTABLISHED; | 1225 | sk->sk_state = TCP_ESTABLISHED; |
1226 | goto out; | 1226 | goto out_release; |
1227 | } | 1227 | } |
1228 | 1228 | ||
1229 | /* Move to connecting socket, ax.25 lapb WAIT_UA.. */ | 1229 | /* Move to connecting socket, ax.25 lapb WAIT_UA.. */ |
@@ -1255,55 +1255,53 @@ static int __must_check ax25_connect(struct socket *sock, | |||
1255 | /* Now the loop */ | 1255 | /* Now the loop */ |
1256 | if (sk->sk_state != TCP_ESTABLISHED && (flags & O_NONBLOCK)) { | 1256 | if (sk->sk_state != TCP_ESTABLISHED && (flags & O_NONBLOCK)) { |
1257 | err = -EINPROGRESS; | 1257 | err = -EINPROGRESS; |
1258 | goto out; | 1258 | goto out_release; |
1259 | } | 1259 | } |
1260 | 1260 | ||
1261 | if (sk->sk_state == TCP_SYN_SENT) { | 1261 | if (sk->sk_state == TCP_SYN_SENT) { |
1262 | struct task_struct *tsk = current; | 1262 | DEFINE_WAIT(wait); |
1263 | DECLARE_WAITQUEUE(wait, tsk); | ||
1264 | 1263 | ||
1265 | add_wait_queue(sk->sk_sleep, &wait); | ||
1266 | for (;;) { | 1264 | for (;;) { |
1265 | prepare_to_wait(sk->sk_sleep, &wait, | ||
1266 | TASK_INTERRUPTIBLE); | ||
1267 | if (sk->sk_state != TCP_SYN_SENT) | 1267 | if (sk->sk_state != TCP_SYN_SENT) |
1268 | break; | 1268 | break; |
1269 | set_current_state(TASK_INTERRUPTIBLE); | 1269 | if (!signal_pending(current)) { |
1270 | release_sock(sk); | 1270 | release_sock(sk); |
1271 | if (!signal_pending(tsk)) { | ||
1272 | schedule(); | 1271 | schedule(); |
1273 | lock_sock(sk); | 1272 | lock_sock(sk); |
1274 | continue; | 1273 | continue; |
1275 | } | 1274 | } |
1276 | current->state = TASK_RUNNING; | 1275 | err = -ERESTARTSYS; |
1277 | remove_wait_queue(sk->sk_sleep, &wait); | 1276 | break; |
1278 | return -ERESTARTSYS; | ||
1279 | } | 1277 | } |
1280 | current->state = TASK_RUNNING; | 1278 | finish_wait(sk->sk_sleep, &wait); |
1281 | remove_wait_queue(sk->sk_sleep, &wait); | 1279 | |
1280 | if (err) | ||
1281 | goto out_release; | ||
1282 | } | 1282 | } |
1283 | 1283 | ||
1284 | if (sk->sk_state != TCP_ESTABLISHED) { | 1284 | if (sk->sk_state != TCP_ESTABLISHED) { |
1285 | /* Not in ABM, not in WAIT_UA -> failed */ | 1285 | /* Not in ABM, not in WAIT_UA -> failed */ |
1286 | sock->state = SS_UNCONNECTED; | 1286 | sock->state = SS_UNCONNECTED; |
1287 | err = sock_error(sk); /* Always set at this point */ | 1287 | err = sock_error(sk); /* Always set at this point */ |
1288 | goto out; | 1288 | goto out_release; |
1289 | } | 1289 | } |
1290 | 1290 | ||
1291 | sock->state = SS_CONNECTED; | 1291 | sock->state = SS_CONNECTED; |
1292 | 1292 | ||
1293 | err=0; | 1293 | err = 0; |
1294 | out: | 1294 | out_release: |
1295 | release_sock(sk); | 1295 | release_sock(sk); |
1296 | 1296 | ||
1297 | return err; | 1297 | return err; |
1298 | } | 1298 | } |
1299 | 1299 | ||
1300 | |||
1301 | static int ax25_accept(struct socket *sock, struct socket *newsock, int flags) | 1300 | static int ax25_accept(struct socket *sock, struct socket *newsock, int flags) |
1302 | { | 1301 | { |
1303 | struct task_struct *tsk = current; | ||
1304 | DECLARE_WAITQUEUE(wait, tsk); | ||
1305 | struct sk_buff *skb; | 1302 | struct sk_buff *skb; |
1306 | struct sock *newsk; | 1303 | struct sock *newsk; |
1304 | DEFINE_WAIT(wait); | ||
1307 | struct sock *sk; | 1305 | struct sock *sk; |
1308 | int err = 0; | 1306 | int err = 0; |
1309 | 1307 | ||
@@ -1328,30 +1326,29 @@ static int ax25_accept(struct socket *sock, struct socket *newsock, int flags) | |||
1328 | * The read queue this time is holding sockets ready to use | 1326 | * The read queue this time is holding sockets ready to use |
1329 | * hooked into the SABM we saved | 1327 | * hooked into the SABM we saved |
1330 | */ | 1328 | */ |
1331 | add_wait_queue(sk->sk_sleep, &wait); | ||
1332 | for (;;) { | 1329 | for (;;) { |
1330 | prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE); | ||
1333 | skb = skb_dequeue(&sk->sk_receive_queue); | 1331 | skb = skb_dequeue(&sk->sk_receive_queue); |
1334 | if (skb) | 1332 | if (skb) |
1335 | break; | 1333 | break; |
1336 | 1334 | ||
1337 | release_sock(sk); | ||
1338 | current->state = TASK_INTERRUPTIBLE; | ||
1339 | if (flags & O_NONBLOCK) { | 1335 | if (flags & O_NONBLOCK) { |
1340 | current->state = TASK_RUNNING; | 1336 | err = -EWOULDBLOCK; |
1341 | remove_wait_queue(sk->sk_sleep, &wait); | 1337 | break; |
1342 | return -EWOULDBLOCK; | ||
1343 | } | 1338 | } |
1344 | if (!signal_pending(tsk)) { | 1339 | if (!signal_pending(current)) { |
1340 | release_sock(sk); | ||
1345 | schedule(); | 1341 | schedule(); |
1346 | lock_sock(sk); | 1342 | lock_sock(sk); |
1347 | continue; | 1343 | continue; |
1348 | } | 1344 | } |
1349 | current->state = TASK_RUNNING; | 1345 | err = -ERESTARTSYS; |
1350 | remove_wait_queue(sk->sk_sleep, &wait); | 1346 | break; |
1351 | return -ERESTARTSYS; | ||
1352 | } | 1347 | } |
1353 | current->state = TASK_RUNNING; | 1348 | finish_wait(sk->sk_sleep, &wait); |
1354 | remove_wait_queue(sk->sk_sleep, &wait); | 1349 | |
1350 | if (err) | ||
1351 | goto out; | ||
1355 | 1352 | ||
1356 | newsk = skb->sk; | 1353 | newsk = skb->sk; |
1357 | newsk->sk_socket = newsock; | 1354 | newsk->sk_socket = newsock; |
@@ -1425,7 +1422,6 @@ static int ax25_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
1425 | struct sockaddr_ax25 sax; | 1422 | struct sockaddr_ax25 sax; |
1426 | struct sk_buff *skb; | 1423 | struct sk_buff *skb; |
1427 | ax25_digi dtmp, *dp; | 1424 | ax25_digi dtmp, *dp; |
1428 | unsigned char *asmptr; | ||
1429 | ax25_cb *ax25; | 1425 | ax25_cb *ax25; |
1430 | size_t size; | 1426 | size_t size; |
1431 | int lv, err, addr_len = msg->msg_namelen; | 1427 | int lv, err, addr_len = msg->msg_namelen; |
@@ -1548,13 +1544,11 @@ static int ax25_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
1548 | goto out; | 1544 | goto out; |
1549 | } | 1545 | } |
1550 | 1546 | ||
1551 | skb->nh.raw = skb->data; | 1547 | skb_reset_network_header(skb); |
1552 | 1548 | ||
1553 | /* Add the PID if one is not supplied by the user in the skb */ | 1549 | /* Add the PID if one is not supplied by the user in the skb */ |
1554 | if (!ax25->pidincl) { | 1550 | if (!ax25->pidincl) |
1555 | asmptr = skb_push(skb, 1); | 1551 | *skb_push(skb, 1) = sk->sk_protocol; |
1556 | *asmptr = sk->sk_protocol; | ||
1557 | } | ||
1558 | 1552 | ||
1559 | SOCK_DEBUG(sk, "AX.25: Transmitting buffer\n"); | 1553 | SOCK_DEBUG(sk, "AX.25: Transmitting buffer\n"); |
1560 | 1554 | ||
@@ -1573,7 +1567,7 @@ static int ax25_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
1573 | goto out; | 1567 | goto out; |
1574 | } | 1568 | } |
1575 | 1569 | ||
1576 | asmptr = skb_push(skb, 1 + ax25_addr_size(dp)); | 1570 | skb_push(skb, 1 + ax25_addr_size(dp)); |
1577 | 1571 | ||
1578 | SOCK_DEBUG(sk, "Building AX.25 Header (dp=%p).\n", dp); | 1572 | SOCK_DEBUG(sk, "Building AX.25 Header (dp=%p).\n", dp); |
1579 | 1573 | ||
@@ -1581,17 +1575,17 @@ static int ax25_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
1581 | SOCK_DEBUG(sk, "Num digipeaters=%d\n", dp->ndigi); | 1575 | SOCK_DEBUG(sk, "Num digipeaters=%d\n", dp->ndigi); |
1582 | 1576 | ||
1583 | /* Build an AX.25 header */ | 1577 | /* Build an AX.25 header */ |
1584 | asmptr += (lv = ax25_addr_build(asmptr, &ax25->source_addr, | 1578 | lv = ax25_addr_build(skb->data, &ax25->source_addr, &sax.sax25_call, |
1585 | &sax.sax25_call, dp, | 1579 | dp, AX25_COMMAND, AX25_MODULUS); |
1586 | AX25_COMMAND, AX25_MODULUS)); | ||
1587 | 1580 | ||
1588 | SOCK_DEBUG(sk, "Built header (%d bytes)\n",lv); | 1581 | SOCK_DEBUG(sk, "Built header (%d bytes)\n",lv); |
1589 | 1582 | ||
1590 | skb->h.raw = asmptr; | 1583 | skb_set_transport_header(skb, lv); |
1591 | 1584 | ||
1592 | SOCK_DEBUG(sk, "base=%p pos=%p\n", skb->data, asmptr); | 1585 | SOCK_DEBUG(sk, "base=%p pos=%p\n", |
1586 | skb->data, skb_transport_header(skb)); | ||
1593 | 1587 | ||
1594 | *asmptr = AX25_UI; | 1588 | *skb_transport_header(skb) = AX25_UI; |
1595 | 1589 | ||
1596 | /* Datagram frames go straight out of the door as UI */ | 1590 | /* Datagram frames go straight out of the door as UI */ |
1597 | ax25_queue_xmit(skb, ax25->ax25_dev->dev); | 1591 | ax25_queue_xmit(skb, ax25->ax25_dev->dev); |
@@ -1631,8 +1625,8 @@ static int ax25_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
1631 | if (!ax25_sk(sk)->pidincl) | 1625 | if (!ax25_sk(sk)->pidincl) |
1632 | skb_pull(skb, 1); /* Remove PID */ | 1626 | skb_pull(skb, 1); /* Remove PID */ |
1633 | 1627 | ||
1634 | skb->h.raw = skb->data; | 1628 | skb_reset_transport_header(skb); |
1635 | copied = skb->len; | 1629 | copied = skb->len; |
1636 | 1630 | ||
1637 | if (copied > size) { | 1631 | if (copied > size) { |
1638 | copied = size; | 1632 | copied = size; |
@@ -1645,9 +1639,10 @@ static int ax25_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
1645 | struct sockaddr_ax25 *sax = (struct sockaddr_ax25 *)msg->msg_name; | 1639 | struct sockaddr_ax25 *sax = (struct sockaddr_ax25 *)msg->msg_name; |
1646 | ax25_digi digi; | 1640 | ax25_digi digi; |
1647 | ax25_address src; | 1641 | ax25_address src; |
1642 | const unsigned char *mac = skb_mac_header(skb); | ||
1648 | 1643 | ||
1649 | ax25_addr_parse(skb->mac.raw+1, skb->data-skb->mac.raw-1, &src, NULL, &digi, NULL, NULL); | 1644 | ax25_addr_parse(mac + 1, skb->data - mac - 1, &src, NULL, |
1650 | 1645 | &digi, NULL, NULL); | |
1651 | sax->sax25_family = AF_AX25; | 1646 | sax->sax25_family = AF_AX25; |
1652 | /* We set this correctly, even though we may not let the | 1647 | /* We set this correctly, even though we may not let the |
1653 | application know the digi calls further down (because it | 1648 | application know the digi calls further down (because it |
@@ -1711,6 +1706,10 @@ static int ax25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) | |||
1711 | res = sock_get_timestamp(sk, argp); | 1706 | res = sock_get_timestamp(sk, argp); |
1712 | break; | 1707 | break; |
1713 | 1708 | ||
1709 | case SIOCGSTAMPNS: | ||
1710 | res = sock_get_timestampns(sk, argp); | ||
1711 | break; | ||
1712 | |||
1714 | case SIOCAX25ADDUID: /* Add a uid to the uid/call map table */ | 1713 | case SIOCAX25ADDUID: /* Add a uid to the uid/call map table */ |
1715 | case SIOCAX25DELUID: /* Delete a uid from the uid/call map table */ | 1714 | case SIOCAX25DELUID: /* Delete a uid from the uid/call map table */ |
1716 | case SIOCAX25GETUID: { | 1715 | case SIOCAX25GETUID: { |
diff --git a/net/ax25/ax25_ds_subr.c b/net/ax25/ax25_ds_subr.c index 9569dd3fa466..a49773ff2b92 100644 --- a/net/ax25/ax25_ds_subr.c +++ b/net/ax25/ax25_ds_subr.c | |||
@@ -136,7 +136,7 @@ static void ax25_kiss_cmd(ax25_dev *ax25_dev, unsigned char cmd, unsigned char p | |||
136 | if ((skb = alloc_skb(2, GFP_ATOMIC)) == NULL) | 136 | if ((skb = alloc_skb(2, GFP_ATOMIC)) == NULL) |
137 | return; | 137 | return; |
138 | 138 | ||
139 | skb->nh.raw = skb->data; | 139 | skb_reset_network_header(skb); |
140 | p = skb_put(skb, 2); | 140 | p = skb_put(skb, 2); |
141 | 141 | ||
142 | *p++ = cmd; | 142 | *p++ = cmd; |
diff --git a/net/ax25/ax25_in.c b/net/ax25/ax25_in.c index 4a6b26becadc..0ddaff0df217 100644 --- a/net/ax25/ax25_in.c +++ b/net/ax25/ax25_in.c | |||
@@ -61,12 +61,14 @@ static int ax25_rx_fragment(ax25_cb *ax25, struct sk_buff *skb) | |||
61 | skb_reserve(skbn, AX25_MAX_HEADER_LEN); | 61 | skb_reserve(skbn, AX25_MAX_HEADER_LEN); |
62 | 62 | ||
63 | skbn->dev = ax25->ax25_dev->dev; | 63 | skbn->dev = ax25->ax25_dev->dev; |
64 | skbn->h.raw = skbn->data; | 64 | skb_reset_network_header(skbn); |
65 | skbn->nh.raw = skbn->data; | 65 | skb_reset_transport_header(skbn); |
66 | 66 | ||
67 | /* Copy data from the fragments */ | 67 | /* Copy data from the fragments */ |
68 | while ((skbo = skb_dequeue(&ax25->frag_queue)) != NULL) { | 68 | while ((skbo = skb_dequeue(&ax25->frag_queue)) != NULL) { |
69 | memcpy(skb_put(skbn, skbo->len), skbo->data, skbo->len); | 69 | skb_copy_from_linear_data(skbo, |
70 | skb_put(skbn, skbo->len), | ||
71 | skbo->len); | ||
70 | kfree_skb(skbo); | 72 | kfree_skb(skbo); |
71 | } | 73 | } |
72 | 74 | ||
@@ -122,8 +124,8 @@ int ax25_rx_iframe(ax25_cb *ax25, struct sk_buff *skb) | |||
122 | } | 124 | } |
123 | 125 | ||
124 | skb_pull(skb, 1); /* Remove PID */ | 126 | skb_pull(skb, 1); /* Remove PID */ |
125 | skb->mac.raw = skb->nh.raw; | 127 | skb_reset_mac_header(skb); |
126 | skb->nh.raw = skb->data; | 128 | skb_reset_network_header(skb); |
127 | skb->dev = ax25->ax25_dev->dev; | 129 | skb->dev = ax25->ax25_dev->dev; |
128 | skb->pkt_type = PACKET_HOST; | 130 | skb->pkt_type = PACKET_HOST; |
129 | skb->protocol = htons(ETH_P_IP); | 131 | skb->protocol = htons(ETH_P_IP); |
@@ -196,7 +198,7 @@ static int ax25_rcv(struct sk_buff *skb, struct net_device *dev, | |||
196 | * Process the AX.25/LAPB frame. | 198 | * Process the AX.25/LAPB frame. |
197 | */ | 199 | */ |
198 | 200 | ||
199 | skb->h.raw = skb->data; | 201 | skb_reset_transport_header(skb); |
200 | 202 | ||
201 | if ((ax25_dev = ax25_dev_ax25dev(dev)) == NULL) { | 203 | if ((ax25_dev = ax25_dev_ax25dev(dev)) == NULL) { |
202 | kfree_skb(skb); | 204 | kfree_skb(skb); |
@@ -233,7 +235,7 @@ static int ax25_rcv(struct sk_buff *skb, struct net_device *dev, | |||
233 | 235 | ||
234 | /* UI frame - bypass LAPB processing */ | 236 | /* UI frame - bypass LAPB processing */ |
235 | if ((*skb->data & ~0x10) == AX25_UI && dp.lastrepeat + 1 == dp.ndigi) { | 237 | if ((*skb->data & ~0x10) == AX25_UI && dp.lastrepeat + 1 == dp.ndigi) { |
236 | skb->h.raw = skb->data + 2; /* skip control and pid */ | 238 | skb_set_transport_header(skb, 2); /* skip control and pid */ |
237 | 239 | ||
238 | ax25_send_to_raw(&dest, skb, skb->data[1]); | 240 | ax25_send_to_raw(&dest, skb, skb->data[1]); |
239 | 241 | ||
@@ -246,8 +248,8 @@ static int ax25_rcv(struct sk_buff *skb, struct net_device *dev, | |||
246 | switch (skb->data[1]) { | 248 | switch (skb->data[1]) { |
247 | case AX25_P_IP: | 249 | case AX25_P_IP: |
248 | skb_pull(skb,2); /* drop PID/CTRL */ | 250 | skb_pull(skb,2); /* drop PID/CTRL */ |
249 | skb->h.raw = skb->data; | 251 | skb_reset_transport_header(skb); |
250 | skb->nh.raw = skb->data; | 252 | skb_reset_network_header(skb); |
251 | skb->dev = dev; | 253 | skb->dev = dev; |
252 | skb->pkt_type = PACKET_HOST; | 254 | skb->pkt_type = PACKET_HOST; |
253 | skb->protocol = htons(ETH_P_IP); | 255 | skb->protocol = htons(ETH_P_IP); |
@@ -256,8 +258,8 @@ static int ax25_rcv(struct sk_buff *skb, struct net_device *dev, | |||
256 | 258 | ||
257 | case AX25_P_ARP: | 259 | case AX25_P_ARP: |
258 | skb_pull(skb,2); | 260 | skb_pull(skb,2); |
259 | skb->h.raw = skb->data; | 261 | skb_reset_transport_header(skb); |
260 | skb->nh.raw = skb->data; | 262 | skb_reset_network_header(skb); |
261 | skb->dev = dev; | 263 | skb->dev = dev; |
262 | skb->pkt_type = PACKET_HOST; | 264 | skb->pkt_type = PACKET_HOST; |
263 | skb->protocol = htons(ETH_P_ARP); | 265 | skb->protocol = htons(ETH_P_ARP); |
diff --git a/net/ax25/ax25_ip.c b/net/ax25/ax25_ip.c index 7f818bbcd1c5..930e4918037f 100644 --- a/net/ax25/ax25_ip.c +++ b/net/ax25/ax25_ip.c | |||
@@ -121,7 +121,7 @@ int ax25_rebuild_header(struct sk_buff *skb) | |||
121 | digipeat = route->digipeat; | 121 | digipeat = route->digipeat; |
122 | dev = route->dev; | 122 | dev = route->dev; |
123 | ip_mode = route->ip_mode; | 123 | ip_mode = route->ip_mode; |
124 | }; | 124 | } |
125 | 125 | ||
126 | if (dev == NULL) | 126 | if (dev == NULL) |
127 | dev = skb->dev; | 127 | dev = skb->dev; |
@@ -171,7 +171,7 @@ int ax25_rebuild_header(struct sk_buff *skb) | |||
171 | src_c = *(ax25_address *)(bp + 8); | 171 | src_c = *(ax25_address *)(bp + 8); |
172 | 172 | ||
173 | skb_pull(ourskb, AX25_HEADER_LEN - 1); /* Keep PID */ | 173 | skb_pull(ourskb, AX25_HEADER_LEN - 1); /* Keep PID */ |
174 | ourskb->nh.raw = ourskb->data; | 174 | skb_reset_network_header(ourskb); |
175 | 175 | ||
176 | ax25=ax25_send_frame( | 176 | ax25=ax25_send_frame( |
177 | ourskb, | 177 | ourskb, |
diff --git a/net/ax25/ax25_out.c b/net/ax25/ax25_out.c index 223835092b7a..92b517af7260 100644 --- a/net/ax25/ax25_out.c +++ b/net/ax25/ax25_out.c | |||
@@ -148,8 +148,9 @@ void ax25_output(ax25_cb *ax25, int paclen, struct sk_buff *skb) | |||
148 | 148 | ||
149 | if (ka9qfrag == 1) { | 149 | if (ka9qfrag == 1) { |
150 | skb_reserve(skbn, frontlen + 2); | 150 | skb_reserve(skbn, frontlen + 2); |
151 | skbn->nh.raw = skbn->data + (skb->nh.raw - skb->data); | 151 | skb_set_network_header(skbn, |
152 | memcpy(skb_put(skbn, len), skb->data, len); | 152 | skb_network_offset(skb)); |
153 | skb_copy_from_linear_data(skb, skb_put(skbn, len), len); | ||
153 | p = skb_push(skbn, 2); | 154 | p = skb_push(skbn, 2); |
154 | 155 | ||
155 | *p++ = AX25_P_SEGMENT; | 156 | *p++ = AX25_P_SEGMENT; |
@@ -161,8 +162,9 @@ void ax25_output(ax25_cb *ax25, int paclen, struct sk_buff *skb) | |||
161 | } | 162 | } |
162 | } else { | 163 | } else { |
163 | skb_reserve(skbn, frontlen + 1); | 164 | skb_reserve(skbn, frontlen + 1); |
164 | skbn->nh.raw = skbn->data + (skb->nh.raw - skb->data); | 165 | skb_set_network_header(skbn, |
165 | memcpy(skb_put(skbn, len), skb->data, len); | 166 | skb_network_offset(skb)); |
167 | skb_copy_from_linear_data(skb, skb_put(skbn, len), len); | ||
166 | p = skb_push(skbn, 1); | 168 | p = skb_push(skbn, 1); |
167 | *p = AX25_P_TEXT; | 169 | *p = AX25_P_TEXT; |
168 | } | 170 | } |
@@ -205,7 +207,7 @@ static void ax25_send_iframe(ax25_cb *ax25, struct sk_buff *skb, int poll_bit) | |||
205 | if (skb == NULL) | 207 | if (skb == NULL) |
206 | return; | 208 | return; |
207 | 209 | ||
208 | skb->nh.raw = skb->data; | 210 | skb_reset_network_header(skb); |
209 | 211 | ||
210 | if (ax25->modulus == AX25_MODULUS) { | 212 | if (ax25->modulus == AX25_MODULUS) { |
211 | frame = skb_push(skb, 1); | 213 | frame = skb_push(skb, 1); |
diff --git a/net/ax25/ax25_subr.c b/net/ax25/ax25_subr.c index b6c577e3c914..5fe9b2a6697d 100644 --- a/net/ax25/ax25_subr.c +++ b/net/ax25/ax25_subr.c | |||
@@ -162,7 +162,7 @@ void ax25_send_control(ax25_cb *ax25, int frametype, int poll_bit, int type) | |||
162 | 162 | ||
163 | skb_reserve(skb, ax25->ax25_dev->dev->hard_header_len); | 163 | skb_reserve(skb, ax25->ax25_dev->dev->hard_header_len); |
164 | 164 | ||
165 | skb->nh.raw = skb->data; | 165 | skb_reset_network_header(skb); |
166 | 166 | ||
167 | /* Assume a response - address structure for DTE */ | 167 | /* Assume a response - address structure for DTE */ |
168 | if (ax25->modulus == AX25_MODULUS) { | 168 | if (ax25->modulus == AX25_MODULUS) { |
@@ -205,7 +205,7 @@ void ax25_return_dm(struct net_device *dev, ax25_address *src, ax25_address *des | |||
205 | return; /* Next SABM will get DM'd */ | 205 | return; /* Next SABM will get DM'd */ |
206 | 206 | ||
207 | skb_reserve(skb, dev->hard_header_len); | 207 | skb_reserve(skb, dev->hard_header_len); |
208 | skb->nh.raw = skb->data; | 208 | skb_reset_network_header(skb); |
209 | 209 | ||
210 | ax25_digi_invert(digi, &retdigi); | 210 | ax25_digi_invert(digi, &retdigi); |
211 | 211 | ||