diff options
Diffstat (limited to 'net')
53 files changed, 666 insertions, 401 deletions
diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c index bfc9a35bad33..1dae3dfc66a9 100644 --- a/net/bluetooth/hci_sock.c +++ b/net/bluetooth/hci_sock.c | |||
@@ -665,7 +665,8 @@ static int hci_sock_dev_event(struct notifier_block *this, unsigned long event, | |||
665 | /* Detach sockets from device */ | 665 | /* Detach sockets from device */ |
666 | read_lock(&hci_sk_list.lock); | 666 | read_lock(&hci_sk_list.lock); |
667 | sk_for_each(sk, node, &hci_sk_list.head) { | 667 | sk_for_each(sk, node, &hci_sk_list.head) { |
668 | lock_sock(sk); | 668 | local_bh_disable(); |
669 | bh_lock_sock_nested(sk); | ||
669 | if (hci_pi(sk)->hdev == hdev) { | 670 | if (hci_pi(sk)->hdev == hdev) { |
670 | hci_pi(sk)->hdev = NULL; | 671 | hci_pi(sk)->hdev = NULL; |
671 | sk->sk_err = EPIPE; | 672 | sk->sk_err = EPIPE; |
@@ -674,7 +675,8 @@ static int hci_sock_dev_event(struct notifier_block *this, unsigned long event, | |||
674 | 675 | ||
675 | hci_dev_put(hdev); | 676 | hci_dev_put(hdev); |
676 | } | 677 | } |
677 | release_sock(sk); | 678 | bh_unlock_sock(sk); |
679 | local_bh_enable(); | ||
678 | } | 680 | } |
679 | read_unlock(&hci_sk_list.lock); | 681 | read_unlock(&hci_sk_list.lock); |
680 | } | 682 | } |
diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c index a59b1fb63b76..670ff95ca64b 100644 --- a/net/bluetooth/l2cap.c +++ b/net/bluetooth/l2cap.c | |||
@@ -507,6 +507,7 @@ static void l2cap_sock_init(struct sock *sk, struct sock *parent) | |||
507 | } | 507 | } |
508 | 508 | ||
509 | /* Default config options */ | 509 | /* Default config options */ |
510 | pi->conf_len = 0; | ||
510 | pi->conf_mtu = L2CAP_DEFAULT_MTU; | 511 | pi->conf_mtu = L2CAP_DEFAULT_MTU; |
511 | pi->flush_to = L2CAP_DEFAULT_FLUSH_TO; | 512 | pi->flush_to = L2CAP_DEFAULT_FLUSH_TO; |
512 | } | 513 | } |
@@ -1271,42 +1272,6 @@ static inline int l2cap_get_conf_opt(void **ptr, int *type, int *olen, unsigned | |||
1271 | return len; | 1272 | return len; |
1272 | } | 1273 | } |
1273 | 1274 | ||
1274 | static inline void l2cap_parse_conf_req(struct sock *sk, void *data, int len) | ||
1275 | { | ||
1276 | int type, hint, olen; | ||
1277 | unsigned long val; | ||
1278 | void *ptr = data; | ||
1279 | |||
1280 | BT_DBG("sk %p len %d", sk, len); | ||
1281 | |||
1282 | while (len >= L2CAP_CONF_OPT_SIZE) { | ||
1283 | len -= l2cap_get_conf_opt(&ptr, &type, &olen, &val); | ||
1284 | |||
1285 | hint = type & 0x80; | ||
1286 | type &= 0x7f; | ||
1287 | |||
1288 | switch (type) { | ||
1289 | case L2CAP_CONF_MTU: | ||
1290 | l2cap_pi(sk)->conf_mtu = val; | ||
1291 | break; | ||
1292 | |||
1293 | case L2CAP_CONF_FLUSH_TO: | ||
1294 | l2cap_pi(sk)->flush_to = val; | ||
1295 | break; | ||
1296 | |||
1297 | case L2CAP_CONF_QOS: | ||
1298 | break; | ||
1299 | |||
1300 | default: | ||
1301 | if (hint) | ||
1302 | break; | ||
1303 | |||
1304 | /* FIXME: Reject unknown option */ | ||
1305 | break; | ||
1306 | } | ||
1307 | } | ||
1308 | } | ||
1309 | |||
1310 | static void l2cap_add_conf_opt(void **ptr, u8 type, u8 len, unsigned long val) | 1275 | static void l2cap_add_conf_opt(void **ptr, u8 type, u8 len, unsigned long val) |
1311 | { | 1276 | { |
1312 | struct l2cap_conf_opt *opt = *ptr; | 1277 | struct l2cap_conf_opt *opt = *ptr; |
@@ -1358,39 +1323,75 @@ static int l2cap_build_conf_req(struct sock *sk, void *data) | |||
1358 | return ptr - data; | 1323 | return ptr - data; |
1359 | } | 1324 | } |
1360 | 1325 | ||
1361 | static inline int l2cap_conf_output(struct sock *sk, void **ptr) | 1326 | static int l2cap_parse_conf_req(struct sock *sk, void *data) |
1362 | { | 1327 | { |
1363 | struct l2cap_pinfo *pi = l2cap_pi(sk); | 1328 | struct l2cap_pinfo *pi = l2cap_pi(sk); |
1364 | int result = 0; | 1329 | struct l2cap_conf_rsp *rsp = data; |
1330 | void *ptr = rsp->data; | ||
1331 | void *req = pi->conf_req; | ||
1332 | int len = pi->conf_len; | ||
1333 | int type, hint, olen; | ||
1334 | unsigned long val; | ||
1335 | u16 result = L2CAP_CONF_SUCCESS; | ||
1365 | 1336 | ||
1366 | /* Configure output options and let the other side know | 1337 | BT_DBG("sk %p", sk); |
1367 | * which ones we don't like. */ | 1338 | |
1368 | if (pi->conf_mtu < pi->omtu) | 1339 | while (len >= L2CAP_CONF_OPT_SIZE) { |
1369 | result = L2CAP_CONF_UNACCEPT; | 1340 | len -= l2cap_get_conf_opt(&req, &type, &olen, &val); |
1370 | else | ||
1371 | pi->omtu = pi->conf_mtu; | ||
1372 | 1341 | ||
1373 | l2cap_add_conf_opt(ptr, L2CAP_CONF_MTU, 2, pi->omtu); | 1342 | hint = type & 0x80; |
1343 | type &= 0x7f; | ||
1344 | |||
1345 | switch (type) { | ||
1346 | case L2CAP_CONF_MTU: | ||
1347 | pi->conf_mtu = val; | ||
1348 | break; | ||
1349 | |||
1350 | case L2CAP_CONF_FLUSH_TO: | ||
1351 | pi->flush_to = val; | ||
1352 | break; | ||
1353 | |||
1354 | case L2CAP_CONF_QOS: | ||
1355 | break; | ||
1356 | |||
1357 | default: | ||
1358 | if (hint) | ||
1359 | break; | ||
1360 | |||
1361 | result = L2CAP_CONF_UNKNOWN; | ||
1362 | *((u8 *) ptr++) = type; | ||
1363 | break; | ||
1364 | } | ||
1365 | } | ||
1366 | |||
1367 | if (result == L2CAP_CONF_SUCCESS) { | ||
1368 | /* Configure output options and let the other side know | ||
1369 | * which ones we don't like. */ | ||
1370 | |||
1371 | if (pi->conf_mtu < pi->omtu) | ||
1372 | result = L2CAP_CONF_UNACCEPT; | ||
1373 | else | ||
1374 | pi->omtu = pi->conf_mtu; | ||
1375 | |||
1376 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, pi->omtu); | ||
1377 | } | ||
1374 | 1378 | ||
1375 | BT_DBG("sk %p result %d", sk, result); | 1379 | rsp->scid = cpu_to_le16(pi->dcid); |
1376 | return result; | 1380 | rsp->result = cpu_to_le16(result); |
1381 | rsp->flags = cpu_to_le16(0x0000); | ||
1382 | |||
1383 | return ptr - data; | ||
1377 | } | 1384 | } |
1378 | 1385 | ||
1379 | static int l2cap_build_conf_rsp(struct sock *sk, void *data, int *result) | 1386 | static int l2cap_build_conf_rsp(struct sock *sk, void *data, u16 result, u16 flags) |
1380 | { | 1387 | { |
1381 | struct l2cap_conf_rsp *rsp = data; | 1388 | struct l2cap_conf_rsp *rsp = data; |
1382 | void *ptr = rsp->data; | 1389 | void *ptr = rsp->data; |
1383 | u16 flags = 0; | ||
1384 | |||
1385 | BT_DBG("sk %p complete %d", sk, result ? 1 : 0); | ||
1386 | 1390 | ||
1387 | if (result) | 1391 | BT_DBG("sk %p", sk); |
1388 | *result = l2cap_conf_output(sk, &ptr); | ||
1389 | else | ||
1390 | flags = 0x0001; | ||
1391 | 1392 | ||
1392 | rsp->scid = cpu_to_le16(l2cap_pi(sk)->dcid); | 1393 | rsp->scid = cpu_to_le16(l2cap_pi(sk)->dcid); |
1393 | rsp->result = cpu_to_le16(result ? *result : 0); | 1394 | rsp->result = cpu_to_le16(result); |
1394 | rsp->flags = cpu_to_le16(flags); | 1395 | rsp->flags = cpu_to_le16(flags); |
1395 | 1396 | ||
1396 | return ptr - data; | 1397 | return ptr - data; |
@@ -1535,7 +1536,7 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr | |||
1535 | u16 dcid, flags; | 1536 | u16 dcid, flags; |
1536 | u8 rsp[64]; | 1537 | u8 rsp[64]; |
1537 | struct sock *sk; | 1538 | struct sock *sk; |
1538 | int result; | 1539 | int len; |
1539 | 1540 | ||
1540 | dcid = __le16_to_cpu(req->dcid); | 1541 | dcid = __le16_to_cpu(req->dcid); |
1541 | flags = __le16_to_cpu(req->flags); | 1542 | flags = __le16_to_cpu(req->flags); |
@@ -1548,25 +1549,40 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr | |||
1548 | if (sk->sk_state == BT_DISCONN) | 1549 | if (sk->sk_state == BT_DISCONN) |
1549 | goto unlock; | 1550 | goto unlock; |
1550 | 1551 | ||
1551 | l2cap_parse_conf_req(sk, req->data, cmd->len - sizeof(*req)); | 1552 | /* Reject if config buffer is too small. */ |
1553 | len = cmd->len - sizeof(*req); | ||
1554 | if (l2cap_pi(sk)->conf_len + len > sizeof(l2cap_pi(sk)->conf_req)) { | ||
1555 | l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, | ||
1556 | l2cap_build_conf_rsp(sk, rsp, | ||
1557 | L2CAP_CONF_REJECT, flags), rsp); | ||
1558 | goto unlock; | ||
1559 | } | ||
1560 | |||
1561 | /* Store config. */ | ||
1562 | memcpy(l2cap_pi(sk)->conf_req + l2cap_pi(sk)->conf_len, req->data, len); | ||
1563 | l2cap_pi(sk)->conf_len += len; | ||
1552 | 1564 | ||
1553 | if (flags & 0x0001) { | 1565 | if (flags & 0x0001) { |
1554 | /* Incomplete config. Send empty response. */ | 1566 | /* Incomplete config. Send empty response. */ |
1555 | l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, | 1567 | l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, |
1556 | l2cap_build_conf_rsp(sk, rsp, NULL), rsp); | 1568 | l2cap_build_conf_rsp(sk, rsp, |
1569 | L2CAP_CONF_SUCCESS, 0x0001), rsp); | ||
1557 | goto unlock; | 1570 | goto unlock; |
1558 | } | 1571 | } |
1559 | 1572 | ||
1560 | /* Complete config. */ | 1573 | /* Complete config. */ |
1561 | l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, | 1574 | len = l2cap_parse_conf_req(sk, rsp); |
1562 | l2cap_build_conf_rsp(sk, rsp, &result), rsp); | 1575 | if (len < 0) |
1563 | |||
1564 | if (result) | ||
1565 | goto unlock; | 1576 | goto unlock; |
1566 | 1577 | ||
1567 | /* Output config done */ | 1578 | l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp); |
1579 | |||
1580 | /* Output config done. */ | ||
1568 | l2cap_pi(sk)->conf_state |= L2CAP_CONF_OUTPUT_DONE; | 1581 | l2cap_pi(sk)->conf_state |= L2CAP_CONF_OUTPUT_DONE; |
1569 | 1582 | ||
1583 | /* Reset config buffer. */ | ||
1584 | l2cap_pi(sk)->conf_len = 0; | ||
1585 | |||
1570 | if (l2cap_pi(sk)->conf_state & L2CAP_CONF_INPUT_DONE) { | 1586 | if (l2cap_pi(sk)->conf_state & L2CAP_CONF_INPUT_DONE) { |
1571 | sk->sk_state = BT_CONNECTED; | 1587 | sk->sk_state = BT_CONNECTED; |
1572 | l2cap_chan_ready(sk); | 1588 | l2cap_chan_ready(sk); |
diff --git a/net/core/dev.c b/net/core/dev.c index 8301e2ac747f..5a7f20f78574 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -116,6 +116,7 @@ | |||
116 | #include <linux/dmaengine.h> | 116 | #include <linux/dmaengine.h> |
117 | #include <linux/err.h> | 117 | #include <linux/err.h> |
118 | #include <linux/ctype.h> | 118 | #include <linux/ctype.h> |
119 | #include <linux/if_arp.h> | ||
119 | 120 | ||
120 | /* | 121 | /* |
121 | * The list of packet types we will receive (as opposed to discard) | 122 | * The list of packet types we will receive (as opposed to discard) |
@@ -217,6 +218,73 @@ extern void netdev_unregister_sysfs(struct net_device *); | |||
217 | #define netdev_unregister_sysfs(dev) do { } while(0) | 218 | #define netdev_unregister_sysfs(dev) do { } while(0) |
218 | #endif | 219 | #endif |
219 | 220 | ||
221 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | ||
222 | /* | ||
223 | * register_netdevice() inits dev->_xmit_lock and sets lockdep class | ||
224 | * according to dev->type | ||
225 | */ | ||
226 | static const unsigned short netdev_lock_type[] = | ||
227 | {ARPHRD_NETROM, ARPHRD_ETHER, ARPHRD_EETHER, ARPHRD_AX25, | ||
228 | ARPHRD_PRONET, ARPHRD_CHAOS, ARPHRD_IEEE802, ARPHRD_ARCNET, | ||
229 | ARPHRD_APPLETLK, ARPHRD_DLCI, ARPHRD_ATM, ARPHRD_METRICOM, | ||
230 | ARPHRD_IEEE1394, ARPHRD_EUI64, ARPHRD_INFINIBAND, ARPHRD_SLIP, | ||
231 | ARPHRD_CSLIP, ARPHRD_SLIP6, ARPHRD_CSLIP6, ARPHRD_RSRVD, | ||
232 | ARPHRD_ADAPT, ARPHRD_ROSE, ARPHRD_X25, ARPHRD_HWX25, | ||
233 | ARPHRD_PPP, ARPHRD_CISCO, ARPHRD_LAPB, ARPHRD_DDCMP, | ||
234 | ARPHRD_RAWHDLC, ARPHRD_TUNNEL, ARPHRD_TUNNEL6, ARPHRD_FRAD, | ||
235 | ARPHRD_SKIP, ARPHRD_LOOPBACK, ARPHRD_LOCALTLK, ARPHRD_FDDI, | ||
236 | ARPHRD_BIF, ARPHRD_SIT, ARPHRD_IPDDP, ARPHRD_IPGRE, | ||
237 | ARPHRD_PIMREG, ARPHRD_HIPPI, ARPHRD_ASH, ARPHRD_ECONET, | ||
238 | ARPHRD_IRDA, ARPHRD_FCPP, ARPHRD_FCAL, ARPHRD_FCPL, | ||
239 | ARPHRD_FCFABRIC, ARPHRD_IEEE802_TR, ARPHRD_IEEE80211, | ||
240 | ARPHRD_IEEE80211_PRISM, ARPHRD_IEEE80211_RADIOTAP, ARPHRD_VOID, | ||
241 | ARPHRD_NONE}; | ||
242 | |||
243 | static const char *netdev_lock_name[] = | ||
244 | {"_xmit_NETROM", "_xmit_ETHER", "_xmit_EETHER", "_xmit_AX25", | ||
245 | "_xmit_PRONET", "_xmit_CHAOS", "_xmit_IEEE802", "_xmit_ARCNET", | ||
246 | "_xmit_APPLETLK", "_xmit_DLCI", "_xmit_ATM", "_xmit_METRICOM", | ||
247 | "_xmit_IEEE1394", "_xmit_EUI64", "_xmit_INFINIBAND", "_xmit_SLIP", | ||
248 | "_xmit_CSLIP", "_xmit_SLIP6", "_xmit_CSLIP6", "_xmit_RSRVD", | ||
249 | "_xmit_ADAPT", "_xmit_ROSE", "_xmit_X25", "_xmit_HWX25", | ||
250 | "_xmit_PPP", "_xmit_CISCO", "_xmit_LAPB", "_xmit_DDCMP", | ||
251 | "_xmit_RAWHDLC", "_xmit_TUNNEL", "_xmit_TUNNEL6", "_xmit_FRAD", | ||
252 | "_xmit_SKIP", "_xmit_LOOPBACK", "_xmit_LOCALTLK", "_xmit_FDDI", | ||
253 | "_xmit_BIF", "_xmit_SIT", "_xmit_IPDDP", "_xmit_IPGRE", | ||
254 | "_xmit_PIMREG", "_xmit_HIPPI", "_xmit_ASH", "_xmit_ECONET", | ||
255 | "_xmit_IRDA", "_xmit_FCPP", "_xmit_FCAL", "_xmit_FCPL", | ||
256 | "_xmit_FCFABRIC", "_xmit_IEEE802_TR", "_xmit_IEEE80211", | ||
257 | "_xmit_IEEE80211_PRISM", "_xmit_IEEE80211_RADIOTAP", "_xmit_VOID", | ||
258 | "_xmit_NONE"}; | ||
259 | |||
260 | static struct lock_class_key netdev_xmit_lock_key[ARRAY_SIZE(netdev_lock_type)]; | ||
261 | |||
262 | static inline unsigned short netdev_lock_pos(unsigned short dev_type) | ||
263 | { | ||
264 | int i; | ||
265 | |||
266 | for (i = 0; i < ARRAY_SIZE(netdev_lock_type); i++) | ||
267 | if (netdev_lock_type[i] == dev_type) | ||
268 | return i; | ||
269 | /* the last key is used by default */ | ||
270 | return ARRAY_SIZE(netdev_lock_type) - 1; | ||
271 | } | ||
272 | |||
273 | static inline void netdev_set_lockdep_class(spinlock_t *lock, | ||
274 | unsigned short dev_type) | ||
275 | { | ||
276 | int i; | ||
277 | |||
278 | i = netdev_lock_pos(dev_type); | ||
279 | lockdep_set_class_and_name(lock, &netdev_xmit_lock_key[i], | ||
280 | netdev_lock_name[i]); | ||
281 | } | ||
282 | #else | ||
283 | static inline void netdev_set_lockdep_class(spinlock_t *lock, | ||
284 | unsigned short dev_type) | ||
285 | { | ||
286 | } | ||
287 | #endif | ||
220 | 288 | ||
221 | /******************************************************************************* | 289 | /******************************************************************************* |
222 | 290 | ||
@@ -3001,6 +3069,7 @@ int register_netdevice(struct net_device *dev) | |||
3001 | 3069 | ||
3002 | spin_lock_init(&dev->queue_lock); | 3070 | spin_lock_init(&dev->queue_lock); |
3003 | spin_lock_init(&dev->_xmit_lock); | 3071 | spin_lock_init(&dev->_xmit_lock); |
3072 | netdev_set_lockdep_class(&dev->_xmit_lock, dev->type); | ||
3004 | dev->xmit_lock_owner = -1; | 3073 | dev->xmit_lock_owner = -1; |
3005 | spin_lock_init(&dev->ingress_lock); | 3074 | spin_lock_init(&dev->ingress_lock); |
3006 | 3075 | ||
@@ -3245,7 +3314,6 @@ void netdev_run_todo(void) | |||
3245 | continue; | 3314 | continue; |
3246 | } | 3315 | } |
3247 | 3316 | ||
3248 | netdev_unregister_sysfs(dev); | ||
3249 | dev->reg_state = NETREG_UNREGISTERED; | 3317 | dev->reg_state = NETREG_UNREGISTERED; |
3250 | 3318 | ||
3251 | netdev_wait_allrefs(dev); | 3319 | netdev_wait_allrefs(dev); |
@@ -3256,11 +3324,11 @@ void netdev_run_todo(void) | |||
3256 | BUG_TRAP(!dev->ip6_ptr); | 3324 | BUG_TRAP(!dev->ip6_ptr); |
3257 | BUG_TRAP(!dev->dn_ptr); | 3325 | BUG_TRAP(!dev->dn_ptr); |
3258 | 3326 | ||
3259 | /* It must be the very last action, | ||
3260 | * after this 'dev' may point to freed up memory. | ||
3261 | */ | ||
3262 | if (dev->destructor) | 3327 | if (dev->destructor) |
3263 | dev->destructor(dev); | 3328 | dev->destructor(dev); |
3329 | |||
3330 | /* Free network device */ | ||
3331 | kobject_put(&dev->dev.kobj); | ||
3264 | } | 3332 | } |
3265 | 3333 | ||
3266 | out: | 3334 | out: |
@@ -3411,6 +3479,9 @@ void unregister_netdevice(struct net_device *dev) | |||
3411 | /* Notifier chain MUST detach us from master device. */ | 3479 | /* Notifier chain MUST detach us from master device. */ |
3412 | BUG_TRAP(!dev->master); | 3480 | BUG_TRAP(!dev->master); |
3413 | 3481 | ||
3482 | /* Remove entries from sysfs */ | ||
3483 | netdev_unregister_sysfs(dev); | ||
3484 | |||
3414 | /* Finish processing unregister after unlock */ | 3485 | /* Finish processing unregister after unlock */ |
3415 | net_set_todo(dev); | 3486 | net_set_todo(dev); |
3416 | 3487 | ||
diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c index b21307b15b82..5c19b0646d7a 100644 --- a/net/core/net-sysfs.c +++ b/net/core/net-sysfs.c | |||
@@ -456,9 +456,15 @@ static struct class net_class = { | |||
456 | #endif | 456 | #endif |
457 | }; | 457 | }; |
458 | 458 | ||
459 | /* Delete sysfs entries but hold kobject reference until after all | ||
460 | * netdev references are gone. | ||
461 | */ | ||
459 | void netdev_unregister_sysfs(struct net_device * net) | 462 | void netdev_unregister_sysfs(struct net_device * net) |
460 | { | 463 | { |
461 | device_del(&(net->dev)); | 464 | struct device *dev = &(net->dev); |
465 | |||
466 | kobject_get(&dev->kobj); | ||
467 | device_del(dev); | ||
462 | } | 468 | } |
463 | 469 | ||
464 | /* Create sysfs entries for network device. */ | 470 | /* Create sysfs entries for network device. */ |
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 8c971a2efe2a..27da9cdec6a8 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
@@ -437,7 +437,7 @@ static void copy_rtnl_link_stats(struct rtnl_link_stats *a, | |||
437 | a->tx_compressed = b->tx_compressed; | 437 | a->tx_compressed = b->tx_compressed; |
438 | }; | 438 | }; |
439 | 439 | ||
440 | static inline size_t if_nlmsg_size(int iwbuflen) | 440 | static inline size_t if_nlmsg_size(void) |
441 | { | 441 | { |
442 | return NLMSG_ALIGN(sizeof(struct ifinfomsg)) | 442 | return NLMSG_ALIGN(sizeof(struct ifinfomsg)) |
443 | + nla_total_size(IFNAMSIZ) /* IFLA_IFNAME */ | 443 | + nla_total_size(IFNAMSIZ) /* IFLA_IFNAME */ |
@@ -452,13 +452,12 @@ static inline size_t if_nlmsg_size(int iwbuflen) | |||
452 | + nla_total_size(4) /* IFLA_LINK */ | 452 | + nla_total_size(4) /* IFLA_LINK */ |
453 | + nla_total_size(4) /* IFLA_MASTER */ | 453 | + nla_total_size(4) /* IFLA_MASTER */ |
454 | + nla_total_size(1) /* IFLA_OPERSTATE */ | 454 | + nla_total_size(1) /* IFLA_OPERSTATE */ |
455 | + nla_total_size(1) /* IFLA_LINKMODE */ | 455 | + nla_total_size(1); /* IFLA_LINKMODE */ |
456 | + nla_total_size(iwbuflen); | ||
457 | } | 456 | } |
458 | 457 | ||
459 | static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev, | 458 | static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev, |
460 | void *iwbuf, int iwbuflen, int type, u32 pid, | 459 | int type, u32 pid, u32 seq, u32 change, |
461 | u32 seq, u32 change, unsigned int flags) | 460 | unsigned int flags) |
462 | { | 461 | { |
463 | struct ifinfomsg *ifm; | 462 | struct ifinfomsg *ifm; |
464 | struct nlmsghdr *nlh; | 463 | struct nlmsghdr *nlh; |
@@ -523,9 +522,6 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev, | |||
523 | } | 522 | } |
524 | } | 523 | } |
525 | 524 | ||
526 | if (iwbuf) | ||
527 | NLA_PUT(skb, IFLA_WIRELESS, iwbuflen, iwbuf); | ||
528 | |||
529 | return nlmsg_end(skb, nlh); | 525 | return nlmsg_end(skb, nlh); |
530 | 526 | ||
531 | nla_put_failure: | 527 | nla_put_failure: |
@@ -543,7 +539,7 @@ static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb) | |||
543 | for_each_netdev(dev) { | 539 | for_each_netdev(dev) { |
544 | if (idx < s_idx) | 540 | if (idx < s_idx) |
545 | goto cont; | 541 | goto cont; |
546 | if (rtnl_fill_ifinfo(skb, dev, NULL, 0, RTM_NEWLINK, | 542 | if (rtnl_fill_ifinfo(skb, dev, RTM_NEWLINK, |
547 | NETLINK_CB(cb->skb).pid, | 543 | NETLINK_CB(cb->skb).pid, |
548 | cb->nlh->nlmsg_seq, 0, NLM_F_MULTI) <= 0) | 544 | cb->nlh->nlmsg_seq, 0, NLM_F_MULTI) <= 0) |
549 | break; | 545 | break; |
@@ -689,8 +685,15 @@ static int rtnl_setlink(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) | |||
689 | } | 685 | } |
690 | 686 | ||
691 | 687 | ||
692 | if (ifm->ifi_flags) | 688 | if (ifm->ifi_flags || ifm->ifi_change) { |
693 | dev_change_flags(dev, ifm->ifi_flags); | 689 | unsigned int flags = ifm->ifi_flags; |
690 | |||
691 | /* bugwards compatibility: ifi_change == 0 is treated as ~0 */ | ||
692 | if (ifm->ifi_change) | ||
693 | flags = (flags & ifm->ifi_change) | | ||
694 | (dev->flags & ~ifm->ifi_change); | ||
695 | dev_change_flags(dev, flags); | ||
696 | } | ||
694 | 697 | ||
695 | if (tb[IFLA_TXQLEN]) | 698 | if (tb[IFLA_TXQLEN]) |
696 | dev->tx_queue_len = nla_get_u32(tb[IFLA_TXQLEN]); | 699 | dev->tx_queue_len = nla_get_u32(tb[IFLA_TXQLEN]); |
@@ -730,8 +733,6 @@ static int rtnl_getlink(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg) | |||
730 | struct nlattr *tb[IFLA_MAX+1]; | 733 | struct nlattr *tb[IFLA_MAX+1]; |
731 | struct net_device *dev = NULL; | 734 | struct net_device *dev = NULL; |
732 | struct sk_buff *nskb; | 735 | struct sk_buff *nskb; |
733 | char *iw_buf = NULL, *iw = NULL; | ||
734 | int iw_buf_len = 0; | ||
735 | int err; | 736 | int err; |
736 | 737 | ||
737 | err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFLA_MAX, ifla_policy); | 738 | err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFLA_MAX, ifla_policy); |
@@ -746,14 +747,14 @@ static int rtnl_getlink(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg) | |||
746 | } else | 747 | } else |
747 | return -EINVAL; | 748 | return -EINVAL; |
748 | 749 | ||
749 | nskb = nlmsg_new(if_nlmsg_size(iw_buf_len), GFP_KERNEL); | 750 | nskb = nlmsg_new(if_nlmsg_size(), GFP_KERNEL); |
750 | if (nskb == NULL) { | 751 | if (nskb == NULL) { |
751 | err = -ENOBUFS; | 752 | err = -ENOBUFS; |
752 | goto errout; | 753 | goto errout; |
753 | } | 754 | } |
754 | 755 | ||
755 | err = rtnl_fill_ifinfo(nskb, dev, iw, iw_buf_len, RTM_NEWLINK, | 756 | err = rtnl_fill_ifinfo(nskb, dev, RTM_NEWLINK, NETLINK_CB(skb).pid, |
756 | NETLINK_CB(skb).pid, nlh->nlmsg_seq, 0, 0); | 757 | nlh->nlmsg_seq, 0, 0); |
757 | if (err < 0) { | 758 | if (err < 0) { |
758 | /* -EMSGSIZE implies BUG in if_nlmsg_size */ | 759 | /* -EMSGSIZE implies BUG in if_nlmsg_size */ |
759 | WARN_ON(err == -EMSGSIZE); | 760 | WARN_ON(err == -EMSGSIZE); |
@@ -762,7 +763,6 @@ static int rtnl_getlink(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg) | |||
762 | } | 763 | } |
763 | err = rtnl_unicast(nskb, NETLINK_CB(skb).pid); | 764 | err = rtnl_unicast(nskb, NETLINK_CB(skb).pid); |
764 | errout: | 765 | errout: |
765 | kfree(iw_buf); | ||
766 | dev_put(dev); | 766 | dev_put(dev); |
767 | 767 | ||
768 | return err; | 768 | return err; |
@@ -797,11 +797,11 @@ void rtmsg_ifinfo(int type, struct net_device *dev, unsigned change) | |||
797 | struct sk_buff *skb; | 797 | struct sk_buff *skb; |
798 | int err = -ENOBUFS; | 798 | int err = -ENOBUFS; |
799 | 799 | ||
800 | skb = nlmsg_new(if_nlmsg_size(0), GFP_KERNEL); | 800 | skb = nlmsg_new(if_nlmsg_size(), GFP_KERNEL); |
801 | if (skb == NULL) | 801 | if (skb == NULL) |
802 | goto errout; | 802 | goto errout; |
803 | 803 | ||
804 | err = rtnl_fill_ifinfo(skb, dev, NULL, 0, type, 0, 0, change, 0); | 804 | err = rtnl_fill_ifinfo(skb, dev, type, 0, 0, change, 0); |
805 | if (err < 0) { | 805 | if (err < 0) { |
806 | /* -EMSGSIZE implies BUG in if_nlmsg_size() */ | 806 | /* -EMSGSIZE implies BUG in if_nlmsg_size() */ |
807 | WARN_ON(err == -EMSGSIZE); | 807 | WARN_ON(err == -EMSGSIZE); |
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 142257307fa2..7c6a34e21eee 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
@@ -644,11 +644,10 @@ int pskb_expand_head(struct sk_buff *skb, int nhead, int ntail, | |||
644 | 644 | ||
645 | /* Copy only real data... and, alas, header. This should be | 645 | /* Copy only real data... and, alas, header. This should be |
646 | * optimized for the cases when header is void. */ | 646 | * optimized for the cases when header is void. */ |
647 | memcpy(data + nhead, skb->head, | ||
648 | #ifdef NET_SKBUFF_DATA_USES_OFFSET | 647 | #ifdef NET_SKBUFF_DATA_USES_OFFSET |
649 | skb->tail); | 648 | memcpy(data + nhead, skb->head, skb->tail); |
650 | #else | 649 | #else |
651 | skb->tail - skb->head); | 650 | memcpy(data + nhead, skb->head, skb->tail - skb->head); |
652 | #endif | 651 | #endif |
653 | memcpy(data + size, skb_end_pointer(skb), | 652 | memcpy(data + size, skb_end_pointer(skb), |
654 | sizeof(struct skb_shared_info)); | 653 | sizeof(struct skb_shared_info)); |
diff --git a/net/core/sock.c b/net/core/sock.c index 22183c2ef284..7e51d3a5e4f6 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
@@ -206,7 +206,19 @@ static int sock_set_timeout(long *timeo_p, char __user *optval, int optlen) | |||
206 | return -EINVAL; | 206 | return -EINVAL; |
207 | if (copy_from_user(&tv, optval, sizeof(tv))) | 207 | if (copy_from_user(&tv, optval, sizeof(tv))) |
208 | return -EFAULT; | 208 | return -EFAULT; |
209 | 209 | if (tv.tv_usec < 0 || tv.tv_usec >= USEC_PER_SEC) | |
210 | return -EDOM; | ||
211 | |||
212 | if (tv.tv_sec < 0) { | ||
213 | static int warned = 0; | ||
214 | *timeo_p = 0; | ||
215 | if (warned < 10 && net_ratelimit()) | ||
216 | warned++; | ||
217 | printk(KERN_INFO "sock_set_timeout: `%s' (pid %d) " | ||
218 | "tries to set negative timeout\n", | ||
219 | current->comm, current->pid); | ||
220 | return 0; | ||
221 | } | ||
210 | *timeo_p = MAX_SCHEDULE_TIMEOUT; | 222 | *timeo_p = MAX_SCHEDULE_TIMEOUT; |
211 | if (tv.tv_sec == 0 && tv.tv_usec == 0) | 223 | if (tv.tv_sec == 0 && tv.tv_usec == 0) |
212 | return 0; | 224 | return 0; |
diff --git a/net/core/sysctl_net_core.c b/net/core/sysctl_net_core.c index b29712033dd4..f34aca041a25 100644 --- a/net/core/sysctl_net_core.c +++ b/net/core/sysctl_net_core.c | |||
@@ -24,6 +24,7 @@ extern int sysctl_core_destroy_delay; | |||
24 | #ifdef CONFIG_XFRM | 24 | #ifdef CONFIG_XFRM |
25 | extern u32 sysctl_xfrm_aevent_etime; | 25 | extern u32 sysctl_xfrm_aevent_etime; |
26 | extern u32 sysctl_xfrm_aevent_rseqth; | 26 | extern u32 sysctl_xfrm_aevent_rseqth; |
27 | extern int sysctl_xfrm_larval_drop; | ||
27 | #endif | 28 | #endif |
28 | 29 | ||
29 | ctl_table core_table[] = { | 30 | ctl_table core_table[] = { |
@@ -118,6 +119,14 @@ ctl_table core_table[] = { | |||
118 | .mode = 0644, | 119 | .mode = 0644, |
119 | .proc_handler = &proc_dointvec | 120 | .proc_handler = &proc_dointvec |
120 | }, | 121 | }, |
122 | { | ||
123 | .ctl_name = CTL_UNNUMBERED, | ||
124 | .procname = "xfrm_larval_drop", | ||
125 | .data = &sysctl_xfrm_larval_drop, | ||
126 | .maxlen = sizeof(int), | ||
127 | .mode = 0644, | ||
128 | .proc_handler = &proc_dointvec | ||
129 | }, | ||
121 | #endif /* CONFIG_XFRM */ | 130 | #endif /* CONFIG_XFRM */ |
122 | #endif /* CONFIG_NET */ | 131 | #endif /* CONFIG_NET */ |
123 | { | 132 | { |
diff --git a/net/dccp/Kconfig b/net/dccp/Kconfig index b8a68dd41000..0549e4719b13 100644 --- a/net/dccp/Kconfig +++ b/net/dccp/Kconfig | |||
@@ -1,8 +1,6 @@ | |||
1 | menu "DCCP Configuration (EXPERIMENTAL)" | 1 | menuconfig IP_DCCP |
2 | depends on INET && EXPERIMENTAL | ||
3 | |||
4 | config IP_DCCP | ||
5 | tristate "The DCCP Protocol (EXPERIMENTAL)" | 2 | tristate "The DCCP Protocol (EXPERIMENTAL)" |
3 | depends on INET && EXPERIMENTAL | ||
6 | ---help--- | 4 | ---help--- |
7 | Datagram Congestion Control Protocol (RFC 4340) | 5 | Datagram Congestion Control Protocol (RFC 4340) |
8 | 6 | ||
@@ -19,19 +17,20 @@ config IP_DCCP | |||
19 | 17 | ||
20 | If in doubt, say N. | 18 | If in doubt, say N. |
21 | 19 | ||
20 | if IP_DCCP | ||
21 | |||
22 | config INET_DCCP_DIAG | 22 | config INET_DCCP_DIAG |
23 | depends on IP_DCCP && INET_DIAG | 23 | depends on INET_DIAG |
24 | def_tristate y if (IP_DCCP = y && INET_DIAG = y) | 24 | def_tristate y if (IP_DCCP = y && INET_DIAG = y) |
25 | def_tristate m | 25 | def_tristate m |
26 | 26 | ||
27 | config IP_DCCP_ACKVEC | 27 | config IP_DCCP_ACKVEC |
28 | depends on IP_DCCP | ||
29 | bool | 28 | bool |
30 | 29 | ||
31 | source "net/dccp/ccids/Kconfig" | 30 | source "net/dccp/ccids/Kconfig" |
32 | 31 | ||
33 | menu "DCCP Kernel Hacking" | 32 | menu "DCCP Kernel Hacking" |
34 | depends on IP_DCCP && DEBUG_KERNEL=y | 33 | depends on DEBUG_KERNEL=y |
35 | 34 | ||
36 | config IP_DCCP_DEBUG | 35 | config IP_DCCP_DEBUG |
37 | bool "DCCP debug messages" | 36 | bool "DCCP debug messages" |
@@ -61,4 +60,4 @@ config NET_DCCPPROBE | |||
61 | 60 | ||
62 | endmenu | 61 | endmenu |
63 | 62 | ||
64 | endmenu | 63 | endif # IP_DDCP |
diff --git a/net/dccp/ccids/ccid3.c b/net/dccp/ccids/ccid3.c index d7d9ce737244..ec7fa4d67f08 100644 --- a/net/dccp/ccids/ccid3.c +++ b/net/dccp/ccids/ccid3.c | |||
@@ -419,7 +419,6 @@ static void ccid3_hc_tx_packet_sent(struct sock *sk, int more, | |||
419 | 419 | ||
420 | static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb) | 420 | static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb) |
421 | { | 421 | { |
422 | const struct dccp_sock *dp = dccp_sk(sk); | ||
423 | struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk); | 422 | struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk); |
424 | struct ccid3_options_received *opt_recv; | 423 | struct ccid3_options_received *opt_recv; |
425 | struct dccp_tx_hist_entry *packet; | 424 | struct dccp_tx_hist_entry *packet; |
@@ -491,7 +490,7 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb) | |||
491 | ccid3_pr_debug("%s(%p), s=%u, MSS=%u, " | 490 | ccid3_pr_debug("%s(%p), s=%u, MSS=%u, " |
492 | "R_sample=%uus, X=%u\n", dccp_role(sk), | 491 | "R_sample=%uus, X=%u\n", dccp_role(sk), |
493 | sk, hctx->ccid3hctx_s, | 492 | sk, hctx->ccid3hctx_s, |
494 | dp->dccps_mss_cache, r_sample, | 493 | dccp_sk(sk)->dccps_mss_cache, r_sample, |
495 | (unsigned)(hctx->ccid3hctx_x >> 6)); | 494 | (unsigned)(hctx->ccid3hctx_x >> 6)); |
496 | 495 | ||
497 | ccid3_hc_tx_set_state(sk, TFRC_SSTATE_FBACK); | 496 | ccid3_hc_tx_set_state(sk, TFRC_SSTATE_FBACK); |
diff --git a/net/dccp/ipv6.c b/net/dccp/ipv6.c index 64eac2515aa2..31737cdf156a 100644 --- a/net/dccp/ipv6.c +++ b/net/dccp/ipv6.c | |||
@@ -1043,9 +1043,13 @@ static int dccp_v6_connect(struct sock *sk, struct sockaddr *uaddr, | |||
1043 | if (final_p) | 1043 | if (final_p) |
1044 | ipv6_addr_copy(&fl.fl6_dst, final_p); | 1044 | ipv6_addr_copy(&fl.fl6_dst, final_p); |
1045 | 1045 | ||
1046 | err = xfrm_lookup(&dst, &fl, sk, 1); | 1046 | err = __xfrm_lookup(&dst, &fl, sk, 1); |
1047 | if (err < 0) | 1047 | if (err < 0) { |
1048 | goto failure; | 1048 | if (err == -EREMOTE) |
1049 | err = ip6_dst_blackhole(sk, &dst, &fl); | ||
1050 | if (err < 0) | ||
1051 | goto failure; | ||
1052 | } | ||
1049 | 1053 | ||
1050 | if (saddr == NULL) { | 1054 | if (saddr == NULL) { |
1051 | saddr = &fl.fl6_src; | 1055 | saddr = &fl.fl6_src; |
diff --git a/net/ieee80211/ieee80211_module.c b/net/ieee80211/ieee80211_module.c index 7ec6610841ba..17ad278696ed 100644 --- a/net/ieee80211/ieee80211_module.c +++ b/net/ieee80211/ieee80211_module.c | |||
@@ -140,7 +140,7 @@ struct net_device *alloc_ieee80211(int sizeof_priv) | |||
140 | 140 | ||
141 | dev = alloc_etherdev(sizeof(struct ieee80211_device) + sizeof_priv); | 141 | dev = alloc_etherdev(sizeof(struct ieee80211_device) + sizeof_priv); |
142 | if (!dev) { | 142 | if (!dev) { |
143 | IEEE80211_ERROR("Unable to network device.\n"); | 143 | IEEE80211_ERROR("Unable to allocate network device.\n"); |
144 | goto failed; | 144 | goto failed; |
145 | } | 145 | } |
146 | ieee = netdev_priv(dev); | 146 | ieee = netdev_priv(dev); |
diff --git a/net/ieee80211/softmac/ieee80211softmac_module.c b/net/ieee80211/softmac/ieee80211softmac_module.c index e9cdc6615ddc..c308756c2f9d 100644 --- a/net/ieee80211/softmac/ieee80211softmac_module.c +++ b/net/ieee80211/softmac/ieee80211softmac_module.c | |||
@@ -33,7 +33,10 @@ struct net_device *alloc_ieee80211softmac(int sizeof_priv) | |||
33 | struct ieee80211softmac_device *softmac; | 33 | struct ieee80211softmac_device *softmac; |
34 | struct net_device *dev; | 34 | struct net_device *dev; |
35 | 35 | ||
36 | dev = alloc_ieee80211(sizeof(struct ieee80211softmac_device) + sizeof_priv); | 36 | dev = alloc_ieee80211(sizeof(*softmac) + sizeof_priv); |
37 | if (!dev) | ||
38 | return NULL; | ||
39 | |||
37 | softmac = ieee80211_priv(dev); | 40 | softmac = ieee80211_priv(dev); |
38 | softmac->dev = dev; | 41 | softmac->dev = dev; |
39 | softmac->ieee = netdev_priv(dev); | 42 | softmac->ieee = netdev_priv(dev); |
diff --git a/net/ipv4/Kconfig b/net/ipv4/Kconfig index c68196cc56ab..010fbb2d45e9 100644 --- a/net/ipv4/Kconfig +++ b/net/ipv4/Kconfig | |||
@@ -43,11 +43,11 @@ config IP_ADVANCED_ROUTER | |||
43 | asymmetric routing (packets from you to a host take a different path | 43 | asymmetric routing (packets from you to a host take a different path |
44 | than packets from that host to you) or if you operate a non-routing | 44 | than packets from that host to you) or if you operate a non-routing |
45 | host which has several IP addresses on different interfaces. To turn | 45 | host which has several IP addresses on different interfaces. To turn |
46 | rp_filter off use: | 46 | rp_filter on use: |
47 | 47 | ||
48 | echo 0 > /proc/sys/net/ipv4/conf/<device>/rp_filter | 48 | echo 1 > /proc/sys/net/ipv4/conf/<device>/rp_filter |
49 | or | 49 | or |
50 | echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter | 50 | echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter |
51 | 51 | ||
52 | If unsure, say N here. | 52 | If unsure, say N here. |
53 | 53 | ||
@@ -577,6 +577,7 @@ config TCP_CONG_VENO | |||
577 | config TCP_CONG_YEAH | 577 | config TCP_CONG_YEAH |
578 | tristate "YeAH TCP" | 578 | tristate "YeAH TCP" |
579 | depends on EXPERIMENTAL | 579 | depends on EXPERIMENTAL |
580 | select TCP_CONG_VEGAS | ||
580 | default n | 581 | default n |
581 | ---help--- | 582 | ---help--- |
582 | YeAH-TCP is a sender-side high-speed enabled TCP congestion control | 583 | YeAH-TCP is a sender-side high-speed enabled TCP congestion control |
diff --git a/net/ipv4/fib_hash.c b/net/ipv4/fib_hash.c index 9cfecf1215c9..07e843a47dde 100644 --- a/net/ipv4/fib_hash.c +++ b/net/ipv4/fib_hash.c | |||
@@ -456,6 +456,8 @@ static int fn_hash_insert(struct fib_table *tb, struct fib_config *cfg) | |||
456 | fib_release_info(fi_drop); | 456 | fib_release_info(fi_drop); |
457 | if (state & FA_S_ACCESSED) | 457 | if (state & FA_S_ACCESSED) |
458 | rt_cache_flush(-1); | 458 | rt_cache_flush(-1); |
459 | rtmsg_fib(RTM_NEWROUTE, key, fa, cfg->fc_dst_len, tb->tb_id, | ||
460 | &cfg->fc_nlinfo, NLM_F_REPLACE); | ||
459 | return 0; | 461 | return 0; |
460 | } | 462 | } |
461 | 463 | ||
@@ -523,7 +525,7 @@ static int fn_hash_insert(struct fib_table *tb, struct fib_config *cfg) | |||
523 | rt_cache_flush(-1); | 525 | rt_cache_flush(-1); |
524 | 526 | ||
525 | rtmsg_fib(RTM_NEWROUTE, key, new_fa, cfg->fc_dst_len, tb->tb_id, | 527 | rtmsg_fib(RTM_NEWROUTE, key, new_fa, cfg->fc_dst_len, tb->tb_id, |
526 | &cfg->fc_nlinfo); | 528 | &cfg->fc_nlinfo, 0); |
527 | return 0; | 529 | return 0; |
528 | 530 | ||
529 | out_free_new_fa: | 531 | out_free_new_fa: |
@@ -589,7 +591,7 @@ static int fn_hash_delete(struct fib_table *tb, struct fib_config *cfg) | |||
589 | 591 | ||
590 | fa = fa_to_delete; | 592 | fa = fa_to_delete; |
591 | rtmsg_fib(RTM_DELROUTE, key, fa, cfg->fc_dst_len, | 593 | rtmsg_fib(RTM_DELROUTE, key, fa, cfg->fc_dst_len, |
592 | tb->tb_id, &cfg->fc_nlinfo); | 594 | tb->tb_id, &cfg->fc_nlinfo, 0); |
593 | 595 | ||
594 | kill_fn = 0; | 596 | kill_fn = 0; |
595 | write_lock_bh(&fib_hash_lock); | 597 | write_lock_bh(&fib_hash_lock); |
diff --git a/net/ipv4/fib_lookup.h b/net/ipv4/fib_lookup.h index 0e8b70bad4e1..eef9eec17e0c 100644 --- a/net/ipv4/fib_lookup.h +++ b/net/ipv4/fib_lookup.h | |||
@@ -30,7 +30,8 @@ extern int fib_dump_info(struct sk_buff *skb, u32 pid, u32 seq, int event, | |||
30 | int dst_len, u8 tos, struct fib_info *fi, | 30 | int dst_len, u8 tos, struct fib_info *fi, |
31 | unsigned int); | 31 | unsigned int); |
32 | extern void rtmsg_fib(int event, __be32 key, struct fib_alias *fa, | 32 | extern void rtmsg_fib(int event, __be32 key, struct fib_alias *fa, |
33 | int dst_len, u32 tb_id, struct nl_info *info); | 33 | int dst_len, u32 tb_id, struct nl_info *info, |
34 | unsigned int nlm_flags); | ||
34 | extern struct fib_alias *fib_find_alias(struct list_head *fah, | 35 | extern struct fib_alias *fib_find_alias(struct list_head *fah, |
35 | u8 tos, u32 prio); | 36 | u8 tos, u32 prio); |
36 | extern int fib_detect_death(struct fib_info *fi, int order, | 37 | extern int fib_detect_death(struct fib_info *fi, int order, |
diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c index 406ea7050aed..bb94550d95c3 100644 --- a/net/ipv4/fib_semantics.c +++ b/net/ipv4/fib_semantics.c | |||
@@ -301,7 +301,8 @@ static inline size_t fib_nlmsg_size(struct fib_info *fi) | |||
301 | } | 301 | } |
302 | 302 | ||
303 | void rtmsg_fib(int event, __be32 key, struct fib_alias *fa, | 303 | void rtmsg_fib(int event, __be32 key, struct fib_alias *fa, |
304 | int dst_len, u32 tb_id, struct nl_info *info) | 304 | int dst_len, u32 tb_id, struct nl_info *info, |
305 | unsigned int nlm_flags) | ||
305 | { | 306 | { |
306 | struct sk_buff *skb; | 307 | struct sk_buff *skb; |
307 | u32 seq = info->nlh ? info->nlh->nlmsg_seq : 0; | 308 | u32 seq = info->nlh ? info->nlh->nlmsg_seq : 0; |
@@ -313,7 +314,7 @@ void rtmsg_fib(int event, __be32 key, struct fib_alias *fa, | |||
313 | 314 | ||
314 | err = fib_dump_info(skb, info->pid, seq, event, tb_id, | 315 | err = fib_dump_info(skb, info->pid, seq, event, tb_id, |
315 | fa->fa_type, fa->fa_scope, key, dst_len, | 316 | fa->fa_type, fa->fa_scope, key, dst_len, |
316 | fa->fa_tos, fa->fa_info, 0); | 317 | fa->fa_tos, fa->fa_info, nlm_flags); |
317 | if (err < 0) { | 318 | if (err < 0) { |
318 | /* -EMSGSIZE implies BUG in fib_nlmsg_size() */ | 319 | /* -EMSGSIZE implies BUG in fib_nlmsg_size() */ |
319 | WARN_ON(err == -EMSGSIZE); | 320 | WARN_ON(err == -EMSGSIZE); |
diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c index 9be7da7c3a8f..30e332ade61b 100644 --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c | |||
@@ -1226,6 +1226,8 @@ static int fn_trie_insert(struct fib_table *tb, struct fib_config *cfg) | |||
1226 | fib_release_info(fi_drop); | 1226 | fib_release_info(fi_drop); |
1227 | if (state & FA_S_ACCESSED) | 1227 | if (state & FA_S_ACCESSED) |
1228 | rt_cache_flush(-1); | 1228 | rt_cache_flush(-1); |
1229 | rtmsg_fib(RTM_NEWROUTE, htonl(key), new_fa, plen, | ||
1230 | tb->tb_id, &cfg->fc_nlinfo, NLM_F_REPLACE); | ||
1229 | 1231 | ||
1230 | goto succeeded; | 1232 | goto succeeded; |
1231 | } | 1233 | } |
@@ -1278,7 +1280,7 @@ static int fn_trie_insert(struct fib_table *tb, struct fib_config *cfg) | |||
1278 | 1280 | ||
1279 | rt_cache_flush(-1); | 1281 | rt_cache_flush(-1); |
1280 | rtmsg_fib(RTM_NEWROUTE, htonl(key), new_fa, plen, tb->tb_id, | 1282 | rtmsg_fib(RTM_NEWROUTE, htonl(key), new_fa, plen, tb->tb_id, |
1281 | &cfg->fc_nlinfo); | 1283 | &cfg->fc_nlinfo, 0); |
1282 | succeeded: | 1284 | succeeded: |
1283 | return 0; | 1285 | return 0; |
1284 | 1286 | ||
@@ -1624,7 +1626,7 @@ static int fn_trie_delete(struct fib_table *tb, struct fib_config *cfg) | |||
1624 | 1626 | ||
1625 | fa = fa_to_delete; | 1627 | fa = fa_to_delete; |
1626 | rtmsg_fib(RTM_DELROUTE, htonl(key), fa, plen, tb->tb_id, | 1628 | rtmsg_fib(RTM_DELROUTE, htonl(key), fa, plen, tb->tb_id, |
1627 | &cfg->fc_nlinfo); | 1629 | &cfg->fc_nlinfo, 0); |
1628 | 1630 | ||
1629 | l = fib_find_node(t, key); | 1631 | l = fib_find_node(t, key); |
1630 | li = find_leaf_info(l, plen); | 1632 | li = find_leaf_info(l, plen); |
diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c index d38cbba92a4d..e238b17f554c 100644 --- a/net/ipv4/icmp.c +++ b/net/ipv4/icmp.c | |||
@@ -514,7 +514,10 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info) | |||
514 | 514 | ||
515 | saddr = iph->daddr; | 515 | saddr = iph->daddr; |
516 | if (!(rt->rt_flags & RTCF_LOCAL)) { | 516 | if (!(rt->rt_flags & RTCF_LOCAL)) { |
517 | if (sysctl_icmp_errors_use_inbound_ifaddr) | 517 | /* This is broken, skb_in->dev points to the outgoing device |
518 | * after the packet passes through ip_output(). | ||
519 | */ | ||
520 | if (skb_in->dev && sysctl_icmp_errors_use_inbound_ifaddr) | ||
518 | saddr = inet_select_addr(skb_in->dev, 0, RT_SCOPE_LINK); | 521 | saddr = inet_select_addr(skb_in->dev, 0, RT_SCOPE_LINK); |
519 | else | 522 | else |
520 | saddr = 0; | 523 | saddr = 0; |
diff --git a/net/ipv4/ipvs/Kconfig b/net/ipv4/ipvs/Kconfig index 891b9355cf96..09d0c3f35669 100644 --- a/net/ipv4/ipvs/Kconfig +++ b/net/ipv4/ipvs/Kconfig | |||
@@ -1,10 +1,7 @@ | |||
1 | # | 1 | # |
2 | # IP Virtual Server configuration | 2 | # IP Virtual Server configuration |
3 | # | 3 | # |
4 | menu "IP: Virtual Server Configuration" | 4 | menuconfig IP_VS |
5 | depends on NETFILTER | ||
6 | |||
7 | config IP_VS | ||
8 | tristate "IP virtual server support (EXPERIMENTAL)" | 5 | tristate "IP virtual server support (EXPERIMENTAL)" |
9 | depends on NETFILTER | 6 | depends on NETFILTER |
10 | ---help--- | 7 | ---help--- |
@@ -25,9 +22,10 @@ config IP_VS | |||
25 | If you want to compile it in kernel, say Y. To compile it as a | 22 | If you want to compile it in kernel, say Y. To compile it as a |
26 | module, choose M here. If unsure, say N. | 23 | module, choose M here. If unsure, say N. |
27 | 24 | ||
25 | if IP_VS | ||
26 | |||
28 | config IP_VS_DEBUG | 27 | config IP_VS_DEBUG |
29 | bool "IP virtual server debugging" | 28 | bool "IP virtual server debugging" |
30 | depends on IP_VS | ||
31 | ---help--- | 29 | ---help--- |
32 | Say Y here if you want to get additional messages useful in | 30 | Say Y here if you want to get additional messages useful in |
33 | debugging the IP virtual server code. You can change the debug | 31 | debugging the IP virtual server code. You can change the debug |
@@ -35,7 +33,6 @@ config IP_VS_DEBUG | |||
35 | 33 | ||
36 | config IP_VS_TAB_BITS | 34 | config IP_VS_TAB_BITS |
37 | int "IPVS connection table size (the Nth power of 2)" | 35 | int "IPVS connection table size (the Nth power of 2)" |
38 | depends on IP_VS | ||
39 | default "12" | 36 | default "12" |
40 | ---help--- | 37 | ---help--- |
41 | The IPVS connection hash table uses the chaining scheme to handle | 38 | The IPVS connection hash table uses the chaining scheme to handle |
@@ -61,42 +58,35 @@ config IP_VS_TAB_BITS | |||
61 | needed for your box. | 58 | needed for your box. |
62 | 59 | ||
63 | comment "IPVS transport protocol load balancing support" | 60 | comment "IPVS transport protocol load balancing support" |
64 | depends on IP_VS | ||
65 | 61 | ||
66 | config IP_VS_PROTO_TCP | 62 | config IP_VS_PROTO_TCP |
67 | bool "TCP load balancing support" | 63 | bool "TCP load balancing support" |
68 | depends on IP_VS | ||
69 | ---help--- | 64 | ---help--- |
70 | This option enables support for load balancing TCP transport | 65 | This option enables support for load balancing TCP transport |
71 | protocol. Say Y if unsure. | 66 | protocol. Say Y if unsure. |
72 | 67 | ||
73 | config IP_VS_PROTO_UDP | 68 | config IP_VS_PROTO_UDP |
74 | bool "UDP load balancing support" | 69 | bool "UDP load balancing support" |
75 | depends on IP_VS | ||
76 | ---help--- | 70 | ---help--- |
77 | This option enables support for load balancing UDP transport | 71 | This option enables support for load balancing UDP transport |
78 | protocol. Say Y if unsure. | 72 | protocol. Say Y if unsure. |
79 | 73 | ||
80 | config IP_VS_PROTO_ESP | 74 | config IP_VS_PROTO_ESP |
81 | bool "ESP load balancing support" | 75 | bool "ESP load balancing support" |
82 | depends on IP_VS | ||
83 | ---help--- | 76 | ---help--- |
84 | This option enables support for load balancing ESP (Encapsulation | 77 | This option enables support for load balancing ESP (Encapsulation |
85 | Security Payload) transport protocol. Say Y if unsure. | 78 | Security Payload) transport protocol. Say Y if unsure. |
86 | 79 | ||
87 | config IP_VS_PROTO_AH | 80 | config IP_VS_PROTO_AH |
88 | bool "AH load balancing support" | 81 | bool "AH load balancing support" |
89 | depends on IP_VS | ||
90 | ---help--- | 82 | ---help--- |
91 | This option enables support for load balancing AH (Authentication | 83 | This option enables support for load balancing AH (Authentication |
92 | Header) transport protocol. Say Y if unsure. | 84 | Header) transport protocol. Say Y if unsure. |
93 | 85 | ||
94 | comment "IPVS scheduler" | 86 | comment "IPVS scheduler" |
95 | depends on IP_VS | ||
96 | 87 | ||
97 | config IP_VS_RR | 88 | config IP_VS_RR |
98 | tristate "round-robin scheduling" | 89 | tristate "round-robin scheduling" |
99 | depends on IP_VS | ||
100 | ---help--- | 90 | ---help--- |
101 | The robin-robin scheduling algorithm simply directs network | 91 | The robin-robin scheduling algorithm simply directs network |
102 | connections to different real servers in a round-robin manner. | 92 | connections to different real servers in a round-robin manner. |
@@ -106,7 +96,6 @@ config IP_VS_RR | |||
106 | 96 | ||
107 | config IP_VS_WRR | 97 | config IP_VS_WRR |
108 | tristate "weighted round-robin scheduling" | 98 | tristate "weighted round-robin scheduling" |
109 | depends on IP_VS | ||
110 | ---help--- | 99 | ---help--- |
111 | The weighted robin-robin scheduling algorithm directs network | 100 | The weighted robin-robin scheduling algorithm directs network |
112 | connections to different real servers based on server weights | 101 | connections to different real servers based on server weights |
@@ -120,7 +109,6 @@ config IP_VS_WRR | |||
120 | 109 | ||
121 | config IP_VS_LC | 110 | config IP_VS_LC |
122 | tristate "least-connection scheduling" | 111 | tristate "least-connection scheduling" |
123 | depends on IP_VS | ||
124 | ---help--- | 112 | ---help--- |
125 | The least-connection scheduling algorithm directs network | 113 | The least-connection scheduling algorithm directs network |
126 | connections to the server with the least number of active | 114 | connections to the server with the least number of active |
@@ -131,7 +119,6 @@ config IP_VS_LC | |||
131 | 119 | ||
132 | config IP_VS_WLC | 120 | config IP_VS_WLC |
133 | tristate "weighted least-connection scheduling" | 121 | tristate "weighted least-connection scheduling" |
134 | depends on IP_VS | ||
135 | ---help--- | 122 | ---help--- |
136 | The weighted least-connection scheduling algorithm directs network | 123 | The weighted least-connection scheduling algorithm directs network |
137 | connections to the server with the least active connections | 124 | connections to the server with the least active connections |
@@ -142,7 +129,6 @@ config IP_VS_WLC | |||
142 | 129 | ||
143 | config IP_VS_LBLC | 130 | config IP_VS_LBLC |
144 | tristate "locality-based least-connection scheduling" | 131 | tristate "locality-based least-connection scheduling" |
145 | depends on IP_VS | ||
146 | ---help--- | 132 | ---help--- |
147 | The locality-based least-connection scheduling algorithm is for | 133 | The locality-based least-connection scheduling algorithm is for |
148 | destination IP load balancing. It is usually used in cache cluster. | 134 | destination IP load balancing. It is usually used in cache cluster. |
@@ -157,7 +143,6 @@ config IP_VS_LBLC | |||
157 | 143 | ||
158 | config IP_VS_LBLCR | 144 | config IP_VS_LBLCR |
159 | tristate "locality-based least-connection with replication scheduling" | 145 | tristate "locality-based least-connection with replication scheduling" |
160 | depends on IP_VS | ||
161 | ---help--- | 146 | ---help--- |
162 | The locality-based least-connection with replication scheduling | 147 | The locality-based least-connection with replication scheduling |
163 | algorithm is also for destination IP load balancing. It is | 148 | algorithm is also for destination IP load balancing. It is |
@@ -176,7 +161,6 @@ config IP_VS_LBLCR | |||
176 | 161 | ||
177 | config IP_VS_DH | 162 | config IP_VS_DH |
178 | tristate "destination hashing scheduling" | 163 | tristate "destination hashing scheduling" |
179 | depends on IP_VS | ||
180 | ---help--- | 164 | ---help--- |
181 | The destination hashing scheduling algorithm assigns network | 165 | The destination hashing scheduling algorithm assigns network |
182 | connections to the servers through looking up a statically assigned | 166 | connections to the servers through looking up a statically assigned |
@@ -187,7 +171,6 @@ config IP_VS_DH | |||
187 | 171 | ||
188 | config IP_VS_SH | 172 | config IP_VS_SH |
189 | tristate "source hashing scheduling" | 173 | tristate "source hashing scheduling" |
190 | depends on IP_VS | ||
191 | ---help--- | 174 | ---help--- |
192 | The source hashing scheduling algorithm assigns network | 175 | The source hashing scheduling algorithm assigns network |
193 | connections to the servers through looking up a statically assigned | 176 | connections to the servers through looking up a statically assigned |
@@ -198,7 +181,6 @@ config IP_VS_SH | |||
198 | 181 | ||
199 | config IP_VS_SED | 182 | config IP_VS_SED |
200 | tristate "shortest expected delay scheduling" | 183 | tristate "shortest expected delay scheduling" |
201 | depends on IP_VS | ||
202 | ---help--- | 184 | ---help--- |
203 | The shortest expected delay scheduling algorithm assigns network | 185 | The shortest expected delay scheduling algorithm assigns network |
204 | connections to the server with the shortest expected delay. The | 186 | connections to the server with the shortest expected delay. The |
@@ -212,7 +194,6 @@ config IP_VS_SED | |||
212 | 194 | ||
213 | config IP_VS_NQ | 195 | config IP_VS_NQ |
214 | tristate "never queue scheduling" | 196 | tristate "never queue scheduling" |
215 | depends on IP_VS | ||
216 | ---help--- | 197 | ---help--- |
217 | The never queue scheduling algorithm adopts a two-speed model. | 198 | The never queue scheduling algorithm adopts a two-speed model. |
218 | When there is an idle server available, the job will be sent to | 199 | When there is an idle server available, the job will be sent to |
@@ -225,11 +206,10 @@ config IP_VS_NQ | |||
225 | module, choose M here. If unsure, say N. | 206 | module, choose M here. If unsure, say N. |
226 | 207 | ||
227 | comment 'IPVS application helper' | 208 | comment 'IPVS application helper' |
228 | depends on IP_VS | ||
229 | 209 | ||
230 | config IP_VS_FTP | 210 | config IP_VS_FTP |
231 | tristate "FTP protocol helper" | 211 | tristate "FTP protocol helper" |
232 | depends on IP_VS && IP_VS_PROTO_TCP | 212 | depends on IP_VS_PROTO_TCP |
233 | ---help--- | 213 | ---help--- |
234 | FTP is a protocol that transfers IP address and/or port number in | 214 | FTP is a protocol that transfers IP address and/or port number in |
235 | the payload. In the virtual server via Network Address Translation, | 215 | the payload. In the virtual server via Network Address Translation, |
@@ -241,4 +221,4 @@ config IP_VS_FTP | |||
241 | If you want to compile it in kernel, say Y. To compile it as a | 221 | If you want to compile it in kernel, say Y. To compile it as a |
242 | module, choose M here. If unsure, say N. | 222 | module, choose M here. If unsure, say N. |
243 | 223 | ||
244 | endmenu | 224 | endif # IP_VS |
diff --git a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c index 0654eaae70c9..fd62a41d69cc 100644 --- a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c +++ b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c | |||
@@ -154,12 +154,10 @@ static unsigned int ipv4_conntrack_defrag(unsigned int hooknum, | |||
154 | const struct net_device *out, | 154 | const struct net_device *out, |
155 | int (*okfn)(struct sk_buff *)) | 155 | int (*okfn)(struct sk_buff *)) |
156 | { | 156 | { |
157 | #if !defined(CONFIG_IP_NF_NAT) && !defined(CONFIG_IP_NF_NAT_MODULE) | ||
158 | /* Previously seen (loopback)? Ignore. Do this before | 157 | /* Previously seen (loopback)? Ignore. Do this before |
159 | fragment check. */ | 158 | fragment check. */ |
160 | if ((*pskb)->nfct) | 159 | if ((*pskb)->nfct) |
161 | return NF_ACCEPT; | 160 | return NF_ACCEPT; |
162 | #endif | ||
163 | 161 | ||
164 | /* Gather fragments. */ | 162 | /* Gather fragments. */ |
165 | if (ip_hdr(*pskb)->frag_off & htons(IP_MF | IP_OFFSET)) { | 163 | if (ip_hdr(*pskb)->frag_off & htons(IP_MF | IP_OFFSET)) { |
diff --git a/net/ipv4/netfilter/nf_nat_ftp.c b/net/ipv4/netfilter/nf_nat_ftp.c index 751b59801755..e6bc8e5a72f1 100644 --- a/net/ipv4/netfilter/nf_nat_ftp.c +++ b/net/ipv4/netfilter/nf_nat_ftp.c | |||
@@ -40,8 +40,7 @@ mangle_rfc959_packet(struct sk_buff **pskb, | |||
40 | unsigned int matchoff, | 40 | unsigned int matchoff, |
41 | unsigned int matchlen, | 41 | unsigned int matchlen, |
42 | struct nf_conn *ct, | 42 | struct nf_conn *ct, |
43 | enum ip_conntrack_info ctinfo, | 43 | enum ip_conntrack_info ctinfo) |
44 | u32 *seq) | ||
45 | { | 44 | { |
46 | char buffer[sizeof("nnn,nnn,nnn,nnn,nnn,nnn")]; | 45 | char buffer[sizeof("nnn,nnn,nnn,nnn,nnn,nnn")]; |
47 | 46 | ||
@@ -50,7 +49,6 @@ mangle_rfc959_packet(struct sk_buff **pskb, | |||
50 | 49 | ||
51 | DEBUGP("calling nf_nat_mangle_tcp_packet\n"); | 50 | DEBUGP("calling nf_nat_mangle_tcp_packet\n"); |
52 | 51 | ||
53 | *seq += strlen(buffer) - matchlen; | ||
54 | return nf_nat_mangle_tcp_packet(pskb, ct, ctinfo, matchoff, | 52 | return nf_nat_mangle_tcp_packet(pskb, ct, ctinfo, matchoff, |
55 | matchlen, buffer, strlen(buffer)); | 53 | matchlen, buffer, strlen(buffer)); |
56 | } | 54 | } |
@@ -63,8 +61,7 @@ mangle_eprt_packet(struct sk_buff **pskb, | |||
63 | unsigned int matchoff, | 61 | unsigned int matchoff, |
64 | unsigned int matchlen, | 62 | unsigned int matchlen, |
65 | struct nf_conn *ct, | 63 | struct nf_conn *ct, |
66 | enum ip_conntrack_info ctinfo, | 64 | enum ip_conntrack_info ctinfo) |
67 | u32 *seq) | ||
68 | { | 65 | { |
69 | char buffer[sizeof("|1|255.255.255.255|65535|")]; | 66 | char buffer[sizeof("|1|255.255.255.255|65535|")]; |
70 | 67 | ||
@@ -72,7 +69,6 @@ mangle_eprt_packet(struct sk_buff **pskb, | |||
72 | 69 | ||
73 | DEBUGP("calling nf_nat_mangle_tcp_packet\n"); | 70 | DEBUGP("calling nf_nat_mangle_tcp_packet\n"); |
74 | 71 | ||
75 | *seq += strlen(buffer) - matchlen; | ||
76 | return nf_nat_mangle_tcp_packet(pskb, ct, ctinfo, matchoff, | 72 | return nf_nat_mangle_tcp_packet(pskb, ct, ctinfo, matchoff, |
77 | matchlen, buffer, strlen(buffer)); | 73 | matchlen, buffer, strlen(buffer)); |
78 | } | 74 | } |
@@ -85,8 +81,7 @@ mangle_epsv_packet(struct sk_buff **pskb, | |||
85 | unsigned int matchoff, | 81 | unsigned int matchoff, |
86 | unsigned int matchlen, | 82 | unsigned int matchlen, |
87 | struct nf_conn *ct, | 83 | struct nf_conn *ct, |
88 | enum ip_conntrack_info ctinfo, | 84 | enum ip_conntrack_info ctinfo) |
89 | u32 *seq) | ||
90 | { | 85 | { |
91 | char buffer[sizeof("|||65535|")]; | 86 | char buffer[sizeof("|||65535|")]; |
92 | 87 | ||
@@ -94,14 +89,13 @@ mangle_epsv_packet(struct sk_buff **pskb, | |||
94 | 89 | ||
95 | DEBUGP("calling nf_nat_mangle_tcp_packet\n"); | 90 | DEBUGP("calling nf_nat_mangle_tcp_packet\n"); |
96 | 91 | ||
97 | *seq += strlen(buffer) - matchlen; | ||
98 | return nf_nat_mangle_tcp_packet(pskb, ct, ctinfo, matchoff, | 92 | return nf_nat_mangle_tcp_packet(pskb, ct, ctinfo, matchoff, |
99 | matchlen, buffer, strlen(buffer)); | 93 | matchlen, buffer, strlen(buffer)); |
100 | } | 94 | } |
101 | 95 | ||
102 | static int (*mangle[])(struct sk_buff **, __be32, u_int16_t, | 96 | static int (*mangle[])(struct sk_buff **, __be32, u_int16_t, |
103 | unsigned int, unsigned int, struct nf_conn *, | 97 | unsigned int, unsigned int, struct nf_conn *, |
104 | enum ip_conntrack_info, u32 *seq) | 98 | enum ip_conntrack_info) |
105 | = { | 99 | = { |
106 | [NF_CT_FTP_PORT] = mangle_rfc959_packet, | 100 | [NF_CT_FTP_PORT] = mangle_rfc959_packet, |
107 | [NF_CT_FTP_PASV] = mangle_rfc959_packet, | 101 | [NF_CT_FTP_PASV] = mangle_rfc959_packet, |
@@ -116,8 +110,7 @@ static unsigned int nf_nat_ftp(struct sk_buff **pskb, | |||
116 | enum nf_ct_ftp_type type, | 110 | enum nf_ct_ftp_type type, |
117 | unsigned int matchoff, | 111 | unsigned int matchoff, |
118 | unsigned int matchlen, | 112 | unsigned int matchlen, |
119 | struct nf_conntrack_expect *exp, | 113 | struct nf_conntrack_expect *exp) |
120 | u32 *seq) | ||
121 | { | 114 | { |
122 | __be32 newip; | 115 | __be32 newip; |
123 | u_int16_t port; | 116 | u_int16_t port; |
@@ -145,8 +138,7 @@ static unsigned int nf_nat_ftp(struct sk_buff **pskb, | |||
145 | if (port == 0) | 138 | if (port == 0) |
146 | return NF_DROP; | 139 | return NF_DROP; |
147 | 140 | ||
148 | if (!mangle[type](pskb, newip, port, matchoff, matchlen, ct, ctinfo, | 141 | if (!mangle[type](pskb, newip, port, matchoff, matchlen, ct, ctinfo)) { |
149 | seq)) { | ||
150 | nf_conntrack_unexpect_related(exp); | 142 | nf_conntrack_unexpect_related(exp); |
151 | return NF_DROP; | 143 | return NF_DROP; |
152 | } | 144 | } |
diff --git a/net/ipv4/netfilter/nf_nat_h323.c b/net/ipv4/netfilter/nf_nat_h323.c index fcebc968d37f..c5d2a2d690b8 100644 --- a/net/ipv4/netfilter/nf_nat_h323.c +++ b/net/ipv4/netfilter/nf_nat_h323.c | |||
@@ -455,9 +455,9 @@ static int nat_q931(struct sk_buff **pskb, struct nf_conn *ct, | |||
455 | if (idx > 0 && | 455 | if (idx > 0 && |
456 | get_h225_addr(ct, *data, &taddr[0], &addr, &port) && | 456 | get_h225_addr(ct, *data, &taddr[0], &addr, &port) && |
457 | (ntohl(addr.ip) & 0xff000000) == 0x7f000000) { | 457 | (ntohl(addr.ip) & 0xff000000) == 0x7f000000) { |
458 | set_h225_addr_hook(pskb, data, 0, &taddr[0], | 458 | set_h225_addr(pskb, data, 0, &taddr[0], |
459 | &ct->tuplehash[!dir].tuple.dst.u3, | 459 | &ct->tuplehash[!dir].tuple.dst.u3, |
460 | info->sig_port[!dir]); | 460 | info->sig_port[!dir]); |
461 | } | 461 | } |
462 | } else { | 462 | } else { |
463 | nf_conntrack_unexpect_related(exp); | 463 | nf_conntrack_unexpect_related(exp); |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index cb76e3c725a0..8603cfb271f2 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
@@ -2396,7 +2396,7 @@ static int ip_route_output_slow(struct rtable **rp, const struct flowi *oldflp) | |||
2396 | 2396 | ||
2397 | /* It is equivalent to inet_addr_type(saddr) == RTN_LOCAL */ | 2397 | /* It is equivalent to inet_addr_type(saddr) == RTN_LOCAL */ |
2398 | dev_out = ip_dev_find(oldflp->fl4_src); | 2398 | dev_out = ip_dev_find(oldflp->fl4_src); |
2399 | if ((dev_out == NULL) && !(sysctl_ip_nonlocal_bind)) | 2399 | if (dev_out == NULL) |
2400 | goto out; | 2400 | goto out; |
2401 | 2401 | ||
2402 | /* I removed check for oif == dev_out->oif here. | 2402 | /* I removed check for oif == dev_out->oif here. |
@@ -2407,7 +2407,7 @@ static int ip_route_output_slow(struct rtable **rp, const struct flowi *oldflp) | |||
2407 | of another iface. --ANK | 2407 | of another iface. --ANK |
2408 | */ | 2408 | */ |
2409 | 2409 | ||
2410 | if (dev_out && oldflp->oif == 0 | 2410 | if (oldflp->oif == 0 |
2411 | && (MULTICAST(oldflp->fl4_dst) || oldflp->fl4_dst == htonl(0xFFFFFFFF))) { | 2411 | && (MULTICAST(oldflp->fl4_dst) || oldflp->fl4_dst == htonl(0xFFFFFFFF))) { |
2412 | /* Special hack: user can direct multicasts | 2412 | /* Special hack: user can direct multicasts |
2413 | and limited broadcast via necessary interface | 2413 | and limited broadcast via necessary interface |
@@ -2598,6 +2598,69 @@ int __ip_route_output_key(struct rtable **rp, const struct flowi *flp) | |||
2598 | 2598 | ||
2599 | EXPORT_SYMBOL_GPL(__ip_route_output_key); | 2599 | EXPORT_SYMBOL_GPL(__ip_route_output_key); |
2600 | 2600 | ||
2601 | static void ipv4_rt_blackhole_update_pmtu(struct dst_entry *dst, u32 mtu) | ||
2602 | { | ||
2603 | } | ||
2604 | |||
2605 | static struct dst_ops ipv4_dst_blackhole_ops = { | ||
2606 | .family = AF_INET, | ||
2607 | .protocol = __constant_htons(ETH_P_IP), | ||
2608 | .destroy = ipv4_dst_destroy, | ||
2609 | .check = ipv4_dst_check, | ||
2610 | .update_pmtu = ipv4_rt_blackhole_update_pmtu, | ||
2611 | .entry_size = sizeof(struct rtable), | ||
2612 | }; | ||
2613 | |||
2614 | |||
2615 | static int ipv4_blackhole_output(struct sk_buff *skb) | ||
2616 | { | ||
2617 | kfree_skb(skb); | ||
2618 | return 0; | ||
2619 | } | ||
2620 | |||
2621 | static int ipv4_dst_blackhole(struct rtable **rp, struct flowi *flp, struct sock *sk) | ||
2622 | { | ||
2623 | struct rtable *ort = *rp; | ||
2624 | struct rtable *rt = (struct rtable *) | ||
2625 | dst_alloc(&ipv4_dst_blackhole_ops); | ||
2626 | |||
2627 | if (rt) { | ||
2628 | struct dst_entry *new = &rt->u.dst; | ||
2629 | |||
2630 | atomic_set(&new->__refcnt, 1); | ||
2631 | new->__use = 1; | ||
2632 | new->input = ipv4_blackhole_output; | ||
2633 | new->output = ipv4_blackhole_output; | ||
2634 | memcpy(new->metrics, ort->u.dst.metrics, RTAX_MAX*sizeof(u32)); | ||
2635 | |||
2636 | new->dev = ort->u.dst.dev; | ||
2637 | if (new->dev) | ||
2638 | dev_hold(new->dev); | ||
2639 | |||
2640 | rt->fl = ort->fl; | ||
2641 | |||
2642 | rt->idev = ort->idev; | ||
2643 | if (rt->idev) | ||
2644 | in_dev_hold(rt->idev); | ||
2645 | rt->rt_flags = ort->rt_flags; | ||
2646 | rt->rt_type = ort->rt_type; | ||
2647 | rt->rt_dst = ort->rt_dst; | ||
2648 | rt->rt_src = ort->rt_src; | ||
2649 | rt->rt_iif = ort->rt_iif; | ||
2650 | rt->rt_gateway = ort->rt_gateway; | ||
2651 | rt->rt_spec_dst = ort->rt_spec_dst; | ||
2652 | rt->peer = ort->peer; | ||
2653 | if (rt->peer) | ||
2654 | atomic_inc(&rt->peer->refcnt); | ||
2655 | |||
2656 | dst_free(new); | ||
2657 | } | ||
2658 | |||
2659 | dst_release(&(*rp)->u.dst); | ||
2660 | *rp = rt; | ||
2661 | return (rt ? 0 : -ENOMEM); | ||
2662 | } | ||
2663 | |||
2601 | int ip_route_output_flow(struct rtable **rp, struct flowi *flp, struct sock *sk, int flags) | 2664 | int ip_route_output_flow(struct rtable **rp, struct flowi *flp, struct sock *sk, int flags) |
2602 | { | 2665 | { |
2603 | int err; | 2666 | int err; |
@@ -2610,7 +2673,11 @@ int ip_route_output_flow(struct rtable **rp, struct flowi *flp, struct sock *sk, | |||
2610 | flp->fl4_src = (*rp)->rt_src; | 2673 | flp->fl4_src = (*rp)->rt_src; |
2611 | if (!flp->fl4_dst) | 2674 | if (!flp->fl4_dst) |
2612 | flp->fl4_dst = (*rp)->rt_dst; | 2675 | flp->fl4_dst = (*rp)->rt_dst; |
2613 | return xfrm_lookup((struct dst_entry **)rp, flp, sk, flags); | 2676 | err = __xfrm_lookup((struct dst_entry **)rp, flp, sk, flags); |
2677 | if (err == -EREMOTE) | ||
2678 | err = ipv4_dst_blackhole(rp, flp, sk); | ||
2679 | |||
2680 | return err; | ||
2614 | } | 2681 | } |
2615 | 2682 | ||
2616 | return 0; | 2683 | return 0; |
@@ -3139,6 +3206,8 @@ int __init ip_rt_init(void) | |||
3139 | kmem_cache_create("ip_dst_cache", sizeof(struct rtable), 0, | 3206 | kmem_cache_create("ip_dst_cache", sizeof(struct rtable), 0, |
3140 | SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL); | 3207 | SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL); |
3141 | 3208 | ||
3209 | ipv4_dst_blackhole_ops.kmem_cachep = ipv4_dst_ops.kmem_cachep; | ||
3210 | |||
3142 | rt_hash_table = (struct rt_hash_bucket *) | 3211 | rt_hash_table = (struct rt_hash_bucket *) |
3143 | alloc_large_system_hash("IP route cache", | 3212 | alloc_large_system_hash("IP route cache", |
3144 | sizeof(struct rt_hash_bucket), | 3213 | sizeof(struct rt_hash_bucket), |
diff --git a/net/ipv4/tcp_cong.c b/net/ipv4/tcp_cong.c index 86b26539e54b..1260e52ad772 100644 --- a/net/ipv4/tcp_cong.c +++ b/net/ipv4/tcp_cong.c | |||
@@ -276,30 +276,34 @@ int tcp_set_congestion_control(struct sock *sk, const char *name) | |||
276 | 276 | ||
277 | 277 | ||
278 | /* | 278 | /* |
279 | * Slow start (exponential increase) with | 279 | * Slow start is used when congestion window is less than slow start |
280 | * RFC3742 Limited Slow Start (fast linear increase) support. | 280 | * threshold. This version implements the basic RFC2581 version |
281 | * and optionally supports: | ||
282 | * RFC3742 Limited Slow Start - growth limited to max_ssthresh | ||
283 | * RFC3465 Appropriate Byte Counting - growth limited by bytes acknowledged | ||
281 | */ | 284 | */ |
282 | void tcp_slow_start(struct tcp_sock *tp) | 285 | void tcp_slow_start(struct tcp_sock *tp) |
283 | { | 286 | { |
284 | int cnt = 0; | 287 | int cnt; /* increase in packets */ |
285 | 288 | ||
286 | if (sysctl_tcp_abc) { | 289 | /* RFC3465: ABC Slow start |
287 | /* RFC3465: Slow Start | 290 | * Increase only after a full MSS of bytes is acked |
288 | * TCP sender SHOULD increase cwnd by the number of | 291 | * |
289 | * previously unacknowledged bytes ACKed by each incoming | 292 | * TCP sender SHOULD increase cwnd by the number of |
290 | * acknowledgment, provided the increase is not more than L | 293 | * previously unacknowledged bytes ACKed by each incoming |
291 | */ | 294 | * acknowledgment, provided the increase is not more than L |
292 | if (tp->bytes_acked < tp->mss_cache) | 295 | */ |
293 | return; | 296 | if (sysctl_tcp_abc && tp->bytes_acked < tp->mss_cache) |
294 | } | 297 | return; |
295 | 298 | ||
296 | if (sysctl_tcp_max_ssthresh > 0 && | 299 | if (sysctl_tcp_max_ssthresh > 0 && tp->snd_cwnd > sysctl_tcp_max_ssthresh) |
297 | tp->snd_cwnd > sysctl_tcp_max_ssthresh) | 300 | cnt = sysctl_tcp_max_ssthresh >> 1; /* limited slow start */ |
298 | cnt += sysctl_tcp_max_ssthresh>>1; | ||
299 | else | 301 | else |
300 | cnt += tp->snd_cwnd; | 302 | cnt = tp->snd_cwnd; /* exponential increase */ |
301 | 303 | ||
302 | /* RFC3465: We MAY increase by 2 if discovered delayed ack */ | 304 | /* RFC3465: ABC |
305 | * We MAY increase by 2 if discovered delayed ack | ||
306 | */ | ||
303 | if (sysctl_tcp_abc > 1 && tp->bytes_acked >= 2*tp->mss_cache) | 307 | if (sysctl_tcp_abc > 1 && tp->bytes_acked >= 2*tp->mss_cache) |
304 | cnt <<= 1; | 308 | cnt <<= 1; |
305 | tp->bytes_acked = 0; | 309 | tp->bytes_acked = 0; |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 7641b2761a14..38cb25b48bf3 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -1501,6 +1501,8 @@ void tcp_enter_loss(struct sock *sk, int how) | |||
1501 | tcp_set_ca_state(sk, TCP_CA_Loss); | 1501 | tcp_set_ca_state(sk, TCP_CA_Loss); |
1502 | tp->high_seq = tp->snd_nxt; | 1502 | tp->high_seq = tp->snd_nxt; |
1503 | TCP_ECN_queue_cwr(tp); | 1503 | TCP_ECN_queue_cwr(tp); |
1504 | /* Abort FRTO algorithm if one is in progress */ | ||
1505 | tp->frto_counter = 0; | ||
1504 | 1506 | ||
1505 | clear_all_retrans_hints(tp); | 1507 | clear_all_retrans_hints(tp); |
1506 | } | 1508 | } |
@@ -2608,6 +2610,7 @@ static void tcp_conservative_spur_to_response(struct tcp_sock *tp) | |||
2608 | { | 2610 | { |
2609 | tp->snd_cwnd = min(tp->snd_cwnd, tp->snd_ssthresh); | 2611 | tp->snd_cwnd = min(tp->snd_cwnd, tp->snd_ssthresh); |
2610 | tp->snd_cwnd_cnt = 0; | 2612 | tp->snd_cwnd_cnt = 0; |
2613 | TCP_ECN_queue_cwr(tp); | ||
2611 | tcp_moderate_cwnd(tp); | 2614 | tcp_moderate_cwnd(tp); |
2612 | } | 2615 | } |
2613 | 2616 | ||
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index c7ea248fae2e..329de679ac38 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -2154,15 +2154,6 @@ static void addrconf_dev_config(struct net_device *dev) | |||
2154 | 2154 | ||
2155 | ASSERT_RTNL(); | 2155 | ASSERT_RTNL(); |
2156 | 2156 | ||
2157 | if ((dev->type != ARPHRD_ETHER) && | ||
2158 | (dev->type != ARPHRD_FDDI) && | ||
2159 | (dev->type != ARPHRD_IEEE802_TR) && | ||
2160 | (dev->type != ARPHRD_ARCNET) && | ||
2161 | (dev->type != ARPHRD_INFINIBAND)) { | ||
2162 | /* Alas, we support only Ethernet autoconfiguration. */ | ||
2163 | return; | ||
2164 | } | ||
2165 | |||
2166 | idev = addrconf_add_dev(dev); | 2157 | idev = addrconf_add_dev(dev); |
2167 | if (idev == NULL) | 2158 | if (idev == NULL) |
2168 | return; | 2159 | return; |
@@ -2250,13 +2241,33 @@ static void addrconf_ip6_tnl_config(struct net_device *dev) | |||
2250 | ip6_tnl_add_linklocal(idev); | 2241 | ip6_tnl_add_linklocal(idev); |
2251 | } | 2242 | } |
2252 | 2243 | ||
2244 | static int ipv6_hwtype(struct net_device *dev) | ||
2245 | { | ||
2246 | if ((dev->type == ARPHRD_ETHER) || | ||
2247 | (dev->type == ARPHRD_LOOPBACK) || | ||
2248 | (dev->type == ARPHRD_SIT) || | ||
2249 | (dev->type == ARPHRD_TUNNEL6) || | ||
2250 | (dev->type == ARPHRD_FDDI) || | ||
2251 | (dev->type == ARPHRD_IEEE802_TR) || | ||
2252 | (dev->type == ARPHRD_ARCNET) || | ||
2253 | (dev->type == ARPHRD_INFINIBAND)) | ||
2254 | return 1; | ||
2255 | |||
2256 | return 0; | ||
2257 | } | ||
2258 | |||
2253 | static int addrconf_notify(struct notifier_block *this, unsigned long event, | 2259 | static int addrconf_notify(struct notifier_block *this, unsigned long event, |
2254 | void * data) | 2260 | void * data) |
2255 | { | 2261 | { |
2256 | struct net_device *dev = (struct net_device *) data; | 2262 | struct net_device *dev = (struct net_device *) data; |
2257 | struct inet6_dev *idev = __in6_dev_get(dev); | 2263 | struct inet6_dev *idev; |
2258 | int run_pending = 0; | 2264 | int run_pending = 0; |
2259 | 2265 | ||
2266 | if (!ipv6_hwtype(dev)) | ||
2267 | return NOTIFY_OK; | ||
2268 | |||
2269 | idev = __in6_dev_get(dev); | ||
2270 | |||
2260 | switch(event) { | 2271 | switch(event) { |
2261 | case NETDEV_REGISTER: | 2272 | case NETDEV_REGISTER: |
2262 | if (!idev) { | 2273 | if (!idev) { |
diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c index 403eee66b9c5..b1fe7ac5dc90 100644 --- a/net/ipv6/datagram.c +++ b/net/ipv6/datagram.c | |||
@@ -177,8 +177,12 @@ ipv4_connected: | |||
177 | if (final_p) | 177 | if (final_p) |
178 | ipv6_addr_copy(&fl.fl6_dst, final_p); | 178 | ipv6_addr_copy(&fl.fl6_dst, final_p); |
179 | 179 | ||
180 | if ((err = xfrm_lookup(&dst, &fl, sk, 1)) < 0) | 180 | if ((err = __xfrm_lookup(&dst, &fl, sk, 1)) < 0) { |
181 | goto out; | 181 | if (err == -EREMOTE) |
182 | err = ip6_dst_blackhole(sk, &dst, &fl); | ||
183 | if (err < 0) | ||
184 | goto out; | ||
185 | } | ||
182 | 186 | ||
183 | /* source address lookup done in ip6_dst_lookup */ | 187 | /* source address lookup done in ip6_dst_lookup */ |
184 | 188 | ||
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index 009a1047fc3f..a58459a76684 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c | |||
@@ -818,8 +818,12 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk, | |||
818 | if (final_p) | 818 | if (final_p) |
819 | ipv6_addr_copy(&fl.fl6_dst, final_p); | 819 | ipv6_addr_copy(&fl.fl6_dst, final_p); |
820 | 820 | ||
821 | if ((err = xfrm_lookup(&dst, &fl, sk, 1)) < 0) | 821 | if ((err = __xfrm_lookup(&dst, &fl, sk, 1)) < 0) { |
822 | goto out; | 822 | if (err == -EREMOTE) |
823 | err = ip6_dst_blackhole(sk, &dst, &fl); | ||
824 | if (err < 0) | ||
825 | goto out; | ||
826 | } | ||
823 | 827 | ||
824 | if (hlimit < 0) { | 828 | if (hlimit < 0) { |
825 | if (ipv6_addr_is_multicast(&fl.fl6_dst)) | 829 | if (ipv6_addr_is_multicast(&fl.fl6_dst)) |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index b46ad53044ba..1324b06796c0 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
@@ -119,6 +119,19 @@ static struct dst_ops ip6_dst_ops = { | |||
119 | .entry_size = sizeof(struct rt6_info), | 119 | .entry_size = sizeof(struct rt6_info), |
120 | }; | 120 | }; |
121 | 121 | ||
122 | static void ip6_rt_blackhole_update_pmtu(struct dst_entry *dst, u32 mtu) | ||
123 | { | ||
124 | } | ||
125 | |||
126 | static struct dst_ops ip6_dst_blackhole_ops = { | ||
127 | .family = AF_INET6, | ||
128 | .protocol = __constant_htons(ETH_P_IPV6), | ||
129 | .destroy = ip6_dst_destroy, | ||
130 | .check = ip6_dst_check, | ||
131 | .update_pmtu = ip6_rt_blackhole_update_pmtu, | ||
132 | .entry_size = sizeof(struct rt6_info), | ||
133 | }; | ||
134 | |||
122 | struct rt6_info ip6_null_entry = { | 135 | struct rt6_info ip6_null_entry = { |
123 | .u = { | 136 | .u = { |
124 | .dst = { | 137 | .dst = { |
@@ -833,6 +846,54 @@ struct dst_entry * ip6_route_output(struct sock *sk, struct flowi *fl) | |||
833 | 846 | ||
834 | EXPORT_SYMBOL(ip6_route_output); | 847 | EXPORT_SYMBOL(ip6_route_output); |
835 | 848 | ||
849 | static int ip6_blackhole_output(struct sk_buff *skb) | ||
850 | { | ||
851 | kfree_skb(skb); | ||
852 | return 0; | ||
853 | } | ||
854 | |||
855 | int ip6_dst_blackhole(struct sock *sk, struct dst_entry **dstp, struct flowi *fl) | ||
856 | { | ||
857 | struct rt6_info *ort = (struct rt6_info *) *dstp; | ||
858 | struct rt6_info *rt = (struct rt6_info *) | ||
859 | dst_alloc(&ip6_dst_blackhole_ops); | ||
860 | struct dst_entry *new = NULL; | ||
861 | |||
862 | if (rt) { | ||
863 | new = &rt->u.dst; | ||
864 | |||
865 | atomic_set(&new->__refcnt, 1); | ||
866 | new->__use = 1; | ||
867 | new->input = ip6_blackhole_output; | ||
868 | new->output = ip6_blackhole_output; | ||
869 | |||
870 | memcpy(new->metrics, ort->u.dst.metrics, RTAX_MAX*sizeof(u32)); | ||
871 | new->dev = ort->u.dst.dev; | ||
872 | if (new->dev) | ||
873 | dev_hold(new->dev); | ||
874 | rt->rt6i_idev = ort->rt6i_idev; | ||
875 | if (rt->rt6i_idev) | ||
876 | in6_dev_hold(rt->rt6i_idev); | ||
877 | rt->rt6i_expires = 0; | ||
878 | |||
879 | ipv6_addr_copy(&rt->rt6i_gateway, &ort->rt6i_gateway); | ||
880 | rt->rt6i_flags = ort->rt6i_flags & ~RTF_EXPIRES; | ||
881 | rt->rt6i_metric = 0; | ||
882 | |||
883 | memcpy(&rt->rt6i_dst, &ort->rt6i_dst, sizeof(struct rt6key)); | ||
884 | #ifdef CONFIG_IPV6_SUBTREES | ||
885 | memcpy(&rt->rt6i_src, &ort->rt6i_src, sizeof(struct rt6key)); | ||
886 | #endif | ||
887 | |||
888 | dst_free(new); | ||
889 | } | ||
890 | |||
891 | dst_release(*dstp); | ||
892 | *dstp = new; | ||
893 | return (new ? 0 : -ENOMEM); | ||
894 | } | ||
895 | EXPORT_SYMBOL_GPL(ip6_dst_blackhole); | ||
896 | |||
836 | /* | 897 | /* |
837 | * Destination cache support functions | 898 | * Destination cache support functions |
838 | */ | 899 | */ |
@@ -2495,6 +2556,8 @@ void __init ip6_route_init(void) | |||
2495 | ip6_dst_ops.kmem_cachep = | 2556 | ip6_dst_ops.kmem_cachep = |
2496 | kmem_cache_create("ip6_dst_cache", sizeof(struct rt6_info), 0, | 2557 | kmem_cache_create("ip6_dst_cache", sizeof(struct rt6_info), 0, |
2497 | SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL); | 2558 | SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL); |
2559 | ip6_dst_blackhole_ops.kmem_cachep = ip6_dst_ops.kmem_cachep; | ||
2560 | |||
2498 | fib6_init(); | 2561 | fib6_init(); |
2499 | #ifdef CONFIG_PROC_FS | 2562 | #ifdef CONFIG_PROC_FS |
2500 | p = proc_net_create("ipv6_route", 0, rt6_proc_info); | 2563 | p = proc_net_create("ipv6_route", 0, rt6_proc_info); |
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index e2f25ea43b68..4f06a51ad4fd 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
@@ -265,8 +265,12 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr, | |||
265 | if (final_p) | 265 | if (final_p) |
266 | ipv6_addr_copy(&fl.fl6_dst, final_p); | 266 | ipv6_addr_copy(&fl.fl6_dst, final_p); |
267 | 267 | ||
268 | if ((err = xfrm_lookup(&dst, &fl, sk, 1)) < 0) | 268 | if ((err = __xfrm_lookup(&dst, &fl, sk, 1)) < 0) { |
269 | goto failure; | 269 | if (err == -EREMOTE) |
270 | err = ip6_dst_blackhole(sk, &dst, &fl); | ||
271 | if (err < 0) | ||
272 | goto failure; | ||
273 | } | ||
270 | 274 | ||
271 | if (saddr == NULL) { | 275 | if (saddr == NULL) { |
272 | saddr = &fl.fl6_src; | 276 | saddr = &fl.fl6_src; |
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index a7ae59c954d5..d1fbddd172e7 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c | |||
@@ -767,8 +767,12 @@ do_udp_sendmsg: | |||
767 | if (final_p) | 767 | if (final_p) |
768 | ipv6_addr_copy(&fl.fl6_dst, final_p); | 768 | ipv6_addr_copy(&fl.fl6_dst, final_p); |
769 | 769 | ||
770 | if ((err = xfrm_lookup(&dst, &fl, sk, 1)) < 0) | 770 | if ((err = __xfrm_lookup(&dst, &fl, sk, 1)) < 0) { |
771 | goto out; | 771 | if (err == -EREMOTE) |
772 | err = ip6_dst_blackhole(sk, &dst, &fl); | ||
773 | if (err < 0) | ||
774 | goto out; | ||
775 | } | ||
772 | 776 | ||
773 | if (hlimit < 0) { | 777 | if (hlimit < 0) { |
774 | if (ipv6_addr_is_multicast(&fl.fl6_dst)) | 778 | if (ipv6_addr_is_multicast(&fl.fl6_dst)) |
diff --git a/net/ipx/af_ipx.c b/net/ipx/af_ipx.c index 15419dd682fd..8400525177ab 100644 --- a/net/ipx/af_ipx.c +++ b/net/ipx/af_ipx.c | |||
@@ -87,7 +87,7 @@ extern int ipxrtr_add_route(__be32 network, struct ipx_interface *intrfc, | |||
87 | unsigned char *node); | 87 | unsigned char *node); |
88 | extern void ipxrtr_del_routes(struct ipx_interface *intrfc); | 88 | extern void ipxrtr_del_routes(struct ipx_interface *intrfc); |
89 | extern int ipxrtr_route_packet(struct sock *sk, struct sockaddr_ipx *usipx, | 89 | extern int ipxrtr_route_packet(struct sock *sk, struct sockaddr_ipx *usipx, |
90 | struct iovec *iov, int len, int noblock); | 90 | struct iovec *iov, size_t len, int noblock); |
91 | extern int ipxrtr_route_skb(struct sk_buff *skb); | 91 | extern int ipxrtr_route_skb(struct sk_buff *skb); |
92 | extern struct ipx_route *ipxrtr_lookup(__be32 net); | 92 | extern struct ipx_route *ipxrtr_lookup(__be32 net); |
93 | extern int ipxrtr_ioctl(unsigned int cmd, void __user *arg); | 93 | extern int ipxrtr_ioctl(unsigned int cmd, void __user *arg); |
diff --git a/net/key/af_key.c b/net/key/af_key.c index a99444142dc7..d302ddae580c 100644 --- a/net/key/af_key.c +++ b/net/key/af_key.c | |||
@@ -1448,8 +1448,6 @@ static int pfkey_add(struct sock *sk, struct sk_buff *skb, struct sadb_msg *hdr, | |||
1448 | int err; | 1448 | int err; |
1449 | struct km_event c; | 1449 | struct km_event c; |
1450 | 1450 | ||
1451 | xfrm_probe_algs(); | ||
1452 | |||
1453 | x = pfkey_msg2xfrm_state(hdr, ext_hdrs); | 1451 | x = pfkey_msg2xfrm_state(hdr, ext_hdrs); |
1454 | if (IS_ERR(x)) | 1452 | if (IS_ERR(x)) |
1455 | return PTR_ERR(x); | 1453 | return PTR_ERR(x); |
diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c index e8b5c2d7db62..483e927a9ca4 100644 --- a/net/netfilter/nf_conntrack_core.c +++ b/net/netfilter/nf_conntrack_core.c | |||
@@ -298,7 +298,6 @@ static void | |||
298 | destroy_conntrack(struct nf_conntrack *nfct) | 298 | destroy_conntrack(struct nf_conntrack *nfct) |
299 | { | 299 | { |
300 | struct nf_conn *ct = (struct nf_conn *)nfct; | 300 | struct nf_conn *ct = (struct nf_conn *)nfct; |
301 | struct nf_conn_help *help = nfct_help(ct); | ||
302 | struct nf_conntrack_l4proto *l4proto; | 301 | struct nf_conntrack_l4proto *l4proto; |
303 | typeof(nf_conntrack_destroyed) destroyed; | 302 | typeof(nf_conntrack_destroyed) destroyed; |
304 | 303 | ||
@@ -309,9 +308,6 @@ destroy_conntrack(struct nf_conntrack *nfct) | |||
309 | nf_conntrack_event(IPCT_DESTROY, ct); | 308 | nf_conntrack_event(IPCT_DESTROY, ct); |
310 | set_bit(IPS_DYING_BIT, &ct->status); | 309 | set_bit(IPS_DYING_BIT, &ct->status); |
311 | 310 | ||
312 | if (help && help->helper && help->helper->destroy) | ||
313 | help->helper->destroy(ct); | ||
314 | |||
315 | /* To make sure we don't get any weird locking issues here: | 311 | /* To make sure we don't get any weird locking issues here: |
316 | * destroy_conntrack() MUST NOT be called with a write lock | 312 | * destroy_conntrack() MUST NOT be called with a write lock |
317 | * to nf_conntrack_lock!!! -HW */ | 313 | * to nf_conntrack_lock!!! -HW */ |
@@ -353,6 +349,10 @@ destroy_conntrack(struct nf_conntrack *nfct) | |||
353 | static void death_by_timeout(unsigned long ul_conntrack) | 349 | static void death_by_timeout(unsigned long ul_conntrack) |
354 | { | 350 | { |
355 | struct nf_conn *ct = (void *)ul_conntrack; | 351 | struct nf_conn *ct = (void *)ul_conntrack; |
352 | struct nf_conn_help *help = nfct_help(ct); | ||
353 | |||
354 | if (help && help->helper && help->helper->destroy) | ||
355 | help->helper->destroy(ct); | ||
356 | 356 | ||
357 | write_lock_bh(&nf_conntrack_lock); | 357 | write_lock_bh(&nf_conntrack_lock); |
358 | /* Inside lock so preempt is disabled on module removal path. | 358 | /* Inside lock so preempt is disabled on module removal path. |
diff --git a/net/netfilter/nf_conntrack_ftp.c b/net/netfilter/nf_conntrack_ftp.c index a186799f6542..82db2aa53bfc 100644 --- a/net/netfilter/nf_conntrack_ftp.c +++ b/net/netfilter/nf_conntrack_ftp.c | |||
@@ -48,8 +48,7 @@ unsigned int (*nf_nat_ftp_hook)(struct sk_buff **pskb, | |||
48 | enum nf_ct_ftp_type type, | 48 | enum nf_ct_ftp_type type, |
49 | unsigned int matchoff, | 49 | unsigned int matchoff, |
50 | unsigned int matchlen, | 50 | unsigned int matchlen, |
51 | struct nf_conntrack_expect *exp, | 51 | struct nf_conntrack_expect *exp); |
52 | u32 *seq); | ||
53 | EXPORT_SYMBOL_GPL(nf_nat_ftp_hook); | 52 | EXPORT_SYMBOL_GPL(nf_nat_ftp_hook); |
54 | 53 | ||
55 | #if 0 | 54 | #if 0 |
@@ -335,15 +334,17 @@ static void update_nl_seq(u32 nl_seq, struct nf_ct_ftp_master *info, int dir, | |||
335 | if (info->seq_aft_nl[dir][i] == nl_seq) | 334 | if (info->seq_aft_nl[dir][i] == nl_seq) |
336 | return; | 335 | return; |
337 | 336 | ||
338 | if (oldest == info->seq_aft_nl_num[dir] | 337 | if (oldest == info->seq_aft_nl_num[dir] || |
339 | || before(info->seq_aft_nl[dir][i], oldest)) | 338 | before(info->seq_aft_nl[dir][i], |
339 | info->seq_aft_nl[dir][oldest])) | ||
340 | oldest = i; | 340 | oldest = i; |
341 | } | 341 | } |
342 | 342 | ||
343 | if (info->seq_aft_nl_num[dir] < NUM_SEQ_TO_REMEMBER) { | 343 | if (info->seq_aft_nl_num[dir] < NUM_SEQ_TO_REMEMBER) { |
344 | info->seq_aft_nl[dir][info->seq_aft_nl_num[dir]++] = nl_seq; | 344 | info->seq_aft_nl[dir][info->seq_aft_nl_num[dir]++] = nl_seq; |
345 | nf_conntrack_event_cache(IPCT_HELPINFO_VOLATILE, skb); | 345 | nf_conntrack_event_cache(IPCT_HELPINFO_VOLATILE, skb); |
346 | } else if (oldest != NUM_SEQ_TO_REMEMBER) { | 346 | } else if (oldest != NUM_SEQ_TO_REMEMBER && |
347 | after(nl_seq, info->seq_aft_nl[dir][oldest])) { | ||
347 | info->seq_aft_nl[dir][oldest] = nl_seq; | 348 | info->seq_aft_nl[dir][oldest] = nl_seq; |
348 | nf_conntrack_event_cache(IPCT_HELPINFO_VOLATILE, skb); | 349 | nf_conntrack_event_cache(IPCT_HELPINFO_VOLATILE, skb); |
349 | } | 350 | } |
@@ -519,7 +520,7 @@ static int help(struct sk_buff **pskb, | |||
519 | nf_nat_ftp = rcu_dereference(nf_nat_ftp_hook); | 520 | nf_nat_ftp = rcu_dereference(nf_nat_ftp_hook); |
520 | if (nf_nat_ftp && ct->status & IPS_NAT_MASK) | 521 | if (nf_nat_ftp && ct->status & IPS_NAT_MASK) |
521 | ret = nf_nat_ftp(pskb, ctinfo, search[dir][i].ftptype, | 522 | ret = nf_nat_ftp(pskb, ctinfo, search[dir][i].ftptype, |
522 | matchoff, matchlen, exp, &seq); | 523 | matchoff, matchlen, exp); |
523 | else { | 524 | else { |
524 | /* Can't expect this? Best to drop packet now. */ | 525 | /* Can't expect this? Best to drop packet now. */ |
525 | if (nf_conntrack_expect_related(exp) != 0) | 526 | if (nf_conntrack_expect_related(exp) != 0) |
diff --git a/net/netfilter/nf_conntrack_h323_main.c b/net/netfilter/nf_conntrack_h323_main.c index b284db73ca7c..a1b95acad297 100644 --- a/net/netfilter/nf_conntrack_h323_main.c +++ b/net/netfilter/nf_conntrack_h323_main.c | |||
@@ -520,6 +520,16 @@ static int process_olca(struct sk_buff **pskb, struct nf_conn *ct, | |||
520 | } | 520 | } |
521 | } | 521 | } |
522 | 522 | ||
523 | if ((olca->options & eOpenLogicalChannelAck_separateStack) && | ||
524 | olca->separateStack.networkAddress.choice == | ||
525 | eNetworkAccessParameters_networkAddress_localAreaAddress) { | ||
526 | ret = expect_t120(pskb, ct, ctinfo, data, dataoff, | ||
527 | &olca->separateStack.networkAddress. | ||
528 | localAreaAddress); | ||
529 | if (ret < 0) | ||
530 | return -1; | ||
531 | } | ||
532 | |||
523 | return 0; | 533 | return 0; |
524 | } | 534 | } |
525 | 535 | ||
@@ -640,7 +650,7 @@ int get_h225_addr(struct nf_conn *ct, unsigned char *data, | |||
640 | case eTransportAddress_ip6Address: | 650 | case eTransportAddress_ip6Address: |
641 | if (family != AF_INET6) | 651 | if (family != AF_INET6) |
642 | return 0; | 652 | return 0; |
643 | p = data + taddr->ip6Address.ip6; | 653 | p = data + taddr->ip6Address.ip; |
644 | len = 16; | 654 | len = 16; |
645 | break; | 655 | break; |
646 | default: | 656 | default: |
@@ -977,30 +987,6 @@ static int process_alerting(struct sk_buff **pskb, struct nf_conn *ct, | |||
977 | } | 987 | } |
978 | 988 | ||
979 | /****************************************************************************/ | 989 | /****************************************************************************/ |
980 | static int process_information(struct sk_buff **pskb, | ||
981 | struct nf_conn *ct, | ||
982 | enum ip_conntrack_info ctinfo, | ||
983 | unsigned char **data, int dataoff, | ||
984 | Information_UUIE *info) | ||
985 | { | ||
986 | int ret; | ||
987 | int i; | ||
988 | |||
989 | DEBUGP("nf_ct_q931: Information\n"); | ||
990 | |||
991 | if (info->options & eInformation_UUIE_fastStart) { | ||
992 | for (i = 0; i < info->fastStart.count; i++) { | ||
993 | ret = process_olc(pskb, ct, ctinfo, data, dataoff, | ||
994 | &info->fastStart.item[i]); | ||
995 | if (ret < 0) | ||
996 | return -1; | ||
997 | } | ||
998 | } | ||
999 | |||
1000 | return 0; | ||
1001 | } | ||
1002 | |||
1003 | /****************************************************************************/ | ||
1004 | static int process_facility(struct sk_buff **pskb, struct nf_conn *ct, | 990 | static int process_facility(struct sk_buff **pskb, struct nf_conn *ct, |
1005 | enum ip_conntrack_info ctinfo, | 991 | enum ip_conntrack_info ctinfo, |
1006 | unsigned char **data, int dataoff, | 992 | unsigned char **data, int dataoff, |
@@ -1096,11 +1082,6 @@ static int process_q931(struct sk_buff **pskb, struct nf_conn *ct, | |||
1096 | ret = process_alerting(pskb, ct, ctinfo, data, dataoff, | 1082 | ret = process_alerting(pskb, ct, ctinfo, data, dataoff, |
1097 | &pdu->h323_message_body.alerting); | 1083 | &pdu->h323_message_body.alerting); |
1098 | break; | 1084 | break; |
1099 | case eH323_UU_PDU_h323_message_body_information: | ||
1100 | ret = process_information(pskb, ct, ctinfo, data, dataoff, | ||
1101 | &pdu->h323_message_body. | ||
1102 | information); | ||
1103 | break; | ||
1104 | case eH323_UU_PDU_h323_message_body_facility: | 1085 | case eH323_UU_PDU_h323_message_body_facility: |
1105 | ret = process_facility(pskb, ct, ctinfo, data, dataoff, | 1086 | ret = process_facility(pskb, ct, ctinfo, data, dataoff, |
1106 | &pdu->h323_message_body.facility); | 1087 | &pdu->h323_message_body.facility); |
diff --git a/net/netfilter/nf_conntrack_h323_types.c b/net/netfilter/nf_conntrack_h323_types.c index 4c6f8b3b1208..3a21fdf1a265 100644 --- a/net/netfilter/nf_conntrack_h323_types.c +++ b/net/netfilter/nf_conntrack_h323_types.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* Generated by Jing Min Zhao's ASN.1 parser, Apr 20 2006 | 1 | /* Generated by Jing Min Zhao's ASN.1 parser, May 16 2007 |
2 | * | 2 | * |
3 | * Copyright (c) 2006 Jing Min Zhao <zhaojingmin@users.sourceforge.net> | 3 | * Copyright (c) 2006 Jing Min Zhao <zhaojingmin@users.sourceforge.net> |
4 | * | 4 | * |
@@ -37,7 +37,7 @@ static field_t _TransportAddress_ipxAddress[] = { /* SEQUENCE */ | |||
37 | 37 | ||
38 | static field_t _TransportAddress_ip6Address[] = { /* SEQUENCE */ | 38 | static field_t _TransportAddress_ip6Address[] = { /* SEQUENCE */ |
39 | {FNAME("ip") OCTSTR, FIXD, 16, 0, DECODE, | 39 | {FNAME("ip") OCTSTR, FIXD, 16, 0, DECODE, |
40 | offsetof(TransportAddress_ip6Address, ip6), NULL}, | 40 | offsetof(TransportAddress_ip6Address, ip), NULL}, |
41 | {FNAME("port") INT, WORD, 0, 0, SKIP, 0, NULL}, | 41 | {FNAME("port") INT, WORD, 0, 0, SKIP, 0, NULL}, |
42 | }; | 42 | }; |
43 | 43 | ||
@@ -67,7 +67,8 @@ static field_t _TransportAddress[] = { /* CHOICE */ | |||
67 | {FNAME("ipxAddress") SEQ, 0, 3, 3, SKIP, 0, | 67 | {FNAME("ipxAddress") SEQ, 0, 3, 3, SKIP, 0, |
68 | _TransportAddress_ipxAddress}, | 68 | _TransportAddress_ipxAddress}, |
69 | {FNAME("ip6Address") SEQ, 0, 2, 2, DECODE | EXT, | 69 | {FNAME("ip6Address") SEQ, 0, 2, 2, DECODE | EXT, |
70 | offsetof(TransportAddress, ip6Address), _TransportAddress_ip6Address}, | 70 | offsetof(TransportAddress, ip6Address), |
71 | _TransportAddress_ip6Address}, | ||
71 | {FNAME("netBios") OCTSTR, FIXD, 16, 0, SKIP, 0, NULL}, | 72 | {FNAME("netBios") OCTSTR, FIXD, 16, 0, SKIP, 0, NULL}, |
72 | {FNAME("nsap") OCTSTR, 5, 1, 0, SKIP, 0, NULL}, | 73 | {FNAME("nsap") OCTSTR, 5, 1, 0, SKIP, 0, NULL}, |
73 | {FNAME("nonStandardAddress") SEQ, 0, 2, 2, SKIP, 0, | 74 | {FNAME("nonStandardAddress") SEQ, 0, 2, 2, SKIP, 0, |
@@ -638,7 +639,8 @@ static field_t _UnicastAddress_iPXAddress[] = { /* SEQUENCE */ | |||
638 | }; | 639 | }; |
639 | 640 | ||
640 | static field_t _UnicastAddress_iP6Address[] = { /* SEQUENCE */ | 641 | static field_t _UnicastAddress_iP6Address[] = { /* SEQUENCE */ |
641 | {FNAME("network") OCTSTR, FIXD, 16, 0, SKIP, 0, NULL}, | 642 | {FNAME("network") OCTSTR, FIXD, 16, 0, DECODE, |
643 | offsetof(UnicastAddress_iP6Address, network), NULL}, | ||
642 | {FNAME("tsapIdentifier") INT, WORD, 0, 0, SKIP, 0, NULL}, | 644 | {FNAME("tsapIdentifier") INT, WORD, 0, 0, SKIP, 0, NULL}, |
643 | }; | 645 | }; |
644 | 646 | ||
@@ -665,8 +667,8 @@ static field_t _UnicastAddress[] = { /* CHOICE */ | |||
665 | offsetof(UnicastAddress, iPAddress), _UnicastAddress_iPAddress}, | 667 | offsetof(UnicastAddress, iPAddress), _UnicastAddress_iPAddress}, |
666 | {FNAME("iPXAddress") SEQ, 0, 3, 3, SKIP | EXT, 0, | 668 | {FNAME("iPXAddress") SEQ, 0, 3, 3, SKIP | EXT, 0, |
667 | _UnicastAddress_iPXAddress}, | 669 | _UnicastAddress_iPXAddress}, |
668 | {FNAME("iP6Address") SEQ, 0, 2, 2, SKIP | EXT, 0, | 670 | {FNAME("iP6Address") SEQ, 0, 2, 2, DECODE | EXT, |
669 | _UnicastAddress_iP6Address}, | 671 | offsetof(UnicastAddress, iP6Address), _UnicastAddress_iP6Address}, |
670 | {FNAME("netBios") OCTSTR, FIXD, 16, 0, SKIP, 0, NULL}, | 672 | {FNAME("netBios") OCTSTR, FIXD, 16, 0, SKIP, 0, NULL}, |
671 | {FNAME("iPSourceRouteAddress") SEQ, 0, 4, 4, SKIP | EXT, 0, | 673 | {FNAME("iPSourceRouteAddress") SEQ, 0, 4, 4, SKIP | EXT, 0, |
672 | _UnicastAddress_iPSourceRouteAddress}, | 674 | _UnicastAddress_iPSourceRouteAddress}, |
@@ -984,19 +986,12 @@ static field_t _Alerting_UUIE[] = { /* SEQUENCE */ | |||
984 | {FNAME("featureSet") SEQ, 3, 4, 4, SKIP | EXT | OPT, 0, NULL}, | 986 | {FNAME("featureSet") SEQ, 3, 4, 4, SKIP | EXT | OPT, 0, NULL}, |
985 | }; | 987 | }; |
986 | 988 | ||
987 | static field_t _Information_UUIE_fastStart[] = { /* SEQUENCE OF */ | ||
988 | {FNAME("item") SEQ, 1, 3, 5, DECODE | OPEN | EXT, | ||
989 | sizeof(OpenLogicalChannel), _OpenLogicalChannel} | ||
990 | , | ||
991 | }; | ||
992 | |||
993 | static field_t _Information_UUIE[] = { /* SEQUENCE */ | 989 | static field_t _Information_UUIE[] = { /* SEQUENCE */ |
994 | {FNAME("protocolIdentifier") OID, BYTE, 0, 0, SKIP, 0, NULL}, | 990 | {FNAME("protocolIdentifier") OID, BYTE, 0, 0, SKIP, 0, NULL}, |
995 | {FNAME("callIdentifier") SEQ, 0, 1, 1, SKIP | EXT, 0, NULL}, | 991 | {FNAME("callIdentifier") SEQ, 0, 1, 1, SKIP | EXT, 0, NULL}, |
996 | {FNAME("tokens") SEQOF, SEMI, 0, 0, SKIP | OPT, 0, NULL}, | 992 | {FNAME("tokens") SEQOF, SEMI, 0, 0, SKIP | OPT, 0, NULL}, |
997 | {FNAME("cryptoTokens") SEQOF, SEMI, 0, 0, SKIP | OPT, 0, NULL}, | 993 | {FNAME("cryptoTokens") SEQOF, SEMI, 0, 0, SKIP | OPT, 0, NULL}, |
998 | {FNAME("fastStart") SEQOF, SEMI, 0, 30, DECODE | OPT, | 994 | {FNAME("fastStart") SEQOF, SEMI, 0, 30, SKIP | OPT, 0, NULL}, |
999 | offsetof(Information_UUIE, fastStart), _Information_UUIE_fastStart}, | ||
1000 | {FNAME("fastConnectRefused") NUL, FIXD, 0, 0, SKIP | OPT, 0, NULL}, | 995 | {FNAME("fastConnectRefused") NUL, FIXD, 0, 0, SKIP | OPT, 0, NULL}, |
1001 | {FNAME("circuitInfo") SEQ, 3, 3, 3, SKIP | EXT | OPT, 0, NULL}, | 996 | {FNAME("circuitInfo") SEQ, 3, 3, 3, SKIP | EXT | OPT, 0, NULL}, |
1002 | }; | 997 | }; |
@@ -1343,9 +1338,7 @@ static field_t _H323_UU_PDU_h323_message_body[] = { /* CHOICE */ | |||
1343 | offsetof(H323_UU_PDU_h323_message_body, connect), _Connect_UUIE}, | 1338 | offsetof(H323_UU_PDU_h323_message_body, connect), _Connect_UUIE}, |
1344 | {FNAME("alerting") SEQ, 1, 3, 17, DECODE | EXT, | 1339 | {FNAME("alerting") SEQ, 1, 3, 17, DECODE | EXT, |
1345 | offsetof(H323_UU_PDU_h323_message_body, alerting), _Alerting_UUIE}, | 1340 | offsetof(H323_UU_PDU_h323_message_body, alerting), _Alerting_UUIE}, |
1346 | {FNAME("information") SEQ, 0, 1, 7, DECODE | EXT, | 1341 | {FNAME("information") SEQ, 0, 1, 7, SKIP | EXT, 0, _Information_UUIE}, |
1347 | offsetof(H323_UU_PDU_h323_message_body, information), | ||
1348 | _Information_UUIE}, | ||
1349 | {FNAME("releaseComplete") SEQ, 1, 2, 11, SKIP | EXT, 0, | 1342 | {FNAME("releaseComplete") SEQ, 1, 2, 11, SKIP | EXT, 0, |
1350 | _ReleaseComplete_UUIE}, | 1343 | _ReleaseComplete_UUIE}, |
1351 | {FNAME("facility") SEQ, 3, 5, 21, DECODE | EXT, | 1344 | {FNAME("facility") SEQ, 3, 5, 21, DECODE | EXT, |
@@ -1430,7 +1423,9 @@ static field_t _OpenLogicalChannelAck[] = { /* SEQUENCE */ | |||
1430 | DECODE | EXT | OPT, offsetof(OpenLogicalChannelAck, | 1423 | DECODE | EXT | OPT, offsetof(OpenLogicalChannelAck, |
1431 | reverseLogicalChannelParameters), | 1424 | reverseLogicalChannelParameters), |
1432 | _OpenLogicalChannelAck_reverseLogicalChannelParameters}, | 1425 | _OpenLogicalChannelAck_reverseLogicalChannelParameters}, |
1433 | {FNAME("separateStack") SEQ, 2, 4, 5, SKIP | EXT | OPT, 0, NULL}, | 1426 | {FNAME("separateStack") SEQ, 2, 4, 5, DECODE | EXT | OPT, |
1427 | offsetof(OpenLogicalChannelAck, separateStack), | ||
1428 | _NetworkAccessParameters}, | ||
1434 | {FNAME("forwardMultiplexAckParameters") CHOICE, 0, 1, 1, | 1429 | {FNAME("forwardMultiplexAckParameters") CHOICE, 0, 1, 1, |
1435 | DECODE | EXT | OPT, offsetof(OpenLogicalChannelAck, | 1430 | DECODE | EXT | OPT, offsetof(OpenLogicalChannelAck, |
1436 | forwardMultiplexAckParameters), | 1431 | forwardMultiplexAckParameters), |
diff --git a/net/rfkill/rfkill.c b/net/rfkill/rfkill.c index a973603e3880..f3986d498b40 100644 --- a/net/rfkill/rfkill.c +++ b/net/rfkill/rfkill.c | |||
@@ -296,7 +296,7 @@ struct rfkill *rfkill_allocate(struct device *parent, enum rfkill_type type) | |||
296 | struct device *dev; | 296 | struct device *dev; |
297 | 297 | ||
298 | rfkill = kzalloc(sizeof(struct rfkill), GFP_KERNEL); | 298 | rfkill = kzalloc(sizeof(struct rfkill), GFP_KERNEL); |
299 | if (rfkill) | 299 | if (!rfkill) |
300 | return NULL; | 300 | return NULL; |
301 | 301 | ||
302 | mutex_init(&rfkill->mutex); | 302 | mutex_init(&rfkill->mutex); |
diff --git a/net/rxrpc/Kconfig b/net/rxrpc/Kconfig index 91b3d52f6f1a..e662f1d07664 100644 --- a/net/rxrpc/Kconfig +++ b/net/rxrpc/Kconfig | |||
@@ -4,7 +4,7 @@ | |||
4 | 4 | ||
5 | config AF_RXRPC | 5 | config AF_RXRPC |
6 | tristate "RxRPC session sockets" | 6 | tristate "RxRPC session sockets" |
7 | depends on EXPERIMENTAL | 7 | depends on INET && EXPERIMENTAL |
8 | select KEYS | 8 | select KEYS |
9 | help | 9 | help |
10 | Say Y or M here to include support for RxRPC session sockets (just | 10 | Say Y or M here to include support for RxRPC session sockets (just |
diff --git a/net/rxrpc/ar-call.c b/net/rxrpc/ar-call.c index 4d92d88ff1fc..3c04b00dab74 100644 --- a/net/rxrpc/ar-call.c +++ b/net/rxrpc/ar-call.c | |||
@@ -15,6 +15,25 @@ | |||
15 | #include <net/af_rxrpc.h> | 15 | #include <net/af_rxrpc.h> |
16 | #include "ar-internal.h" | 16 | #include "ar-internal.h" |
17 | 17 | ||
18 | const char *rxrpc_call_states[] = { | ||
19 | [RXRPC_CALL_CLIENT_SEND_REQUEST] = "ClSndReq", | ||
20 | [RXRPC_CALL_CLIENT_AWAIT_REPLY] = "ClAwtRpl", | ||
21 | [RXRPC_CALL_CLIENT_RECV_REPLY] = "ClRcvRpl", | ||
22 | [RXRPC_CALL_CLIENT_FINAL_ACK] = "ClFnlACK", | ||
23 | [RXRPC_CALL_SERVER_SECURING] = "SvSecure", | ||
24 | [RXRPC_CALL_SERVER_ACCEPTING] = "SvAccept", | ||
25 | [RXRPC_CALL_SERVER_RECV_REQUEST] = "SvRcvReq", | ||
26 | [RXRPC_CALL_SERVER_ACK_REQUEST] = "SvAckReq", | ||
27 | [RXRPC_CALL_SERVER_SEND_REPLY] = "SvSndRpl", | ||
28 | [RXRPC_CALL_SERVER_AWAIT_ACK] = "SvAwtACK", | ||
29 | [RXRPC_CALL_COMPLETE] = "Complete", | ||
30 | [RXRPC_CALL_SERVER_BUSY] = "SvBusy ", | ||
31 | [RXRPC_CALL_REMOTELY_ABORTED] = "RmtAbort", | ||
32 | [RXRPC_CALL_LOCALLY_ABORTED] = "LocAbort", | ||
33 | [RXRPC_CALL_NETWORK_ERROR] = "NetError", | ||
34 | [RXRPC_CALL_DEAD] = "Dead ", | ||
35 | }; | ||
36 | |||
18 | struct kmem_cache *rxrpc_call_jar; | 37 | struct kmem_cache *rxrpc_call_jar; |
19 | LIST_HEAD(rxrpc_calls); | 38 | LIST_HEAD(rxrpc_calls); |
20 | DEFINE_RWLOCK(rxrpc_call_lock); | 39 | DEFINE_RWLOCK(rxrpc_call_lock); |
diff --git a/net/rxrpc/ar-proc.c b/net/rxrpc/ar-proc.c index 58f4b4e5cece..1c0be0e77b16 100644 --- a/net/rxrpc/ar-proc.c +++ b/net/rxrpc/ar-proc.c | |||
@@ -25,25 +25,6 @@ static const char *rxrpc_conn_states[] = { | |||
25 | [RXRPC_CONN_NETWORK_ERROR] = "NetError", | 25 | [RXRPC_CONN_NETWORK_ERROR] = "NetError", |
26 | }; | 26 | }; |
27 | 27 | ||
28 | const char *rxrpc_call_states[] = { | ||
29 | [RXRPC_CALL_CLIENT_SEND_REQUEST] = "ClSndReq", | ||
30 | [RXRPC_CALL_CLIENT_AWAIT_REPLY] = "ClAwtRpl", | ||
31 | [RXRPC_CALL_CLIENT_RECV_REPLY] = "ClRcvRpl", | ||
32 | [RXRPC_CALL_CLIENT_FINAL_ACK] = "ClFnlACK", | ||
33 | [RXRPC_CALL_SERVER_SECURING] = "SvSecure", | ||
34 | [RXRPC_CALL_SERVER_ACCEPTING] = "SvAccept", | ||
35 | [RXRPC_CALL_SERVER_RECV_REQUEST] = "SvRcvReq", | ||
36 | [RXRPC_CALL_SERVER_ACK_REQUEST] = "SvAckReq", | ||
37 | [RXRPC_CALL_SERVER_SEND_REPLY] = "SvSndRpl", | ||
38 | [RXRPC_CALL_SERVER_AWAIT_ACK] = "SvAwtACK", | ||
39 | [RXRPC_CALL_COMPLETE] = "Complete", | ||
40 | [RXRPC_CALL_SERVER_BUSY] = "SvBusy ", | ||
41 | [RXRPC_CALL_REMOTELY_ABORTED] = "RmtAbort", | ||
42 | [RXRPC_CALL_LOCALLY_ABORTED] = "LocAbort", | ||
43 | [RXRPC_CALL_NETWORK_ERROR] = "NetError", | ||
44 | [RXRPC_CALL_DEAD] = "Dead ", | ||
45 | }; | ||
46 | |||
47 | /* | 28 | /* |
48 | * generate a list of extant and dead calls in /proc/net/rxrpc_calls | 29 | * generate a list of extant and dead calls in /proc/net/rxrpc_calls |
49 | */ | 30 | */ |
diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c index f28bb2dc58d0..cbefe225581e 100644 --- a/net/sched/sch_generic.c +++ b/net/sched/sch_generic.c | |||
@@ -169,8 +169,8 @@ requeue: | |||
169 | else | 169 | else |
170 | q->ops->requeue(skb, q); | 170 | q->ops->requeue(skb, q); |
171 | netif_schedule(dev); | 171 | netif_schedule(dev); |
172 | return 0; | ||
173 | } | 172 | } |
173 | return 0; | ||
174 | 174 | ||
175 | out: | 175 | out: |
176 | BUG_ON((int) q->q.qlen < 0); | 176 | BUG_ON((int) q->q.qlen < 0); |
diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c index 99bcec8dd04c..035788c5b7f8 100644 --- a/net/sched/sch_htb.c +++ b/net/sched/sch_htb.c | |||
@@ -976,8 +976,9 @@ static struct sk_buff *htb_dequeue(struct Qdisc *sch) | |||
976 | 976 | ||
977 | if (q->now >= q->near_ev_cache[level]) { | 977 | if (q->now >= q->near_ev_cache[level]) { |
978 | event = htb_do_events(q, level); | 978 | event = htb_do_events(q, level); |
979 | q->near_ev_cache[level] = event ? event : | 979 | if (!event) |
980 | PSCHED_TICKS_PER_SEC; | 980 | event = q->now + PSCHED_TICKS_PER_SEC; |
981 | q->near_ev_cache[level] = event; | ||
981 | } else | 982 | } else |
982 | event = q->near_ev_cache[level]; | 983 | event = q->near_ev_cache[level]; |
983 | 984 | ||
diff --git a/net/sctp/Kconfig b/net/sctp/Kconfig index 9cba49e2ad43..8210f549c492 100644 --- a/net/sctp/Kconfig +++ b/net/sctp/Kconfig | |||
@@ -2,11 +2,9 @@ | |||
2 | # SCTP configuration | 2 | # SCTP configuration |
3 | # | 3 | # |
4 | 4 | ||
5 | menu "SCTP Configuration (EXPERIMENTAL)" | 5 | menuconfig IP_SCTP |
6 | depends on INET && EXPERIMENTAL | ||
7 | |||
8 | config IP_SCTP | ||
9 | tristate "The SCTP Protocol (EXPERIMENTAL)" | 6 | tristate "The SCTP Protocol (EXPERIMENTAL)" |
7 | depends on INET && EXPERIMENTAL | ||
10 | depends on IPV6 || IPV6=n | 8 | depends on IPV6 || IPV6=n |
11 | select CRYPTO if SCTP_HMAC_SHA1 || SCTP_HMAC_MD5 | 9 | select CRYPTO if SCTP_HMAC_SHA1 || SCTP_HMAC_MD5 |
12 | select CRYPTO_HMAC if SCTP_HMAC_SHA1 || SCTP_HMAC_MD5 | 10 | select CRYPTO_HMAC if SCTP_HMAC_SHA1 || SCTP_HMAC_MD5 |
@@ -36,9 +34,10 @@ config IP_SCTP | |||
36 | 34 | ||
37 | If in doubt, say N. | 35 | If in doubt, say N. |
38 | 36 | ||
37 | if IP_SCTP | ||
38 | |||
39 | config SCTP_DBG_MSG | 39 | config SCTP_DBG_MSG |
40 | bool "SCTP: Debug messages" | 40 | bool "SCTP: Debug messages" |
41 | depends on IP_SCTP | ||
42 | help | 41 | help |
43 | If you say Y, this will enable verbose debugging messages. | 42 | If you say Y, this will enable verbose debugging messages. |
44 | 43 | ||
@@ -47,7 +46,6 @@ config SCTP_DBG_MSG | |||
47 | 46 | ||
48 | config SCTP_DBG_OBJCNT | 47 | config SCTP_DBG_OBJCNT |
49 | bool "SCTP: Debug object counts" | 48 | bool "SCTP: Debug object counts" |
50 | depends on IP_SCTP | ||
51 | help | 49 | help |
52 | If you say Y, this will enable debugging support for counting the | 50 | If you say Y, this will enable debugging support for counting the |
53 | type of objects that are currently allocated. This is useful for | 51 | type of objects that are currently allocated. This is useful for |
@@ -59,7 +57,6 @@ config SCTP_DBG_OBJCNT | |||
59 | 57 | ||
60 | choice | 58 | choice |
61 | prompt "SCTP: Cookie HMAC Algorithm" | 59 | prompt "SCTP: Cookie HMAC Algorithm" |
62 | depends on IP_SCTP | ||
63 | default SCTP_HMAC_MD5 | 60 | default SCTP_HMAC_MD5 |
64 | help | 61 | help |
65 | HMAC algorithm to be used during association initialization. It | 62 | HMAC algorithm to be used during association initialization. It |
@@ -86,4 +83,5 @@ config SCTP_HMAC_MD5 | |||
86 | advised to use either HMAC-MD5 or HMAC-SHA1. | 83 | advised to use either HMAC-MD5 or HMAC-SHA1. |
87 | 84 | ||
88 | endchoice | 85 | endchoice |
89 | endmenu | 86 | |
87 | endif # IP_SCTP | ||
diff --git a/net/socket.c b/net/socket.c index 98a8f67abbfc..f4530196a70a 100644 --- a/net/socket.c +++ b/net/socket.c | |||
@@ -261,8 +261,7 @@ static void init_once(void *foo, struct kmem_cache *cachep, unsigned long flags) | |||
261 | { | 261 | { |
262 | struct socket_alloc *ei = (struct socket_alloc *)foo; | 262 | struct socket_alloc *ei = (struct socket_alloc *)foo; |
263 | 263 | ||
264 | if (flags & SLAB_CTOR_CONSTRUCTOR) | 264 | inode_init_once(&ei->vfs_inode); |
265 | inode_init_once(&ei->vfs_inode); | ||
266 | } | 265 | } |
267 | 266 | ||
268 | static int init_inodecache(void) | 267 | static int init_inodecache(void) |
diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c index a2f1893bde53..5887457dc936 100644 --- a/net/sunrpc/rpc_pipe.c +++ b/net/sunrpc/rpc_pipe.c | |||
@@ -828,19 +828,17 @@ init_once(void * foo, struct kmem_cache * cachep, unsigned long flags) | |||
828 | { | 828 | { |
829 | struct rpc_inode *rpci = (struct rpc_inode *) foo; | 829 | struct rpc_inode *rpci = (struct rpc_inode *) foo; |
830 | 830 | ||
831 | if (flags & SLAB_CTOR_CONSTRUCTOR) { | 831 | inode_init_once(&rpci->vfs_inode); |
832 | inode_init_once(&rpci->vfs_inode); | 832 | rpci->private = NULL; |
833 | rpci->private = NULL; | 833 | rpci->nreaders = 0; |
834 | rpci->nreaders = 0; | 834 | rpci->nwriters = 0; |
835 | rpci->nwriters = 0; | 835 | INIT_LIST_HEAD(&rpci->in_upcall); |
836 | INIT_LIST_HEAD(&rpci->in_upcall); | 836 | INIT_LIST_HEAD(&rpci->pipe); |
837 | INIT_LIST_HEAD(&rpci->pipe); | 837 | rpci->pipelen = 0; |
838 | rpci->pipelen = 0; | 838 | init_waitqueue_head(&rpci->waitq); |
839 | init_waitqueue_head(&rpci->waitq); | 839 | INIT_DELAYED_WORK(&rpci->queue_timeout, |
840 | INIT_DELAYED_WORK(&rpci->queue_timeout, | 840 | rpc_timeout_upcall_queue); |
841 | rpc_timeout_upcall_queue); | 841 | rpci->ops = NULL; |
842 | rpci->ops = NULL; | ||
843 | } | ||
844 | } | 842 | } |
845 | 843 | ||
846 | int register_rpc_pipefs(void) | 844 | int register_rpc_pipefs(void) |
diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c index b011eb625e49..944d75396fb3 100644 --- a/net/sunrpc/sched.c +++ b/net/sunrpc/sched.c | |||
@@ -989,8 +989,6 @@ void rpc_killall_tasks(struct rpc_clnt *clnt) | |||
989 | spin_unlock(&rpc_sched_lock); | 989 | spin_unlock(&rpc_sched_lock); |
990 | } | 990 | } |
991 | 991 | ||
992 | static DECLARE_MUTEX_LOCKED(rpciod_running); | ||
993 | |||
994 | static void rpciod_killall(void) | 992 | static void rpciod_killall(void) |
995 | { | 993 | { |
996 | unsigned long flags; | 994 | unsigned long flags; |
diff --git a/net/sunrpc/sunrpc_syms.c b/net/sunrpc/sunrpc_syms.c index 0d35bc796d00..73075dec83c0 100644 --- a/net/sunrpc/sunrpc_syms.c +++ b/net/sunrpc/sunrpc_syms.c | |||
@@ -134,11 +134,7 @@ EXPORT_SYMBOL(nfsd_debug); | |||
134 | EXPORT_SYMBOL(nlm_debug); | 134 | EXPORT_SYMBOL(nlm_debug); |
135 | #endif | 135 | #endif |
136 | 136 | ||
137 | extern int register_rpc_pipefs(void); | ||
138 | extern void unregister_rpc_pipefs(void); | ||
139 | extern struct cache_detail ip_map_cache, unix_gid_cache; | 137 | extern struct cache_detail ip_map_cache, unix_gid_cache; |
140 | extern int init_socket_xprt(void); | ||
141 | extern void cleanup_socket_xprt(void); | ||
142 | 138 | ||
143 | static int __init | 139 | static int __init |
144 | init_sunrpc(void) | 140 | init_sunrpc(void) |
diff --git a/net/tipc/Kconfig b/net/tipc/Kconfig index f9e367d946eb..3b30d1130b61 100644 --- a/net/tipc/Kconfig +++ b/net/tipc/Kconfig | |||
@@ -2,11 +2,9 @@ | |||
2 | # TIPC configuration | 2 | # TIPC configuration |
3 | # | 3 | # |
4 | 4 | ||
5 | menu "TIPC Configuration (EXPERIMENTAL)" | 5 | menuconfig TIPC |
6 | depends on INET && EXPERIMENTAL | ||
7 | |||
8 | config TIPC | ||
9 | tristate "The TIPC Protocol (EXPERIMENTAL)" | 6 | tristate "The TIPC Protocol (EXPERIMENTAL)" |
7 | depends on INET && EXPERIMENTAL | ||
10 | ---help--- | 8 | ---help--- |
11 | The Transparent Inter Process Communication (TIPC) protocol is | 9 | The Transparent Inter Process Communication (TIPC) protocol is |
12 | specially designed for intra cluster communication. This protocol | 10 | specially designed for intra cluster communication. This protocol |
@@ -22,9 +20,10 @@ config TIPC | |||
22 | 20 | ||
23 | If in doubt, say N. | 21 | If in doubt, say N. |
24 | 22 | ||
23 | if TIPC | ||
24 | |||
25 | config TIPC_ADVANCED | 25 | config TIPC_ADVANCED |
26 | bool "TIPC: Advanced configuration" | 26 | bool "TIPC: Advanced configuration" |
27 | depends on TIPC | ||
28 | default n | 27 | default n |
29 | help | 28 | help |
30 | Saying Y here will open some advanced configuration | 29 | Saying Y here will open some advanced configuration |
@@ -33,7 +32,7 @@ config TIPC_ADVANCED | |||
33 | 32 | ||
34 | config TIPC_ZONES | 33 | config TIPC_ZONES |
35 | int "Maximum number of zones in network" | 34 | int "Maximum number of zones in network" |
36 | depends on TIPC && TIPC_ADVANCED | 35 | depends on TIPC_ADVANCED |
37 | default "3" | 36 | default "3" |
38 | help | 37 | help |
39 | Max number of zones inside TIPC network. Max supported value | 38 | Max number of zones inside TIPC network. Max supported value |
@@ -44,7 +43,7 @@ config TIPC_ZONES | |||
44 | 43 | ||
45 | config TIPC_CLUSTERS | 44 | config TIPC_CLUSTERS |
46 | int "Maximum number of clusters in a zone" | 45 | int "Maximum number of clusters in a zone" |
47 | depends on TIPC && TIPC_ADVANCED | 46 | depends on TIPC_ADVANCED |
48 | default "1" | 47 | default "1" |
49 | help | 48 | help |
50 | ***Only 1 (one cluster in a zone) is supported by current code. | 49 | ***Only 1 (one cluster in a zone) is supported by current code. |
@@ -59,7 +58,7 @@ config TIPC_CLUSTERS | |||
59 | 58 | ||
60 | config TIPC_NODES | 59 | config TIPC_NODES |
61 | int "Maximum number of nodes in cluster" | 60 | int "Maximum number of nodes in cluster" |
62 | depends on TIPC && TIPC_ADVANCED | 61 | depends on TIPC_ADVANCED |
63 | default "255" | 62 | default "255" |
64 | help | 63 | help |
65 | Maximum number of nodes inside a TIPC cluster. Maximum | 64 | Maximum number of nodes inside a TIPC cluster. Maximum |
@@ -70,7 +69,7 @@ config TIPC_NODES | |||
70 | 69 | ||
71 | config TIPC_SLAVE_NODES | 70 | config TIPC_SLAVE_NODES |
72 | int "Maximum number of slave nodes in cluster" | 71 | int "Maximum number of slave nodes in cluster" |
73 | depends on TIPC && TIPC_ADVANCED | 72 | depends on TIPC_ADVANCED |
74 | default "0" | 73 | default "0" |
75 | help | 74 | help |
76 | ***This capability is not supported by current code.*** | 75 | ***This capability is not supported by current code.*** |
@@ -83,7 +82,7 @@ config TIPC_SLAVE_NODES | |||
83 | 82 | ||
84 | config TIPC_PORTS | 83 | config TIPC_PORTS |
85 | int "Maximum number of ports in a node" | 84 | int "Maximum number of ports in a node" |
86 | depends on TIPC && TIPC_ADVANCED | 85 | depends on TIPC_ADVANCED |
87 | default "8191" | 86 | default "8191" |
88 | help | 87 | help |
89 | Maximum number of ports within a node. Maximum | 88 | Maximum number of ports within a node. Maximum |
@@ -94,7 +93,7 @@ config TIPC_PORTS | |||
94 | 93 | ||
95 | config TIPC_LOG | 94 | config TIPC_LOG |
96 | int "Size of log buffer" | 95 | int "Size of log buffer" |
97 | depends on TIPC && TIPC_ADVANCED | 96 | depends on TIPC_ADVANCED |
98 | default 0 | 97 | default 0 |
99 | help | 98 | help |
100 | Size (in bytes) of TIPC's internal log buffer, which records the | 99 | Size (in bytes) of TIPC's internal log buffer, which records the |
@@ -106,7 +105,6 @@ config TIPC_LOG | |||
106 | 105 | ||
107 | config TIPC_DEBUG | 106 | config TIPC_DEBUG |
108 | bool "Enable debugging support" | 107 | bool "Enable debugging support" |
109 | depends on TIPC | ||
110 | default n | 108 | default n |
111 | help | 109 | help |
112 | This will enable debugging of TIPC. | 110 | This will enable debugging of TIPC. |
@@ -114,4 +112,4 @@ config TIPC_DEBUG | |||
114 | Only say Y here if you are having trouble with TIPC. It will | 112 | Only say Y here if you are having trouble with TIPC. It will |
115 | enable the display of detailed information about what is going on. | 113 | enable the display of detailed information about what is going on. |
116 | 114 | ||
117 | endmenu | 115 | endif # TIPC |
diff --git a/net/tipc/eth_media.c b/net/tipc/eth_media.c index 0ee6ded18f3a..77d2d9ce8962 100644 --- a/net/tipc/eth_media.c +++ b/net/tipc/eth_media.c | |||
@@ -120,18 +120,20 @@ static int recv_msg(struct sk_buff *buf, struct net_device *dev, | |||
120 | 120 | ||
121 | static int enable_bearer(struct tipc_bearer *tb_ptr) | 121 | static int enable_bearer(struct tipc_bearer *tb_ptr) |
122 | { | 122 | { |
123 | struct net_device *dev, *pdev; | 123 | struct net_device *dev = NULL; |
124 | struct net_device *pdev = NULL; | ||
124 | struct eth_bearer *eb_ptr = ð_bearers[0]; | 125 | struct eth_bearer *eb_ptr = ð_bearers[0]; |
125 | struct eth_bearer *stop = ð_bearers[MAX_ETH_BEARERS]; | 126 | struct eth_bearer *stop = ð_bearers[MAX_ETH_BEARERS]; |
126 | char *driver_name = strchr((const char *)tb_ptr->name, ':') + 1; | 127 | char *driver_name = strchr((const char *)tb_ptr->name, ':') + 1; |
127 | 128 | ||
128 | /* Find device with specified name */ | 129 | /* Find device with specified name */ |
129 | dev = NULL; | 130 | |
130 | for_each_netdev(pdev) | 131 | for_each_netdev(pdev){ |
131 | if (!strncmp(dev->name, driver_name, IFNAMSIZ)) { | 132 | if (!strncmp(pdev->name, driver_name, IFNAMSIZ)) { |
132 | dev = pdev; | 133 | dev = pdev; |
133 | break; | 134 | break; |
134 | } | 135 | } |
136 | } | ||
135 | if (!dev) | 137 | if (!dev) |
136 | return -ENODEV; | 138 | return -ENODEV; |
137 | 139 | ||
diff --git a/net/xfrm/xfrm_algo.c b/net/xfrm/xfrm_algo.c index 6249a9405bb8..5ced62c19c63 100644 --- a/net/xfrm/xfrm_algo.c +++ b/net/xfrm/xfrm_algo.c | |||
@@ -347,67 +347,44 @@ static inline int calg_entries(void) | |||
347 | return ARRAY_SIZE(calg_list); | 347 | return ARRAY_SIZE(calg_list); |
348 | } | 348 | } |
349 | 349 | ||
350 | /* Todo: generic iterators */ | 350 | struct xfrm_algo_list { |
351 | struct xfrm_algo_desc *xfrm_aalg_get_byid(int alg_id) | 351 | struct xfrm_algo_desc *algs; |
352 | { | 352 | int entries; |
353 | int i; | 353 | u32 type; |
354 | 354 | u32 mask; | |
355 | for (i = 0; i < aalg_entries(); i++) { | 355 | }; |
356 | if (aalg_list[i].desc.sadb_alg_id == alg_id) { | ||
357 | if (aalg_list[i].available) | ||
358 | return &aalg_list[i]; | ||
359 | else | ||
360 | break; | ||
361 | } | ||
362 | } | ||
363 | return NULL; | ||
364 | } | ||
365 | EXPORT_SYMBOL_GPL(xfrm_aalg_get_byid); | ||
366 | |||
367 | struct xfrm_algo_desc *xfrm_ealg_get_byid(int alg_id) | ||
368 | { | ||
369 | int i; | ||
370 | 356 | ||
371 | for (i = 0; i < ealg_entries(); i++) { | 357 | static const struct xfrm_algo_list xfrm_aalg_list = { |
372 | if (ealg_list[i].desc.sadb_alg_id == alg_id) { | 358 | .algs = aalg_list, |
373 | if (ealg_list[i].available) | 359 | .entries = ARRAY_SIZE(aalg_list), |
374 | return &ealg_list[i]; | 360 | .type = CRYPTO_ALG_TYPE_HASH, |
375 | else | 361 | .mask = CRYPTO_ALG_TYPE_HASH_MASK | CRYPTO_ALG_ASYNC, |
376 | break; | 362 | }; |
377 | } | ||
378 | } | ||
379 | return NULL; | ||
380 | } | ||
381 | EXPORT_SYMBOL_GPL(xfrm_ealg_get_byid); | ||
382 | 363 | ||
383 | struct xfrm_algo_desc *xfrm_calg_get_byid(int alg_id) | 364 | static const struct xfrm_algo_list xfrm_ealg_list = { |
384 | { | 365 | .algs = ealg_list, |
385 | int i; | 366 | .entries = ARRAY_SIZE(ealg_list), |
367 | .type = CRYPTO_ALG_TYPE_BLKCIPHER, | ||
368 | .mask = CRYPTO_ALG_TYPE_MASK | CRYPTO_ALG_ASYNC, | ||
369 | }; | ||
386 | 370 | ||
387 | for (i = 0; i < calg_entries(); i++) { | 371 | static const struct xfrm_algo_list xfrm_calg_list = { |
388 | if (calg_list[i].desc.sadb_alg_id == alg_id) { | 372 | .algs = calg_list, |
389 | if (calg_list[i].available) | 373 | .entries = ARRAY_SIZE(calg_list), |
390 | return &calg_list[i]; | 374 | .type = CRYPTO_ALG_TYPE_COMPRESS, |
391 | else | 375 | .mask = CRYPTO_ALG_TYPE_MASK | CRYPTO_ALG_ASYNC, |
392 | break; | 376 | }; |
393 | } | ||
394 | } | ||
395 | return NULL; | ||
396 | } | ||
397 | EXPORT_SYMBOL_GPL(xfrm_calg_get_byid); | ||
398 | 377 | ||
399 | static struct xfrm_algo_desc *xfrm_get_byname(struct xfrm_algo_desc *list, | 378 | static struct xfrm_algo_desc *xfrm_find_algo( |
400 | int entries, u32 type, u32 mask, | 379 | const struct xfrm_algo_list *algo_list, |
401 | char *name, int probe) | 380 | int match(const struct xfrm_algo_desc *entry, const void *data), |
381 | const void *data, int probe) | ||
402 | { | 382 | { |
383 | struct xfrm_algo_desc *list = algo_list->algs; | ||
403 | int i, status; | 384 | int i, status; |
404 | 385 | ||
405 | if (!name) | 386 | for (i = 0; i < algo_list->entries; i++) { |
406 | return NULL; | 387 | if (!match(list + i, data)) |
407 | |||
408 | for (i = 0; i < entries; i++) { | ||
409 | if (strcmp(name, list[i].name) && | ||
410 | (!list[i].compat || strcmp(name, list[i].compat))) | ||
411 | continue; | 388 | continue; |
412 | 389 | ||
413 | if (list[i].available) | 390 | if (list[i].available) |
@@ -416,8 +393,8 @@ static struct xfrm_algo_desc *xfrm_get_byname(struct xfrm_algo_desc *list, | |||
416 | if (!probe) | 393 | if (!probe) |
417 | break; | 394 | break; |
418 | 395 | ||
419 | status = crypto_has_alg(list[i].name, type, | 396 | status = crypto_has_alg(list[i].name, algo_list->type, |
420 | mask | CRYPTO_ALG_ASYNC); | 397 | algo_list->mask); |
421 | if (!status) | 398 | if (!status) |
422 | break; | 399 | break; |
423 | 400 | ||
@@ -427,27 +404,60 @@ static struct xfrm_algo_desc *xfrm_get_byname(struct xfrm_algo_desc *list, | |||
427 | return NULL; | 404 | return NULL; |
428 | } | 405 | } |
429 | 406 | ||
407 | static int xfrm_alg_id_match(const struct xfrm_algo_desc *entry, | ||
408 | const void *data) | ||
409 | { | ||
410 | return entry->desc.sadb_alg_id == (unsigned long)data; | ||
411 | } | ||
412 | |||
413 | struct xfrm_algo_desc *xfrm_aalg_get_byid(int alg_id) | ||
414 | { | ||
415 | return xfrm_find_algo(&xfrm_aalg_list, xfrm_alg_id_match, | ||
416 | (void *)(unsigned long)alg_id, 1); | ||
417 | } | ||
418 | EXPORT_SYMBOL_GPL(xfrm_aalg_get_byid); | ||
419 | |||
420 | struct xfrm_algo_desc *xfrm_ealg_get_byid(int alg_id) | ||
421 | { | ||
422 | return xfrm_find_algo(&xfrm_ealg_list, xfrm_alg_id_match, | ||
423 | (void *)(unsigned long)alg_id, 1); | ||
424 | } | ||
425 | EXPORT_SYMBOL_GPL(xfrm_ealg_get_byid); | ||
426 | |||
427 | struct xfrm_algo_desc *xfrm_calg_get_byid(int alg_id) | ||
428 | { | ||
429 | return xfrm_find_algo(&xfrm_calg_list, xfrm_alg_id_match, | ||
430 | (void *)(unsigned long)alg_id, 1); | ||
431 | } | ||
432 | EXPORT_SYMBOL_GPL(xfrm_calg_get_byid); | ||
433 | |||
434 | static int xfrm_alg_name_match(const struct xfrm_algo_desc *entry, | ||
435 | const void *data) | ||
436 | { | ||
437 | const char *name = data; | ||
438 | |||
439 | return name && (!strcmp(name, entry->name) || | ||
440 | (entry->compat && !strcmp(name, entry->compat))); | ||
441 | } | ||
442 | |||
430 | struct xfrm_algo_desc *xfrm_aalg_get_byname(char *name, int probe) | 443 | struct xfrm_algo_desc *xfrm_aalg_get_byname(char *name, int probe) |
431 | { | 444 | { |
432 | return xfrm_get_byname(aalg_list, aalg_entries(), | 445 | return xfrm_find_algo(&xfrm_aalg_list, xfrm_alg_name_match, name, |
433 | CRYPTO_ALG_TYPE_HASH, CRYPTO_ALG_TYPE_HASH_MASK, | 446 | probe); |
434 | name, probe); | ||
435 | } | 447 | } |
436 | EXPORT_SYMBOL_GPL(xfrm_aalg_get_byname); | 448 | EXPORT_SYMBOL_GPL(xfrm_aalg_get_byname); |
437 | 449 | ||
438 | struct xfrm_algo_desc *xfrm_ealg_get_byname(char *name, int probe) | 450 | struct xfrm_algo_desc *xfrm_ealg_get_byname(char *name, int probe) |
439 | { | 451 | { |
440 | return xfrm_get_byname(ealg_list, ealg_entries(), | 452 | return xfrm_find_algo(&xfrm_ealg_list, xfrm_alg_name_match, name, |
441 | CRYPTO_ALG_TYPE_BLKCIPHER, CRYPTO_ALG_TYPE_MASK, | 453 | probe); |
442 | name, probe); | ||
443 | } | 454 | } |
444 | EXPORT_SYMBOL_GPL(xfrm_ealg_get_byname); | 455 | EXPORT_SYMBOL_GPL(xfrm_ealg_get_byname); |
445 | 456 | ||
446 | struct xfrm_algo_desc *xfrm_calg_get_byname(char *name, int probe) | 457 | struct xfrm_algo_desc *xfrm_calg_get_byname(char *name, int probe) |
447 | { | 458 | { |
448 | return xfrm_get_byname(calg_list, calg_entries(), | 459 | return xfrm_find_algo(&xfrm_calg_list, xfrm_alg_name_match, name, |
449 | CRYPTO_ALG_TYPE_COMPRESS, CRYPTO_ALG_TYPE_MASK, | 460 | probe); |
450 | name, probe); | ||
451 | } | 461 | } |
452 | EXPORT_SYMBOL_GPL(xfrm_calg_get_byname); | 462 | EXPORT_SYMBOL_GPL(xfrm_calg_get_byname); |
453 | 463 | ||
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index d0882e53b6fc..b8bab89616a0 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c | |||
@@ -29,6 +29,8 @@ | |||
29 | 29 | ||
30 | #include "xfrm_hash.h" | 30 | #include "xfrm_hash.h" |
31 | 31 | ||
32 | int sysctl_xfrm_larval_drop; | ||
33 | |||
32 | DEFINE_MUTEX(xfrm_cfg_mutex); | 34 | DEFINE_MUTEX(xfrm_cfg_mutex); |
33 | EXPORT_SYMBOL(xfrm_cfg_mutex); | 35 | EXPORT_SYMBOL(xfrm_cfg_mutex); |
34 | 36 | ||
@@ -1390,8 +1392,8 @@ static int stale_bundle(struct dst_entry *dst); | |||
1390 | * At the moment we eat a raw IP route. Mostly to speed up lookups | 1392 | * At the moment we eat a raw IP route. Mostly to speed up lookups |
1391 | * on interfaces with disabled IPsec. | 1393 | * on interfaces with disabled IPsec. |
1392 | */ | 1394 | */ |
1393 | int xfrm_lookup(struct dst_entry **dst_p, struct flowi *fl, | 1395 | int __xfrm_lookup(struct dst_entry **dst_p, struct flowi *fl, |
1394 | struct sock *sk, int flags) | 1396 | struct sock *sk, int flags) |
1395 | { | 1397 | { |
1396 | struct xfrm_policy *policy; | 1398 | struct xfrm_policy *policy; |
1397 | struct xfrm_policy *pols[XFRM_POLICY_TYPE_MAX]; | 1399 | struct xfrm_policy *pols[XFRM_POLICY_TYPE_MAX]; |
@@ -1509,6 +1511,13 @@ restart: | |||
1509 | 1511 | ||
1510 | if (unlikely(nx<0)) { | 1512 | if (unlikely(nx<0)) { |
1511 | err = nx; | 1513 | err = nx; |
1514 | if (err == -EAGAIN && sysctl_xfrm_larval_drop) { | ||
1515 | /* EREMOTE tells the caller to generate | ||
1516 | * a one-shot blackhole route. | ||
1517 | */ | ||
1518 | xfrm_pol_put(policy); | ||
1519 | return -EREMOTE; | ||
1520 | } | ||
1512 | if (err == -EAGAIN && flags) { | 1521 | if (err == -EAGAIN && flags) { |
1513 | DECLARE_WAITQUEUE(wait, current); | 1522 | DECLARE_WAITQUEUE(wait, current); |
1514 | 1523 | ||
@@ -1598,6 +1607,21 @@ error: | |||
1598 | *dst_p = NULL; | 1607 | *dst_p = NULL; |
1599 | return err; | 1608 | return err; |
1600 | } | 1609 | } |
1610 | EXPORT_SYMBOL(__xfrm_lookup); | ||
1611 | |||
1612 | int xfrm_lookup(struct dst_entry **dst_p, struct flowi *fl, | ||
1613 | struct sock *sk, int flags) | ||
1614 | { | ||
1615 | int err = __xfrm_lookup(dst_p, fl, sk, flags); | ||
1616 | |||
1617 | if (err == -EREMOTE) { | ||
1618 | dst_release(*dst_p); | ||
1619 | *dst_p = NULL; | ||
1620 | err = -EAGAIN; | ||
1621 | } | ||
1622 | |||
1623 | return err; | ||
1624 | } | ||
1601 | EXPORT_SYMBOL(xfrm_lookup); | 1625 | EXPORT_SYMBOL(xfrm_lookup); |
1602 | 1626 | ||
1603 | static inline int | 1627 | static inline int |