Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.14-rc2 2586 lines 68 kB view raw
1/********************************************************************* 2 * 3 * Filename: af_irda.c 4 * Version: 0.9 5 * Description: IrDA sockets implementation 6 * Status: Stable 7 * Author: Dag Brattli <dagb@cs.uit.no> 8 * Created at: Sun May 31 10:12:43 1998 9 * Modified at: Sat Dec 25 21:10:23 1999 10 * Modified by: Dag Brattli <dag@brattli.net> 11 * Sources: af_netroom.c, af_ax25.c, af_rose.c, af_x25.c etc. 12 * 13 * Copyright (c) 1999 Dag Brattli <dagb@cs.uit.no> 14 * Copyright (c) 1999-2003 Jean Tourrilhes <jt@hpl.hp.com> 15 * All Rights Reserved. 16 * 17 * This program is free software; you can redistribute it and/or 18 * modify it under the terms of the GNU General Public License as 19 * published by the Free Software Foundation; either version 2 of 20 * the License, or (at your option) any later version. 21 * 22 * This program is distributed in the hope that it will be useful, 23 * but WITHOUT ANY WARRANTY; without even the implied warranty of 24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 25 * GNU General Public License for more details. 26 * 27 * You should have received a copy of the GNU General Public License 28 * along with this program; if not, write to the Free Software 29 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 30 * MA 02111-1307 USA 31 * 32 * Linux-IrDA now supports four different types of IrDA sockets: 33 * 34 * o SOCK_STREAM: TinyTP connections with SAR disabled. The 35 * max SDU size is 0 for conn. of this type 36 * o SOCK_SEQPACKET: TinyTP connections with SAR enabled. TTP may 37 * fragment the messages, but will preserve 38 * the message boundaries 39 * o SOCK_DGRAM: IRDAPROTO_UNITDATA: TinyTP connections with Unitdata 40 * (unreliable) transfers 41 * IRDAPROTO_ULTRA: Connectionless and unreliable data 42 * 43 ********************************************************************/ 44 45#include <linux/config.h> 46#include <linux/module.h> 47#include <linux/types.h> 48#include <linux/socket.h> 49#include <linux/sockios.h> 50#include <linux/init.h> 51#include <linux/net.h> 52#include <linux/irda.h> 53#include <linux/poll.h> 54 55#include <asm/ioctls.h> /* TIOCOUTQ, TIOCINQ */ 56#include <asm/uaccess.h> 57 58#include <net/sock.h> 59#include <net/tcp_states.h> 60 61#include <net/irda/af_irda.h> 62 63static int irda_create(struct socket *sock, int protocol); 64 65static struct proto_ops irda_stream_ops; 66static struct proto_ops irda_seqpacket_ops; 67static struct proto_ops irda_dgram_ops; 68 69#ifdef CONFIG_IRDA_ULTRA 70static struct proto_ops irda_ultra_ops; 71#define ULTRA_MAX_DATA 382 72#endif /* CONFIG_IRDA_ULTRA */ 73 74#define IRDA_MAX_HEADER (TTP_MAX_HEADER) 75 76/* 77 * Function irda_data_indication (instance, sap, skb) 78 * 79 * Received some data from TinyTP. Just queue it on the receive queue 80 * 81 */ 82static int irda_data_indication(void *instance, void *sap, struct sk_buff *skb) 83{ 84 struct irda_sock *self; 85 struct sock *sk; 86 int err; 87 88 IRDA_DEBUG(3, "%s()\n", __FUNCTION__); 89 90 self = instance; 91 sk = instance; 92 IRDA_ASSERT(sk != NULL, return -1;); 93 94 err = sock_queue_rcv_skb(sk, skb); 95 if (err) { 96 IRDA_DEBUG(1, "%s(), error: no more mem!\n", __FUNCTION__); 97 self->rx_flow = FLOW_STOP; 98 99 /* When we return error, TTP will need to requeue the skb */ 100 return err; 101 } 102 103 return 0; 104} 105 106/* 107 * Function irda_disconnect_indication (instance, sap, reason, skb) 108 * 109 * Connection has been closed. Check reason to find out why 110 * 111 */ 112static void irda_disconnect_indication(void *instance, void *sap, 113 LM_REASON reason, struct sk_buff *skb) 114{ 115 struct irda_sock *self; 116 struct sock *sk; 117 118 self = instance; 119 120 IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self); 121 122 /* Don't care about it, but let's not leak it */ 123 if(skb) 124 dev_kfree_skb(skb); 125 126 sk = instance; 127 if (sk == NULL) { 128 IRDA_DEBUG(0, "%s(%p) : BUG : sk is NULL\n", 129 __FUNCTION__, self); 130 return; 131 } 132 133 /* Prevent race conditions with irda_release() and irda_shutdown() */ 134 if (!sock_flag(sk, SOCK_DEAD) && sk->sk_state != TCP_CLOSE) { 135 sk->sk_state = TCP_CLOSE; 136 sk->sk_err = ECONNRESET; 137 sk->sk_shutdown |= SEND_SHUTDOWN; 138 139 sk->sk_state_change(sk); 140 /* Uh-oh... Should use sock_orphan ? */ 141 sock_set_flag(sk, SOCK_DEAD); 142 143 /* Close our TSAP. 144 * If we leave it open, IrLMP put it back into the list of 145 * unconnected LSAPs. The problem is that any incoming request 146 * can then be matched to this socket (and it will be, because 147 * it is at the head of the list). This would prevent any 148 * listening socket waiting on the same TSAP to get those 149 * requests. Some apps forget to close sockets, or hang to it 150 * a bit too long, so we may stay in this dead state long 151 * enough to be noticed... 152 * Note : all socket function do check sk->sk_state, so we are 153 * safe... 154 * Jean II 155 */ 156 if (self->tsap) { 157 irttp_close_tsap(self->tsap); 158 self->tsap = NULL; 159 } 160 } 161 162 /* Note : once we are there, there is not much you want to do 163 * with the socket anymore, apart from closing it. 164 * For example, bind() and connect() won't reset sk->sk_err, 165 * sk->sk_shutdown and sk->sk_flags to valid values... 166 * Jean II 167 */ 168} 169 170/* 171 * Function irda_connect_confirm (instance, sap, qos, max_sdu_size, skb) 172 * 173 * Connections has been confirmed by the remote device 174 * 175 */ 176static void irda_connect_confirm(void *instance, void *sap, 177 struct qos_info *qos, 178 __u32 max_sdu_size, __u8 max_header_size, 179 struct sk_buff *skb) 180{ 181 struct irda_sock *self; 182 struct sock *sk; 183 184 self = instance; 185 186 IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self); 187 188 sk = instance; 189 if (sk == NULL) { 190 dev_kfree_skb(skb); 191 return; 192 } 193 194 dev_kfree_skb(skb); 195 // Should be ??? skb_queue_tail(&sk->sk_receive_queue, skb); 196 197 /* How much header space do we need to reserve */ 198 self->max_header_size = max_header_size; 199 200 /* IrTTP max SDU size in transmit direction */ 201 self->max_sdu_size_tx = max_sdu_size; 202 203 /* Find out what the largest chunk of data that we can transmit is */ 204 switch (sk->sk_type) { 205 case SOCK_STREAM: 206 if (max_sdu_size != 0) { 207 IRDA_ERROR("%s: max_sdu_size must be 0\n", 208 __FUNCTION__); 209 return; 210 } 211 self->max_data_size = irttp_get_max_seg_size(self->tsap); 212 break; 213 case SOCK_SEQPACKET: 214 if (max_sdu_size == 0) { 215 IRDA_ERROR("%s: max_sdu_size cannot be 0\n", 216 __FUNCTION__); 217 return; 218 } 219 self->max_data_size = max_sdu_size; 220 break; 221 default: 222 self->max_data_size = irttp_get_max_seg_size(self->tsap); 223 }; 224 225 IRDA_DEBUG(2, "%s(), max_data_size=%d\n", __FUNCTION__, 226 self->max_data_size); 227 228 memcpy(&self->qos_tx, qos, sizeof(struct qos_info)); 229 230 /* We are now connected! */ 231 sk->sk_state = TCP_ESTABLISHED; 232 sk->sk_state_change(sk); 233} 234 235/* 236 * Function irda_connect_indication(instance, sap, qos, max_sdu_size, userdata) 237 * 238 * Incoming connection 239 * 240 */ 241static void irda_connect_indication(void *instance, void *sap, 242 struct qos_info *qos, __u32 max_sdu_size, 243 __u8 max_header_size, struct sk_buff *skb) 244{ 245 struct irda_sock *self; 246 struct sock *sk; 247 248 self = instance; 249 250 IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self); 251 252 sk = instance; 253 if (sk == NULL) { 254 dev_kfree_skb(skb); 255 return; 256 } 257 258 /* How much header space do we need to reserve */ 259 self->max_header_size = max_header_size; 260 261 /* IrTTP max SDU size in transmit direction */ 262 self->max_sdu_size_tx = max_sdu_size; 263 264 /* Find out what the largest chunk of data that we can transmit is */ 265 switch (sk->sk_type) { 266 case SOCK_STREAM: 267 if (max_sdu_size != 0) { 268 IRDA_ERROR("%s: max_sdu_size must be 0\n", 269 __FUNCTION__); 270 kfree_skb(skb); 271 return; 272 } 273 self->max_data_size = irttp_get_max_seg_size(self->tsap); 274 break; 275 case SOCK_SEQPACKET: 276 if (max_sdu_size == 0) { 277 IRDA_ERROR("%s: max_sdu_size cannot be 0\n", 278 __FUNCTION__); 279 kfree_skb(skb); 280 return; 281 } 282 self->max_data_size = max_sdu_size; 283 break; 284 default: 285 self->max_data_size = irttp_get_max_seg_size(self->tsap); 286 }; 287 288 IRDA_DEBUG(2, "%s(), max_data_size=%d\n", __FUNCTION__, 289 self->max_data_size); 290 291 memcpy(&self->qos_tx, qos, sizeof(struct qos_info)); 292 293 skb_queue_tail(&sk->sk_receive_queue, skb); 294 sk->sk_state_change(sk); 295} 296 297/* 298 * Function irda_connect_response (handle) 299 * 300 * Accept incoming connection 301 * 302 */ 303static void irda_connect_response(struct irda_sock *self) 304{ 305 struct sk_buff *skb; 306 307 IRDA_DEBUG(2, "%s()\n", __FUNCTION__); 308 309 IRDA_ASSERT(self != NULL, return;); 310 311 skb = dev_alloc_skb(64); 312 if (skb == NULL) { 313 IRDA_DEBUG(0, "%s() Unable to allocate sk_buff!\n", 314 __FUNCTION__); 315 return; 316 } 317 318 /* Reserve space for MUX_CONTROL and LAP header */ 319 skb_reserve(skb, IRDA_MAX_HEADER); 320 321 irttp_connect_response(self->tsap, self->max_sdu_size_rx, skb); 322} 323 324/* 325 * Function irda_flow_indication (instance, sap, flow) 326 * 327 * Used by TinyTP to tell us if it can accept more data or not 328 * 329 */ 330static void irda_flow_indication(void *instance, void *sap, LOCAL_FLOW flow) 331{ 332 struct irda_sock *self; 333 struct sock *sk; 334 335 IRDA_DEBUG(2, "%s()\n", __FUNCTION__); 336 337 self = instance; 338 sk = instance; 339 IRDA_ASSERT(sk != NULL, return;); 340 341 switch (flow) { 342 case FLOW_STOP: 343 IRDA_DEBUG(1, "%s(), IrTTP wants us to slow down\n", 344 __FUNCTION__); 345 self->tx_flow = flow; 346 break; 347 case FLOW_START: 348 self->tx_flow = flow; 349 IRDA_DEBUG(1, "%s(), IrTTP wants us to start again\n", 350 __FUNCTION__); 351 wake_up_interruptible(sk->sk_sleep); 352 break; 353 default: 354 IRDA_DEBUG(0, "%s(), Unknown flow command!\n", __FUNCTION__); 355 /* Unknown flow command, better stop */ 356 self->tx_flow = flow; 357 break; 358 } 359} 360 361/* 362 * Function irda_getvalue_confirm (obj_id, value, priv) 363 * 364 * Got answer from remote LM-IAS, just pass object to requester... 365 * 366 * Note : duplicate from above, but we need our own version that 367 * doesn't touch the dtsap_sel and save the full value structure... 368 */ 369static void irda_getvalue_confirm(int result, __u16 obj_id, 370 struct ias_value *value, void *priv) 371{ 372 struct irda_sock *self; 373 374 self = (struct irda_sock *) priv; 375 if (!self) { 376 IRDA_WARNING("%s: lost myself!\n", __FUNCTION__); 377 return; 378 } 379 380 IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self); 381 382 /* We probably don't need to make any more queries */ 383 iriap_close(self->iriap); 384 self->iriap = NULL; 385 386 /* Check if request succeeded */ 387 if (result != IAS_SUCCESS) { 388 IRDA_DEBUG(1, "%s(), IAS query failed! (%d)\n", __FUNCTION__, 389 result); 390 391 self->errno = result; /* We really need it later */ 392 393 /* Wake up any processes waiting for result */ 394 wake_up_interruptible(&self->query_wait); 395 396 return; 397 } 398 399 /* Pass the object to the caller (so the caller must delete it) */ 400 self->ias_result = value; 401 self->errno = 0; 402 403 /* Wake up any processes waiting for result */ 404 wake_up_interruptible(&self->query_wait); 405} 406 407/* 408 * Function irda_selective_discovery_indication (discovery) 409 * 410 * Got a selective discovery indication from IrLMP. 411 * 412 * IrLMP is telling us that this node is new and matching our hint bit 413 * filter. Wake up any process waiting for answer... 414 */ 415static void irda_selective_discovery_indication(discinfo_t *discovery, 416 DISCOVERY_MODE mode, 417 void *priv) 418{ 419 struct irda_sock *self; 420 421 IRDA_DEBUG(2, "%s()\n", __FUNCTION__); 422 423 self = (struct irda_sock *) priv; 424 if (!self) { 425 IRDA_WARNING("%s: lost myself!\n", __FUNCTION__); 426 return; 427 } 428 429 /* Pass parameter to the caller */ 430 self->cachedaddr = discovery->daddr; 431 432 /* Wake up process if its waiting for device to be discovered */ 433 wake_up_interruptible(&self->query_wait); 434} 435 436/* 437 * Function irda_discovery_timeout (priv) 438 * 439 * Timeout in the selective discovery process 440 * 441 * We were waiting for a node to be discovered, but nothing has come up 442 * so far. Wake up the user and tell him that we failed... 443 */ 444static void irda_discovery_timeout(u_long priv) 445{ 446 struct irda_sock *self; 447 448 IRDA_DEBUG(2, "%s()\n", __FUNCTION__); 449 450 self = (struct irda_sock *) priv; 451 IRDA_ASSERT(self != NULL, return;); 452 453 /* Nothing for the caller */ 454 self->cachelog = NULL; 455 self->cachedaddr = 0; 456 self->errno = -ETIME; 457 458 /* Wake up process if its still waiting... */ 459 wake_up_interruptible(&self->query_wait); 460} 461 462/* 463 * Function irda_open_tsap (self) 464 * 465 * Open local Transport Service Access Point (TSAP) 466 * 467 */ 468static int irda_open_tsap(struct irda_sock *self, __u8 tsap_sel, char *name) 469{ 470 notify_t notify; 471 472 if (self->tsap) { 473 IRDA_WARNING("%s: busy!\n", __FUNCTION__); 474 return -EBUSY; 475 } 476 477 /* Initialize callbacks to be used by the IrDA stack */ 478 irda_notify_init(&notify); 479 notify.connect_confirm = irda_connect_confirm; 480 notify.connect_indication = irda_connect_indication; 481 notify.disconnect_indication = irda_disconnect_indication; 482 notify.data_indication = irda_data_indication; 483 notify.udata_indication = irda_data_indication; 484 notify.flow_indication = irda_flow_indication; 485 notify.instance = self; 486 strncpy(notify.name, name, NOTIFY_MAX_NAME); 487 488 self->tsap = irttp_open_tsap(tsap_sel, DEFAULT_INITIAL_CREDIT, 489 &notify); 490 if (self->tsap == NULL) { 491 IRDA_DEBUG(0, "%s(), Unable to allocate TSAP!\n", 492 __FUNCTION__); 493 return -ENOMEM; 494 } 495 /* Remember which TSAP selector we actually got */ 496 self->stsap_sel = self->tsap->stsap_sel; 497 498 return 0; 499} 500 501/* 502 * Function irda_open_lsap (self) 503 * 504 * Open local Link Service Access Point (LSAP). Used for opening Ultra 505 * sockets 506 */ 507#ifdef CONFIG_IRDA_ULTRA 508static int irda_open_lsap(struct irda_sock *self, int pid) 509{ 510 notify_t notify; 511 512 if (self->lsap) { 513 IRDA_WARNING("%s(), busy!\n", __FUNCTION__); 514 return -EBUSY; 515 } 516 517 /* Initialize callbacks to be used by the IrDA stack */ 518 irda_notify_init(&notify); 519 notify.udata_indication = irda_data_indication; 520 notify.instance = self; 521 strncpy(notify.name, "Ultra", NOTIFY_MAX_NAME); 522 523 self->lsap = irlmp_open_lsap(LSAP_CONNLESS, &notify, pid); 524 if (self->lsap == NULL) { 525 IRDA_DEBUG( 0, "%s(), Unable to allocate LSAP!\n", __FUNCTION__); 526 return -ENOMEM; 527 } 528 529 return 0; 530} 531#endif /* CONFIG_IRDA_ULTRA */ 532 533/* 534 * Function irda_find_lsap_sel (self, name) 535 * 536 * Try to lookup LSAP selector in remote LM-IAS 537 * 538 * Basically, we start a IAP query, and then go to sleep. When the query 539 * return, irda_getvalue_confirm will wake us up, and we can examine the 540 * result of the query... 541 * Note that in some case, the query fail even before we go to sleep, 542 * creating some races... 543 */ 544static int irda_find_lsap_sel(struct irda_sock *self, char *name) 545{ 546 IRDA_DEBUG(2, "%s(%p, %s)\n", __FUNCTION__, self, name); 547 548 IRDA_ASSERT(self != NULL, return -1;); 549 550 if (self->iriap) { 551 IRDA_WARNING("%s(): busy with a previous query\n", 552 __FUNCTION__); 553 return -EBUSY; 554 } 555 556 self->iriap = iriap_open(LSAP_ANY, IAS_CLIENT, self, 557 irda_getvalue_confirm); 558 if(self->iriap == NULL) 559 return -ENOMEM; 560 561 /* Treat unexpected wakeup as disconnect */ 562 self->errno = -EHOSTUNREACH; 563 564 /* Query remote LM-IAS */ 565 iriap_getvaluebyclass_request(self->iriap, self->saddr, self->daddr, 566 name, "IrDA:TinyTP:LsapSel"); 567 568 /* Wait for answer, if not yet finished (or failed) */ 569 if (wait_event_interruptible(self->query_wait, (self->iriap==NULL))) 570 /* Treat signals as disconnect */ 571 return -EHOSTUNREACH; 572 573 /* Check what happened */ 574 if (self->errno) 575 { 576 /* Requested object/attribute doesn't exist */ 577 if((self->errno == IAS_CLASS_UNKNOWN) || 578 (self->errno == IAS_ATTRIB_UNKNOWN)) 579 return (-EADDRNOTAVAIL); 580 else 581 return (-EHOSTUNREACH); 582 } 583 584 /* Get the remote TSAP selector */ 585 switch (self->ias_result->type) { 586 case IAS_INTEGER: 587 IRDA_DEBUG(4, "%s() int=%d\n", 588 __FUNCTION__, self->ias_result->t.integer); 589 590 if (self->ias_result->t.integer != -1) 591 self->dtsap_sel = self->ias_result->t.integer; 592 else 593 self->dtsap_sel = 0; 594 break; 595 default: 596 self->dtsap_sel = 0; 597 IRDA_DEBUG(0, "%s(), bad type!\n", __FUNCTION__); 598 break; 599 } 600 if (self->ias_result) 601 irias_delete_value(self->ias_result); 602 603 if (self->dtsap_sel) 604 return 0; 605 606 return -EADDRNOTAVAIL; 607} 608 609/* 610 * Function irda_discover_daddr_and_lsap_sel (self, name) 611 * 612 * This try to find a device with the requested service. 613 * 614 * It basically look into the discovery log. For each address in the list, 615 * it queries the LM-IAS of the device to find if this device offer 616 * the requested service. 617 * If there is more than one node supporting the service, we complain 618 * to the user (it should move devices around). 619 * The, we set both the destination address and the lsap selector to point 620 * on the service on the unique device we have found. 621 * 622 * Note : this function fails if there is more than one device in range, 623 * because IrLMP doesn't disconnect the LAP when the last LSAP is closed. 624 * Moreover, we would need to wait the LAP disconnection... 625 */ 626static int irda_discover_daddr_and_lsap_sel(struct irda_sock *self, char *name) 627{ 628 discinfo_t *discoveries; /* Copy of the discovery log */ 629 int number; /* Number of nodes in the log */ 630 int i; 631 int err = -ENETUNREACH; 632 __u32 daddr = DEV_ADDR_ANY; /* Address we found the service on */ 633 __u8 dtsap_sel = 0x0; /* TSAP associated with it */ 634 635 IRDA_DEBUG(2, "%s(), name=%s\n", __FUNCTION__, name); 636 637 IRDA_ASSERT(self != NULL, return -1;); 638 639 /* Ask lmp for the current discovery log 640 * Note : we have to use irlmp_get_discoveries(), as opposed 641 * to play with the cachelog directly, because while we are 642 * making our ias query, le log might change... */ 643 discoveries = irlmp_get_discoveries(&number, self->mask.word, 644 self->nslots); 645 /* Check if the we got some results */ 646 if (discoveries == NULL) 647 return -ENETUNREACH; /* No nodes discovered */ 648 649 /* 650 * Now, check all discovered devices (if any), and connect 651 * client only about the services that the client is 652 * interested in... 653 */ 654 for(i = 0; i < number; i++) { 655 /* Try the address in the log */ 656 self->daddr = discoveries[i].daddr; 657 self->saddr = 0x0; 658 IRDA_DEBUG(1, "%s(), trying daddr = %08x\n", 659 __FUNCTION__, self->daddr); 660 661 /* Query remote LM-IAS for this service */ 662 err = irda_find_lsap_sel(self, name); 663 switch (err) { 664 case 0: 665 /* We found the requested service */ 666 if(daddr != DEV_ADDR_ANY) { 667 IRDA_DEBUG(1, "%s(), discovered service ''%s'' in two different devices !!!\n", 668 __FUNCTION__, name); 669 self->daddr = DEV_ADDR_ANY; 670 kfree(discoveries); 671 return(-ENOTUNIQ); 672 } 673 /* First time we found that one, save it ! */ 674 daddr = self->daddr; 675 dtsap_sel = self->dtsap_sel; 676 break; 677 case -EADDRNOTAVAIL: 678 /* Requested service simply doesn't exist on this node */ 679 break; 680 default: 681 /* Something bad did happen :-( */ 682 IRDA_DEBUG(0, "%s(), unexpected IAS query failure\n", __FUNCTION__); 683 self->daddr = DEV_ADDR_ANY; 684 kfree(discoveries); 685 return(-EHOSTUNREACH); 686 break; 687 } 688 } 689 /* Cleanup our copy of the discovery log */ 690 kfree(discoveries); 691 692 /* Check out what we found */ 693 if(daddr == DEV_ADDR_ANY) { 694 IRDA_DEBUG(1, "%s(), cannot discover service ''%s'' in any device !!!\n", 695 __FUNCTION__, name); 696 self->daddr = DEV_ADDR_ANY; 697 return(-EADDRNOTAVAIL); 698 } 699 700 /* Revert back to discovered device & service */ 701 self->daddr = daddr; 702 self->saddr = 0x0; 703 self->dtsap_sel = dtsap_sel; 704 705 IRDA_DEBUG(1, "%s(), discovered requested service ''%s'' at address %08x\n", 706 __FUNCTION__, name, self->daddr); 707 708 return 0; 709} 710 711/* 712 * Function irda_getname (sock, uaddr, uaddr_len, peer) 713 * 714 * Return the our own, or peers socket address (sockaddr_irda) 715 * 716 */ 717static int irda_getname(struct socket *sock, struct sockaddr *uaddr, 718 int *uaddr_len, int peer) 719{ 720 struct sockaddr_irda saddr; 721 struct sock *sk = sock->sk; 722 struct irda_sock *self = irda_sk(sk); 723 724 if (peer) { 725 if (sk->sk_state != TCP_ESTABLISHED) 726 return -ENOTCONN; 727 728 saddr.sir_family = AF_IRDA; 729 saddr.sir_lsap_sel = self->dtsap_sel; 730 saddr.sir_addr = self->daddr; 731 } else { 732 saddr.sir_family = AF_IRDA; 733 saddr.sir_lsap_sel = self->stsap_sel; 734 saddr.sir_addr = self->saddr; 735 } 736 737 IRDA_DEBUG(1, "%s(), tsap_sel = %#x\n", __FUNCTION__, saddr.sir_lsap_sel); 738 IRDA_DEBUG(1, "%s(), addr = %08x\n", __FUNCTION__, saddr.sir_addr); 739 740 /* uaddr_len come to us uninitialised */ 741 *uaddr_len = sizeof (struct sockaddr_irda); 742 memcpy(uaddr, &saddr, *uaddr_len); 743 744 return 0; 745} 746 747/* 748 * Function irda_listen (sock, backlog) 749 * 750 * Just move to the listen state 751 * 752 */ 753static int irda_listen(struct socket *sock, int backlog) 754{ 755 struct sock *sk = sock->sk; 756 757 IRDA_DEBUG(2, "%s()\n", __FUNCTION__); 758 759 if ((sk->sk_type != SOCK_STREAM) && (sk->sk_type != SOCK_SEQPACKET) && 760 (sk->sk_type != SOCK_DGRAM)) 761 return -EOPNOTSUPP; 762 763 if (sk->sk_state != TCP_LISTEN) { 764 sk->sk_max_ack_backlog = backlog; 765 sk->sk_state = TCP_LISTEN; 766 767 return 0; 768 } 769 770 return -EOPNOTSUPP; 771} 772 773/* 774 * Function irda_bind (sock, uaddr, addr_len) 775 * 776 * Used by servers to register their well known TSAP 777 * 778 */ 779static int irda_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) 780{ 781 struct sock *sk = sock->sk; 782 struct sockaddr_irda *addr = (struct sockaddr_irda *) uaddr; 783 struct irda_sock *self = irda_sk(sk); 784 int err; 785 786 IRDA_ASSERT(self != NULL, return -1;); 787 788 IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self); 789 790 if (addr_len != sizeof(struct sockaddr_irda)) 791 return -EINVAL; 792 793#ifdef CONFIG_IRDA_ULTRA 794 /* Special care for Ultra sockets */ 795 if ((sk->sk_type == SOCK_DGRAM) && 796 (sk->sk_protocol == IRDAPROTO_ULTRA)) { 797 self->pid = addr->sir_lsap_sel; 798 if (self->pid & 0x80) { 799 IRDA_DEBUG(0, "%s(), extension in PID not supp!\n", __FUNCTION__); 800 return -EOPNOTSUPP; 801 } 802 err = irda_open_lsap(self, self->pid); 803 if (err < 0) 804 return err; 805 806 /* Pretend we are connected */ 807 sock->state = SS_CONNECTED; 808 sk->sk_state = TCP_ESTABLISHED; 809 810 return 0; 811 } 812#endif /* CONFIG_IRDA_ULTRA */ 813 814 err = irda_open_tsap(self, addr->sir_lsap_sel, addr->sir_name); 815 if (err < 0) 816 return err; 817 818 /* Register with LM-IAS */ 819 self->ias_obj = irias_new_object(addr->sir_name, jiffies); 820 irias_add_integer_attrib(self->ias_obj, "IrDA:TinyTP:LsapSel", 821 self->stsap_sel, IAS_KERNEL_ATTR); 822 irias_insert_object(self->ias_obj); 823 824 return 0; 825} 826 827/* 828 * Function irda_accept (sock, newsock, flags) 829 * 830 * Wait for incoming connection 831 * 832 */ 833static int irda_accept(struct socket *sock, struct socket *newsock, int flags) 834{ 835 struct sock *sk = sock->sk; 836 struct irda_sock *new, *self = irda_sk(sk); 837 struct sock *newsk; 838 struct sk_buff *skb; 839 int err; 840 841 IRDA_DEBUG(2, "%s()\n", __FUNCTION__); 842 843 IRDA_ASSERT(self != NULL, return -1;); 844 845 err = irda_create(newsock, sk->sk_protocol); 846 if (err) 847 return err; 848 849 if (sock->state != SS_UNCONNECTED) 850 return -EINVAL; 851 852 if ((sk = sock->sk) == NULL) 853 return -EINVAL; 854 855 if ((sk->sk_type != SOCK_STREAM) && (sk->sk_type != SOCK_SEQPACKET) && 856 (sk->sk_type != SOCK_DGRAM)) 857 return -EOPNOTSUPP; 858 859 if (sk->sk_state != TCP_LISTEN) 860 return -EINVAL; 861 862 /* 863 * The read queue this time is holding sockets ready to use 864 * hooked into the SABM we saved 865 */ 866 867 /* 868 * We can perform the accept only if there is incoming data 869 * on the listening socket. 870 * So, we will block the caller until we receive any data. 871 * If the caller was waiting on select() or poll() before 872 * calling us, the data is waiting for us ;-) 873 * Jean II 874 */ 875 skb = skb_dequeue(&sk->sk_receive_queue); 876 if (skb == NULL) { 877 int ret = 0; 878 DECLARE_WAITQUEUE(waitq, current); 879 880 /* Non blocking operation */ 881 if (flags & O_NONBLOCK) 882 return -EWOULDBLOCK; 883 884 /* The following code is a cut'n'paste of the 885 * wait_event_interruptible() macro. 886 * We don't us the macro because the condition has 887 * side effects : we want to make sure that only one 888 * skb get dequeued - Jean II */ 889 add_wait_queue(sk->sk_sleep, &waitq); 890 for (;;) { 891 set_current_state(TASK_INTERRUPTIBLE); 892 skb = skb_dequeue(&sk->sk_receive_queue); 893 if (skb != NULL) 894 break; 895 if (!signal_pending(current)) { 896 schedule(); 897 continue; 898 } 899 ret = -ERESTARTSYS; 900 break; 901 } 902 current->state = TASK_RUNNING; 903 remove_wait_queue(sk->sk_sleep, &waitq); 904 if(ret) 905 return -ERESTARTSYS; 906 } 907 908 newsk = newsock->sk; 909 newsk->sk_state = TCP_ESTABLISHED; 910 911 new = irda_sk(newsk); 912 IRDA_ASSERT(new != NULL, return -1;); 913 914 /* Now attach up the new socket */ 915 new->tsap = irttp_dup(self->tsap, new); 916 if (!new->tsap) { 917 IRDA_DEBUG(0, "%s(), dup failed!\n", __FUNCTION__); 918 kfree_skb(skb); 919 return -1; 920 } 921 922 new->stsap_sel = new->tsap->stsap_sel; 923 new->dtsap_sel = new->tsap->dtsap_sel; 924 new->saddr = irttp_get_saddr(new->tsap); 925 new->daddr = irttp_get_daddr(new->tsap); 926 927 new->max_sdu_size_tx = self->max_sdu_size_tx; 928 new->max_sdu_size_rx = self->max_sdu_size_rx; 929 new->max_data_size = self->max_data_size; 930 new->max_header_size = self->max_header_size; 931 932 memcpy(&new->qos_tx, &self->qos_tx, sizeof(struct qos_info)); 933 934 /* Clean up the original one to keep it in listen state */ 935 irttp_listen(self->tsap); 936 937 /* Wow ! What is that ? Jean II */ 938 skb->sk = NULL; 939 skb->destructor = NULL; 940 kfree_skb(skb); 941 sk->sk_ack_backlog--; 942 943 newsock->state = SS_CONNECTED; 944 945 irda_connect_response(new); 946 947 return 0; 948} 949 950/* 951 * Function irda_connect (sock, uaddr, addr_len, flags) 952 * 953 * Connect to a IrDA device 954 * 955 * The main difference with a "standard" connect is that with IrDA we need 956 * to resolve the service name into a TSAP selector (in TCP, port number 957 * doesn't have to be resolved). 958 * Because of this service name resoltion, we can offer "auto-connect", 959 * where we connect to a service without specifying a destination address. 960 * 961 * Note : by consulting "errno", the user space caller may learn the cause 962 * of the failure. Most of them are visible in the function, others may come 963 * from subroutines called and are listed here : 964 * o EBUSY : already processing a connect 965 * o EHOSTUNREACH : bad addr->sir_addr argument 966 * o EADDRNOTAVAIL : bad addr->sir_name argument 967 * o ENOTUNIQ : more than one node has addr->sir_name (auto-connect) 968 * o ENETUNREACH : no node found on the network (auto-connect) 969 */ 970static int irda_connect(struct socket *sock, struct sockaddr *uaddr, 971 int addr_len, int flags) 972{ 973 struct sock *sk = sock->sk; 974 struct sockaddr_irda *addr = (struct sockaddr_irda *) uaddr; 975 struct irda_sock *self = irda_sk(sk); 976 int err; 977 978 IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self); 979 980 /* Don't allow connect for Ultra sockets */ 981 if ((sk->sk_type == SOCK_DGRAM) && (sk->sk_protocol == IRDAPROTO_ULTRA)) 982 return -ESOCKTNOSUPPORT; 983 984 if (sk->sk_state == TCP_ESTABLISHED && sock->state == SS_CONNECTING) { 985 sock->state = SS_CONNECTED; 986 return 0; /* Connect completed during a ERESTARTSYS event */ 987 } 988 989 if (sk->sk_state == TCP_CLOSE && sock->state == SS_CONNECTING) { 990 sock->state = SS_UNCONNECTED; 991 return -ECONNREFUSED; 992 } 993 994 if (sk->sk_state == TCP_ESTABLISHED) 995 return -EISCONN; /* No reconnect on a seqpacket socket */ 996 997 sk->sk_state = TCP_CLOSE; 998 sock->state = SS_UNCONNECTED; 999 1000 if (addr_len != sizeof(struct sockaddr_irda)) 1001 return -EINVAL; 1002 1003 /* Check if user supplied any destination device address */ 1004 if ((!addr->sir_addr) || (addr->sir_addr == DEV_ADDR_ANY)) { 1005 /* Try to find one suitable */ 1006 err = irda_discover_daddr_and_lsap_sel(self, addr->sir_name); 1007 if (err) { 1008 IRDA_DEBUG(0, "%s(), auto-connect failed!\n", __FUNCTION__); 1009 return err; 1010 } 1011 } else { 1012 /* Use the one provided by the user */ 1013 self->daddr = addr->sir_addr; 1014 IRDA_DEBUG(1, "%s(), daddr = %08x\n", __FUNCTION__, self->daddr); 1015 1016 /* If we don't have a valid service name, we assume the 1017 * user want to connect on a specific LSAP. Prevent 1018 * the use of invalid LSAPs (IrLMP 1.1 p10). Jean II */ 1019 if((addr->sir_name[0] != '\0') || 1020 (addr->sir_lsap_sel >= 0x70)) { 1021 /* Query remote LM-IAS using service name */ 1022 err = irda_find_lsap_sel(self, addr->sir_name); 1023 if (err) { 1024 IRDA_DEBUG(0, "%s(), connect failed!\n", __FUNCTION__); 1025 return err; 1026 } 1027 } else { 1028 /* Directly connect to the remote LSAP 1029 * specified by the sir_lsap field. 1030 * Please use with caution, in IrDA LSAPs are 1031 * dynamic and there is no "well-known" LSAP. */ 1032 self->dtsap_sel = addr->sir_lsap_sel; 1033 } 1034 } 1035 1036 /* Check if we have opened a local TSAP */ 1037 if (!self->tsap) 1038 irda_open_tsap(self, LSAP_ANY, addr->sir_name); 1039 1040 /* Move to connecting socket, start sending Connect Requests */ 1041 sock->state = SS_CONNECTING; 1042 sk->sk_state = TCP_SYN_SENT; 1043 1044 /* Connect to remote device */ 1045 err = irttp_connect_request(self->tsap, self->dtsap_sel, 1046 self->saddr, self->daddr, NULL, 1047 self->max_sdu_size_rx, NULL); 1048 if (err) { 1049 IRDA_DEBUG(0, "%s(), connect failed!\n", __FUNCTION__); 1050 return err; 1051 } 1052 1053 /* Now the loop */ 1054 if (sk->sk_state != TCP_ESTABLISHED && (flags & O_NONBLOCK)) 1055 return -EINPROGRESS; 1056 1057 if (wait_event_interruptible(*(sk->sk_sleep), 1058 (sk->sk_state != TCP_SYN_SENT))) 1059 return -ERESTARTSYS; 1060 1061 if (sk->sk_state != TCP_ESTABLISHED) { 1062 sock->state = SS_UNCONNECTED; 1063 return sock_error(sk); /* Always set at this point */ 1064 } 1065 1066 sock->state = SS_CONNECTED; 1067 1068 /* At this point, IrLMP has assigned our source address */ 1069 self->saddr = irttp_get_saddr(self->tsap); 1070 1071 return 0; 1072} 1073 1074static struct proto irda_proto = { 1075 .name = "IRDA", 1076 .owner = THIS_MODULE, 1077 .obj_size = sizeof(struct irda_sock), 1078}; 1079 1080/* 1081 * Function irda_create (sock, protocol) 1082 * 1083 * Create IrDA socket 1084 * 1085 */ 1086static int irda_create(struct socket *sock, int protocol) 1087{ 1088 struct sock *sk; 1089 struct irda_sock *self; 1090 1091 IRDA_DEBUG(2, "%s()\n", __FUNCTION__); 1092 1093 /* Check for valid socket type */ 1094 switch (sock->type) { 1095 case SOCK_STREAM: /* For TTP connections with SAR disabled */ 1096 case SOCK_SEQPACKET: /* For TTP connections with SAR enabled */ 1097 case SOCK_DGRAM: /* For TTP Unitdata or LMP Ultra transfers */ 1098 break; 1099 default: 1100 return -ESOCKTNOSUPPORT; 1101 } 1102 1103 /* Allocate networking socket */ 1104 sk = sk_alloc(PF_IRDA, GFP_ATOMIC, &irda_proto, 1); 1105 if (sk == NULL) 1106 return -ENOMEM; 1107 1108 self = irda_sk(sk); 1109 IRDA_DEBUG(2, "%s() : self is %p\n", __FUNCTION__, self); 1110 1111 init_waitqueue_head(&self->query_wait); 1112 1113 /* Initialise networking socket struct */ 1114 sock_init_data(sock, sk); /* Note : set sk->sk_refcnt to 1 */ 1115 sk->sk_family = PF_IRDA; 1116 sk->sk_protocol = protocol; 1117 1118 switch (sock->type) { 1119 case SOCK_STREAM: 1120 sock->ops = &irda_stream_ops; 1121 self->max_sdu_size_rx = TTP_SAR_DISABLE; 1122 break; 1123 case SOCK_SEQPACKET: 1124 sock->ops = &irda_seqpacket_ops; 1125 self->max_sdu_size_rx = TTP_SAR_UNBOUND; 1126 break; 1127 case SOCK_DGRAM: 1128 switch (protocol) { 1129#ifdef CONFIG_IRDA_ULTRA 1130 case IRDAPROTO_ULTRA: 1131 sock->ops = &irda_ultra_ops; 1132 /* Initialise now, because we may send on unbound 1133 * sockets. Jean II */ 1134 self->max_data_size = ULTRA_MAX_DATA - LMP_PID_HEADER; 1135 self->max_header_size = IRDA_MAX_HEADER + LMP_PID_HEADER; 1136 break; 1137#endif /* CONFIG_IRDA_ULTRA */ 1138 case IRDAPROTO_UNITDATA: 1139 sock->ops = &irda_dgram_ops; 1140 /* We let Unitdata conn. be like seqpack conn. */ 1141 self->max_sdu_size_rx = TTP_SAR_UNBOUND; 1142 break; 1143 default: 1144 IRDA_ERROR("%s: protocol not supported!\n", 1145 __FUNCTION__); 1146 return -ESOCKTNOSUPPORT; 1147 } 1148 break; 1149 default: 1150 return -ESOCKTNOSUPPORT; 1151 } 1152 1153 /* Register as a client with IrLMP */ 1154 self->ckey = irlmp_register_client(0, NULL, NULL, NULL); 1155 self->mask.word = 0xffff; 1156 self->rx_flow = self->tx_flow = FLOW_START; 1157 self->nslots = DISCOVERY_DEFAULT_SLOTS; 1158 self->daddr = DEV_ADDR_ANY; /* Until we get connected */ 1159 self->saddr = 0x0; /* so IrLMP assign us any link */ 1160 return 0; 1161} 1162 1163/* 1164 * Function irda_destroy_socket (self) 1165 * 1166 * Destroy socket 1167 * 1168 */ 1169static void irda_destroy_socket(struct irda_sock *self) 1170{ 1171 IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self); 1172 1173 IRDA_ASSERT(self != NULL, return;); 1174 1175 /* Unregister with IrLMP */ 1176 irlmp_unregister_client(self->ckey); 1177 irlmp_unregister_service(self->skey); 1178 1179 /* Unregister with LM-IAS */ 1180 if (self->ias_obj) { 1181 irias_delete_object(self->ias_obj); 1182 self->ias_obj = NULL; 1183 } 1184 1185 if (self->iriap) { 1186 iriap_close(self->iriap); 1187 self->iriap = NULL; 1188 } 1189 1190 if (self->tsap) { 1191 irttp_disconnect_request(self->tsap, NULL, P_NORMAL); 1192 irttp_close_tsap(self->tsap); 1193 self->tsap = NULL; 1194 } 1195#ifdef CONFIG_IRDA_ULTRA 1196 if (self->lsap) { 1197 irlmp_close_lsap(self->lsap); 1198 self->lsap = NULL; 1199 } 1200#endif /* CONFIG_IRDA_ULTRA */ 1201} 1202 1203/* 1204 * Function irda_release (sock) 1205 */ 1206static int irda_release(struct socket *sock) 1207{ 1208 struct sock *sk = sock->sk; 1209 1210 IRDA_DEBUG(2, "%s()\n", __FUNCTION__); 1211 1212 if (sk == NULL) 1213 return 0; 1214 1215 sk->sk_state = TCP_CLOSE; 1216 sk->sk_shutdown |= SEND_SHUTDOWN; 1217 sk->sk_state_change(sk); 1218 1219 /* Destroy IrDA socket */ 1220 irda_destroy_socket(irda_sk(sk)); 1221 1222 sock_orphan(sk); 1223 sock->sk = NULL; 1224 1225 /* Purge queues (see sock_init_data()) */ 1226 skb_queue_purge(&sk->sk_receive_queue); 1227 1228 /* Destroy networking socket if we are the last reference on it, 1229 * i.e. if(sk->sk_refcnt == 0) -> sk_free(sk) */ 1230 sock_put(sk); 1231 1232 /* Notes on socket locking and deallocation... - Jean II 1233 * In theory we should put pairs of sock_hold() / sock_put() to 1234 * prevent the socket to be destroyed whenever there is an 1235 * outstanding request or outstanding incoming packet or event. 1236 * 1237 * 1) This may include IAS request, both in connect and getsockopt. 1238 * Unfortunately, the situation is a bit more messy than it looks, 1239 * because we close iriap and kfree(self) above. 1240 * 1241 * 2) This may include selective discovery in getsockopt. 1242 * Same stuff as above, irlmp registration and self are gone. 1243 * 1244 * Probably 1 and 2 may not matter, because it's all triggered 1245 * by a process and the socket layer already prevent the 1246 * socket to go away while a process is holding it, through 1247 * sockfd_put() and fput()... 1248 * 1249 * 3) This may include deferred TSAP closure. In particular, 1250 * we may receive a late irda_disconnect_indication() 1251 * Fortunately, (tsap_cb *)->close_pend should protect us 1252 * from that. 1253 * 1254 * I did some testing on SMP, and it looks solid. And the socket 1255 * memory leak is now gone... - Jean II 1256 */ 1257 1258 return 0; 1259} 1260 1261/* 1262 * Function irda_sendmsg (iocb, sock, msg, len) 1263 * 1264 * Send message down to TinyTP. This function is used for both STREAM and 1265 * SEQPACK services. This is possible since it forces the client to 1266 * fragment the message if necessary 1267 */ 1268static int irda_sendmsg(struct kiocb *iocb, struct socket *sock, 1269 struct msghdr *msg, size_t len) 1270{ 1271 struct sock *sk = sock->sk; 1272 struct irda_sock *self; 1273 struct sk_buff *skb; 1274 unsigned char *asmptr; 1275 int err; 1276 1277 IRDA_DEBUG(4, "%s(), len=%zd\n", __FUNCTION__, len); 1278 1279 /* Note : socket.c set MSG_EOR on SEQPACKET sockets */ 1280 if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_EOR|MSG_CMSG_COMPAT)) 1281 return -EINVAL; 1282 1283 if (sk->sk_shutdown & SEND_SHUTDOWN) { 1284 send_sig(SIGPIPE, current, 0); 1285 return -EPIPE; 1286 } 1287 1288 if (sk->sk_state != TCP_ESTABLISHED) 1289 return -ENOTCONN; 1290 1291 self = irda_sk(sk); 1292 IRDA_ASSERT(self != NULL, return -1;); 1293 1294 /* Check if IrTTP is wants us to slow down */ 1295 1296 if (wait_event_interruptible(*(sk->sk_sleep), 1297 (self->tx_flow != FLOW_STOP || sk->sk_state != TCP_ESTABLISHED))) 1298 return -ERESTARTSYS; 1299 1300 /* Check if we are still connected */ 1301 if (sk->sk_state != TCP_ESTABLISHED) 1302 return -ENOTCONN; 1303 1304 /* Check that we don't send out to big frames */ 1305 if (len > self->max_data_size) { 1306 IRDA_DEBUG(2, "%s(), Chopping frame from %zd to %d bytes!\n", 1307 __FUNCTION__, len, self->max_data_size); 1308 len = self->max_data_size; 1309 } 1310 1311 skb = sock_alloc_send_skb(sk, len + self->max_header_size + 16, 1312 msg->msg_flags & MSG_DONTWAIT, &err); 1313 if (!skb) 1314 return -ENOBUFS; 1315 1316 skb_reserve(skb, self->max_header_size + 16); 1317 1318 asmptr = skb->h.raw = skb_put(skb, len); 1319 err = memcpy_fromiovec(asmptr, msg->msg_iov, len); 1320 if (err) { 1321 kfree_skb(skb); 1322 return err; 1323 } 1324 1325 /* 1326 * Just send the message to TinyTP, and let it deal with possible 1327 * errors. No need to duplicate all that here 1328 */ 1329 err = irttp_data_request(self->tsap, skb); 1330 if (err) { 1331 IRDA_DEBUG(0, "%s(), err=%d\n", __FUNCTION__, err); 1332 return err; 1333 } 1334 /* Tell client how much data we actually sent */ 1335 return len; 1336} 1337 1338/* 1339 * Function irda_recvmsg_dgram (iocb, sock, msg, size, flags) 1340 * 1341 * Try to receive message and copy it to user. The frame is discarded 1342 * after being read, regardless of how much the user actually read 1343 */ 1344static int irda_recvmsg_dgram(struct kiocb *iocb, struct socket *sock, 1345 struct msghdr *msg, size_t size, int flags) 1346{ 1347 struct sock *sk = sock->sk; 1348 struct irda_sock *self = irda_sk(sk); 1349 struct sk_buff *skb; 1350 size_t copied; 1351 int err; 1352 1353 IRDA_DEBUG(4, "%s()\n", __FUNCTION__); 1354 1355 IRDA_ASSERT(self != NULL, return -1;); 1356 1357 skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT, 1358 flags & MSG_DONTWAIT, &err); 1359 if (!skb) 1360 return err; 1361 1362 skb->h.raw = skb->data; 1363 copied = skb->len; 1364 1365 if (copied > size) { 1366 IRDA_DEBUG(2, "%s(), Received truncated frame (%zd < %zd)!\n", 1367 __FUNCTION__, copied, size); 1368 copied = size; 1369 msg->msg_flags |= MSG_TRUNC; 1370 } 1371 skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied); 1372 1373 skb_free_datagram(sk, skb); 1374 1375 /* 1376 * Check if we have previously stopped IrTTP and we know 1377 * have more free space in our rx_queue. If so tell IrTTP 1378 * to start delivering frames again before our rx_queue gets 1379 * empty 1380 */ 1381 if (self->rx_flow == FLOW_STOP) { 1382 if ((atomic_read(&sk->sk_rmem_alloc) << 2) <= sk->sk_rcvbuf) { 1383 IRDA_DEBUG(2, "%s(), Starting IrTTP\n", __FUNCTION__); 1384 self->rx_flow = FLOW_START; 1385 irttp_flow_request(self->tsap, FLOW_START); 1386 } 1387 } 1388 1389 return copied; 1390} 1391 1392/* 1393 * Function irda_recvmsg_stream (iocb, sock, msg, size, flags) 1394 */ 1395static int irda_recvmsg_stream(struct kiocb *iocb, struct socket *sock, 1396 struct msghdr *msg, size_t size, int flags) 1397{ 1398 struct sock *sk = sock->sk; 1399 struct irda_sock *self = irda_sk(sk); 1400 int noblock = flags & MSG_DONTWAIT; 1401 size_t copied = 0; 1402 int target = 1; 1403 DECLARE_WAITQUEUE(waitq, current); 1404 1405 IRDA_DEBUG(3, "%s()\n", __FUNCTION__); 1406 1407 IRDA_ASSERT(self != NULL, return -1;); 1408 1409 if (sock->flags & __SO_ACCEPTCON) 1410 return(-EINVAL); 1411 1412 if (flags & MSG_OOB) 1413 return -EOPNOTSUPP; 1414 1415 if (flags & MSG_WAITALL) 1416 target = size; 1417 1418 msg->msg_namelen = 0; 1419 1420 do { 1421 int chunk; 1422 struct sk_buff *skb = skb_dequeue(&sk->sk_receive_queue); 1423 1424 if (skb==NULL) { 1425 int ret = 0; 1426 1427 if (copied >= target) 1428 break; 1429 1430 /* The following code is a cut'n'paste of the 1431 * wait_event_interruptible() macro. 1432 * We don't us the macro because the test condition 1433 * is messy. - Jean II */ 1434 set_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags); 1435 add_wait_queue(sk->sk_sleep, &waitq); 1436 set_current_state(TASK_INTERRUPTIBLE); 1437 1438 /* 1439 * POSIX 1003.1g mandates this order. 1440 */ 1441 if (sk->sk_err) 1442 ret = sock_error(sk); 1443 else if (sk->sk_shutdown & RCV_SHUTDOWN) 1444 ; 1445 else if (noblock) 1446 ret = -EAGAIN; 1447 else if (signal_pending(current)) 1448 ret = -ERESTARTSYS; 1449 else if (skb_peek(&sk->sk_receive_queue) == NULL) 1450 /* Wait process until data arrives */ 1451 schedule(); 1452 1453 current->state = TASK_RUNNING; 1454 remove_wait_queue(sk->sk_sleep, &waitq); 1455 clear_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags); 1456 1457 if(ret) 1458 return(ret); 1459 if (sk->sk_shutdown & RCV_SHUTDOWN) 1460 break; 1461 1462 continue; 1463 } 1464 1465 chunk = min_t(unsigned int, skb->len, size); 1466 if (memcpy_toiovec(msg->msg_iov, skb->data, chunk)) { 1467 skb_queue_head(&sk->sk_receive_queue, skb); 1468 if (copied == 0) 1469 copied = -EFAULT; 1470 break; 1471 } 1472 copied += chunk; 1473 size -= chunk; 1474 1475 /* Mark read part of skb as used */ 1476 if (!(flags & MSG_PEEK)) { 1477 skb_pull(skb, chunk); 1478 1479 /* put the skb back if we didn't use it up.. */ 1480 if (skb->len) { 1481 IRDA_DEBUG(1, "%s(), back on q!\n", 1482 __FUNCTION__); 1483 skb_queue_head(&sk->sk_receive_queue, skb); 1484 break; 1485 } 1486 1487 kfree_skb(skb); 1488 } else { 1489 IRDA_DEBUG(0, "%s() questionable!?\n", __FUNCTION__); 1490 1491 /* put message back and return */ 1492 skb_queue_head(&sk->sk_receive_queue, skb); 1493 break; 1494 } 1495 } while (size); 1496 1497 /* 1498 * Check if we have previously stopped IrTTP and we know 1499 * have more free space in our rx_queue. If so tell IrTTP 1500 * to start delivering frames again before our rx_queue gets 1501 * empty 1502 */ 1503 if (self->rx_flow == FLOW_STOP) { 1504 if ((atomic_read(&sk->sk_rmem_alloc) << 2) <= sk->sk_rcvbuf) { 1505 IRDA_DEBUG(2, "%s(), Starting IrTTP\n", __FUNCTION__); 1506 self->rx_flow = FLOW_START; 1507 irttp_flow_request(self->tsap, FLOW_START); 1508 } 1509 } 1510 1511 return copied; 1512} 1513 1514/* 1515 * Function irda_sendmsg_dgram (iocb, sock, msg, len) 1516 * 1517 * Send message down to TinyTP for the unreliable sequenced 1518 * packet service... 1519 * 1520 */ 1521static int irda_sendmsg_dgram(struct kiocb *iocb, struct socket *sock, 1522 struct msghdr *msg, size_t len) 1523{ 1524 struct sock *sk = sock->sk; 1525 struct irda_sock *self; 1526 struct sk_buff *skb; 1527 unsigned char *asmptr; 1528 int err; 1529 1530 IRDA_DEBUG(4, "%s(), len=%zd\n", __FUNCTION__, len); 1531 1532 if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_CMSG_COMPAT)) 1533 return -EINVAL; 1534 1535 if (sk->sk_shutdown & SEND_SHUTDOWN) { 1536 send_sig(SIGPIPE, current, 0); 1537 return -EPIPE; 1538 } 1539 1540 if (sk->sk_state != TCP_ESTABLISHED) 1541 return -ENOTCONN; 1542 1543 self = irda_sk(sk); 1544 IRDA_ASSERT(self != NULL, return -1;); 1545 1546 /* 1547 * Check that we don't send out to big frames. This is an unreliable 1548 * service, so we have no fragmentation and no coalescence 1549 */ 1550 if (len > self->max_data_size) { 1551 IRDA_DEBUG(0, "%s(), Warning to much data! " 1552 "Chopping frame from %zd to %d bytes!\n", 1553 __FUNCTION__, len, self->max_data_size); 1554 len = self->max_data_size; 1555 } 1556 1557 skb = sock_alloc_send_skb(sk, len + self->max_header_size, 1558 msg->msg_flags & MSG_DONTWAIT, &err); 1559 if (!skb) 1560 return -ENOBUFS; 1561 1562 skb_reserve(skb, self->max_header_size); 1563 1564 IRDA_DEBUG(4, "%s(), appending user data\n", __FUNCTION__); 1565 asmptr = skb->h.raw = skb_put(skb, len); 1566 err = memcpy_fromiovec(asmptr, msg->msg_iov, len); 1567 if (err) { 1568 kfree_skb(skb); 1569 return err; 1570 } 1571 1572 /* 1573 * Just send the message to TinyTP, and let it deal with possible 1574 * errors. No need to duplicate all that here 1575 */ 1576 err = irttp_udata_request(self->tsap, skb); 1577 if (err) { 1578 IRDA_DEBUG(0, "%s(), err=%d\n", __FUNCTION__, err); 1579 return err; 1580 } 1581 return len; 1582} 1583 1584/* 1585 * Function irda_sendmsg_ultra (iocb, sock, msg, len) 1586 * 1587 * Send message down to IrLMP for the unreliable Ultra 1588 * packet service... 1589 */ 1590#ifdef CONFIG_IRDA_ULTRA 1591static int irda_sendmsg_ultra(struct kiocb *iocb, struct socket *sock, 1592 struct msghdr *msg, size_t len) 1593{ 1594 struct sock *sk = sock->sk; 1595 struct irda_sock *self; 1596 __u8 pid = 0; 1597 int bound = 0; 1598 struct sk_buff *skb; 1599 unsigned char *asmptr; 1600 int err; 1601 1602 IRDA_DEBUG(4, "%s(), len=%zd\n", __FUNCTION__, len); 1603 1604 if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_CMSG_COMPAT)) 1605 return -EINVAL; 1606 1607 if (sk->sk_shutdown & SEND_SHUTDOWN) { 1608 send_sig(SIGPIPE, current, 0); 1609 return -EPIPE; 1610 } 1611 1612 self = irda_sk(sk); 1613 IRDA_ASSERT(self != NULL, return -1;); 1614 1615 /* Check if an address was specified with sendto. Jean II */ 1616 if (msg->msg_name) { 1617 struct sockaddr_irda *addr = (struct sockaddr_irda *) msg->msg_name; 1618 /* Check address, extract pid. Jean II */ 1619 if (msg->msg_namelen < sizeof(*addr)) 1620 return -EINVAL; 1621 if (addr->sir_family != AF_IRDA) 1622 return -EINVAL; 1623 1624 pid = addr->sir_lsap_sel; 1625 if (pid & 0x80) { 1626 IRDA_DEBUG(0, "%s(), extension in PID not supp!\n", __FUNCTION__); 1627 return -EOPNOTSUPP; 1628 } 1629 } else { 1630 /* Check that the socket is properly bound to an Ultra 1631 * port. Jean II */ 1632 if ((self->lsap == NULL) || 1633 (sk->sk_state != TCP_ESTABLISHED)) { 1634 IRDA_DEBUG(0, "%s(), socket not bound to Ultra PID.\n", 1635 __FUNCTION__); 1636 return -ENOTCONN; 1637 } 1638 /* Use PID from socket */ 1639 bound = 1; 1640 } 1641 1642 /* 1643 * Check that we don't send out to big frames. This is an unreliable 1644 * service, so we have no fragmentation and no coalescence 1645 */ 1646 if (len > self->max_data_size) { 1647 IRDA_DEBUG(0, "%s(), Warning to much data! " 1648 "Chopping frame from %zd to %d bytes!\n", 1649 __FUNCTION__, len, self->max_data_size); 1650 len = self->max_data_size; 1651 } 1652 1653 skb = sock_alloc_send_skb(sk, len + self->max_header_size, 1654 msg->msg_flags & MSG_DONTWAIT, &err); 1655 if (!skb) 1656 return -ENOBUFS; 1657 1658 skb_reserve(skb, self->max_header_size); 1659 1660 IRDA_DEBUG(4, "%s(), appending user data\n", __FUNCTION__); 1661 asmptr = skb->h.raw = skb_put(skb, len); 1662 err = memcpy_fromiovec(asmptr, msg->msg_iov, len); 1663 if (err) { 1664 kfree_skb(skb); 1665 return err; 1666 } 1667 1668 err = irlmp_connless_data_request((bound ? self->lsap : NULL), 1669 skb, pid); 1670 if (err) { 1671 IRDA_DEBUG(0, "%s(), err=%d\n", __FUNCTION__, err); 1672 return err; 1673 } 1674 return len; 1675} 1676#endif /* CONFIG_IRDA_ULTRA */ 1677 1678/* 1679 * Function irda_shutdown (sk, how) 1680 */ 1681static int irda_shutdown(struct socket *sock, int how) 1682{ 1683 struct sock *sk = sock->sk; 1684 struct irda_sock *self = irda_sk(sk); 1685 1686 IRDA_ASSERT(self != NULL, return -1;); 1687 1688 IRDA_DEBUG(1, "%s(%p)\n", __FUNCTION__, self); 1689 1690 sk->sk_state = TCP_CLOSE; 1691 sk->sk_shutdown |= SEND_SHUTDOWN; 1692 sk->sk_state_change(sk); 1693 1694 if (self->iriap) { 1695 iriap_close(self->iriap); 1696 self->iriap = NULL; 1697 } 1698 1699 if (self->tsap) { 1700 irttp_disconnect_request(self->tsap, NULL, P_NORMAL); 1701 irttp_close_tsap(self->tsap); 1702 self->tsap = NULL; 1703 } 1704 1705 /* A few cleanup so the socket look as good as new... */ 1706 self->rx_flow = self->tx_flow = FLOW_START; /* needed ??? */ 1707 self->daddr = DEV_ADDR_ANY; /* Until we get re-connected */ 1708 self->saddr = 0x0; /* so IrLMP assign us any link */ 1709 1710 return 0; 1711} 1712 1713/* 1714 * Function irda_poll (file, sock, wait) 1715 */ 1716static unsigned int irda_poll(struct file * file, struct socket *sock, 1717 poll_table *wait) 1718{ 1719 struct sock *sk = sock->sk; 1720 struct irda_sock *self = irda_sk(sk); 1721 unsigned int mask; 1722 1723 IRDA_DEBUG(4, "%s()\n", __FUNCTION__); 1724 1725 poll_wait(file, sk->sk_sleep, wait); 1726 mask = 0; 1727 1728 /* Exceptional events? */ 1729 if (sk->sk_err) 1730 mask |= POLLERR; 1731 if (sk->sk_shutdown & RCV_SHUTDOWN) { 1732 IRDA_DEBUG(0, "%s(), POLLHUP\n", __FUNCTION__); 1733 mask |= POLLHUP; 1734 } 1735 1736 /* Readable? */ 1737 if (!skb_queue_empty(&sk->sk_receive_queue)) { 1738 IRDA_DEBUG(4, "Socket is readable\n"); 1739 mask |= POLLIN | POLLRDNORM; 1740 } 1741 1742 /* Connection-based need to check for termination and startup */ 1743 switch (sk->sk_type) { 1744 case SOCK_STREAM: 1745 if (sk->sk_state == TCP_CLOSE) { 1746 IRDA_DEBUG(0, "%s(), POLLHUP\n", __FUNCTION__); 1747 mask |= POLLHUP; 1748 } 1749 1750 if (sk->sk_state == TCP_ESTABLISHED) { 1751 if ((self->tx_flow == FLOW_START) && 1752 sock_writeable(sk)) 1753 { 1754 mask |= POLLOUT | POLLWRNORM | POLLWRBAND; 1755 } 1756 } 1757 break; 1758 case SOCK_SEQPACKET: 1759 if ((self->tx_flow == FLOW_START) && 1760 sock_writeable(sk)) 1761 { 1762 mask |= POLLOUT | POLLWRNORM | POLLWRBAND; 1763 } 1764 break; 1765 case SOCK_DGRAM: 1766 if (sock_writeable(sk)) 1767 mask |= POLLOUT | POLLWRNORM | POLLWRBAND; 1768 break; 1769 default: 1770 break; 1771 } 1772 return mask; 1773} 1774 1775/* 1776 * Function irda_ioctl (sock, cmd, arg) 1777 */ 1778static int irda_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) 1779{ 1780 struct sock *sk = sock->sk; 1781 1782 IRDA_DEBUG(4, "%s(), cmd=%#x\n", __FUNCTION__, cmd); 1783 1784 switch (cmd) { 1785 case TIOCOUTQ: { 1786 long amount; 1787 amount = sk->sk_sndbuf - atomic_read(&sk->sk_wmem_alloc); 1788 if (amount < 0) 1789 amount = 0; 1790 if (put_user(amount, (unsigned int __user *)arg)) 1791 return -EFAULT; 1792 return 0; 1793 } 1794 1795 case TIOCINQ: { 1796 struct sk_buff *skb; 1797 long amount = 0L; 1798 /* These two are safe on a single CPU system as only user tasks fiddle here */ 1799 if ((skb = skb_peek(&sk->sk_receive_queue)) != NULL) 1800 amount = skb->len; 1801 if (put_user(amount, (unsigned int __user *)arg)) 1802 return -EFAULT; 1803 return 0; 1804 } 1805 1806 case SIOCGSTAMP: 1807 if (sk != NULL) 1808 return sock_get_timestamp(sk, (struct timeval __user *)arg); 1809 return -EINVAL; 1810 1811 case SIOCGIFADDR: 1812 case SIOCSIFADDR: 1813 case SIOCGIFDSTADDR: 1814 case SIOCSIFDSTADDR: 1815 case SIOCGIFBRDADDR: 1816 case SIOCSIFBRDADDR: 1817 case SIOCGIFNETMASK: 1818 case SIOCSIFNETMASK: 1819 case SIOCGIFMETRIC: 1820 case SIOCSIFMETRIC: 1821 return -EINVAL; 1822 default: 1823 IRDA_DEBUG(1, "%s(), doing device ioctl!\n", __FUNCTION__); 1824 return dev_ioctl(cmd, (void __user *) arg); 1825 } 1826 1827 /*NOTREACHED*/ 1828 return 0; 1829} 1830 1831/* 1832 * Function irda_setsockopt (sock, level, optname, optval, optlen) 1833 * 1834 * Set some options for the socket 1835 * 1836 */ 1837static int irda_setsockopt(struct socket *sock, int level, int optname, 1838 char __user *optval, int optlen) 1839{ 1840 struct sock *sk = sock->sk; 1841 struct irda_sock *self = irda_sk(sk); 1842 struct irda_ias_set *ias_opt; 1843 struct ias_object *ias_obj; 1844 struct ias_attrib * ias_attr; /* Attribute in IAS object */ 1845 int opt; 1846 1847 IRDA_ASSERT(self != NULL, return -1;); 1848 1849 IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self); 1850 1851 if (level != SOL_IRLMP) 1852 return -ENOPROTOOPT; 1853 1854 switch (optname) { 1855 case IRLMP_IAS_SET: 1856 /* The user want to add an attribute to an existing IAS object 1857 * (in the IAS database) or to create a new object with this 1858 * attribute. 1859 * We first query IAS to know if the object exist, and then 1860 * create the right attribute... 1861 */ 1862 1863 if (optlen != sizeof(struct irda_ias_set)) 1864 return -EINVAL; 1865 1866 ias_opt = kmalloc(sizeof(struct irda_ias_set), GFP_ATOMIC); 1867 if (ias_opt == NULL) 1868 return -ENOMEM; 1869 1870 /* Copy query to the driver. */ 1871 if (copy_from_user(ias_opt, optval, optlen)) { 1872 kfree(ias_opt); 1873 return -EFAULT; 1874 } 1875 1876 /* Find the object we target. 1877 * If the user gives us an empty string, we use the object 1878 * associated with this socket. This will workaround 1879 * duplicated class name - Jean II */ 1880 if(ias_opt->irda_class_name[0] == '\0') { 1881 if(self->ias_obj == NULL) { 1882 kfree(ias_opt); 1883 return -EINVAL; 1884 } 1885 ias_obj = self->ias_obj; 1886 } else 1887 ias_obj = irias_find_object(ias_opt->irda_class_name); 1888 1889 /* Only ROOT can mess with the global IAS database. 1890 * Users can only add attributes to the object associated 1891 * with the socket they own - Jean II */ 1892 if((!capable(CAP_NET_ADMIN)) && 1893 ((ias_obj == NULL) || (ias_obj != self->ias_obj))) { 1894 kfree(ias_opt); 1895 return -EPERM; 1896 } 1897 1898 /* If the object doesn't exist, create it */ 1899 if(ias_obj == (struct ias_object *) NULL) { 1900 /* Create a new object */ 1901 ias_obj = irias_new_object(ias_opt->irda_class_name, 1902 jiffies); 1903 } 1904 1905 /* Do we have the attribute already ? */ 1906 if(irias_find_attrib(ias_obj, ias_opt->irda_attrib_name)) { 1907 kfree(ias_opt); 1908 return -EINVAL; 1909 } 1910 1911 /* Look at the type */ 1912 switch(ias_opt->irda_attrib_type) { 1913 case IAS_INTEGER: 1914 /* Add an integer attribute */ 1915 irias_add_integer_attrib( 1916 ias_obj, 1917 ias_opt->irda_attrib_name, 1918 ias_opt->attribute.irda_attrib_int, 1919 IAS_USER_ATTR); 1920 break; 1921 case IAS_OCT_SEQ: 1922 /* Check length */ 1923 if(ias_opt->attribute.irda_attrib_octet_seq.len > 1924 IAS_MAX_OCTET_STRING) { 1925 kfree(ias_opt); 1926 return -EINVAL; 1927 } 1928 /* Add an octet sequence attribute */ 1929 irias_add_octseq_attrib( 1930 ias_obj, 1931 ias_opt->irda_attrib_name, 1932 ias_opt->attribute.irda_attrib_octet_seq.octet_seq, 1933 ias_opt->attribute.irda_attrib_octet_seq.len, 1934 IAS_USER_ATTR); 1935 break; 1936 case IAS_STRING: 1937 /* Should check charset & co */ 1938 /* Check length */ 1939 /* The length is encoded in a __u8, and 1940 * IAS_MAX_STRING == 256, so there is no way 1941 * userspace can pass us a string too large. 1942 * Jean II */ 1943 /* NULL terminate the string (avoid troubles) */ 1944 ias_opt->attribute.irda_attrib_string.string[ias_opt->attribute.irda_attrib_string.len] = '\0'; 1945 /* Add a string attribute */ 1946 irias_add_string_attrib( 1947 ias_obj, 1948 ias_opt->irda_attrib_name, 1949 ias_opt->attribute.irda_attrib_string.string, 1950 IAS_USER_ATTR); 1951 break; 1952 default : 1953 kfree(ias_opt); 1954 return -EINVAL; 1955 } 1956 irias_insert_object(ias_obj); 1957 kfree(ias_opt); 1958 break; 1959 case IRLMP_IAS_DEL: 1960 /* The user want to delete an object from our local IAS 1961 * database. We just need to query the IAS, check is the 1962 * object is not owned by the kernel and delete it. 1963 */ 1964 1965 if (optlen != sizeof(struct irda_ias_set)) 1966 return -EINVAL; 1967 1968 ias_opt = kmalloc(sizeof(struct irda_ias_set), GFP_ATOMIC); 1969 if (ias_opt == NULL) 1970 return -ENOMEM; 1971 1972 /* Copy query to the driver. */ 1973 if (copy_from_user(ias_opt, optval, optlen)) { 1974 kfree(ias_opt); 1975 return -EFAULT; 1976 } 1977 1978 /* Find the object we target. 1979 * If the user gives us an empty string, we use the object 1980 * associated with this socket. This will workaround 1981 * duplicated class name - Jean II */ 1982 if(ias_opt->irda_class_name[0] == '\0') 1983 ias_obj = self->ias_obj; 1984 else 1985 ias_obj = irias_find_object(ias_opt->irda_class_name); 1986 if(ias_obj == (struct ias_object *) NULL) { 1987 kfree(ias_opt); 1988 return -EINVAL; 1989 } 1990 1991 /* Only ROOT can mess with the global IAS database. 1992 * Users can only del attributes from the object associated 1993 * with the socket they own - Jean II */ 1994 if((!capable(CAP_NET_ADMIN)) && 1995 ((ias_obj == NULL) || (ias_obj != self->ias_obj))) { 1996 kfree(ias_opt); 1997 return -EPERM; 1998 } 1999 2000 /* Find the attribute (in the object) we target */ 2001 ias_attr = irias_find_attrib(ias_obj, 2002 ias_opt->irda_attrib_name); 2003 if(ias_attr == (struct ias_attrib *) NULL) { 2004 kfree(ias_opt); 2005 return -EINVAL; 2006 } 2007 2008 /* Check is the user space own the object */ 2009 if(ias_attr->value->owner != IAS_USER_ATTR) { 2010 IRDA_DEBUG(1, "%s(), attempting to delete a kernel attribute\n", __FUNCTION__); 2011 kfree(ias_opt); 2012 return -EPERM; 2013 } 2014 2015 /* Remove the attribute (and maybe the object) */ 2016 irias_delete_attrib(ias_obj, ias_attr, 1); 2017 kfree(ias_opt); 2018 break; 2019 case IRLMP_MAX_SDU_SIZE: 2020 if (optlen < sizeof(int)) 2021 return -EINVAL; 2022 2023 if (get_user(opt, (int __user *)optval)) 2024 return -EFAULT; 2025 2026 /* Only possible for a seqpacket service (TTP with SAR) */ 2027 if (sk->sk_type != SOCK_SEQPACKET) { 2028 IRDA_DEBUG(2, "%s(), setting max_sdu_size = %d\n", 2029 __FUNCTION__, opt); 2030 self->max_sdu_size_rx = opt; 2031 } else { 2032 IRDA_WARNING("%s: not allowed to set MAXSDUSIZE for this socket type!\n", 2033 __FUNCTION__); 2034 return -ENOPROTOOPT; 2035 } 2036 break; 2037 case IRLMP_HINTS_SET: 2038 if (optlen < sizeof(int)) 2039 return -EINVAL; 2040 2041 /* The input is really a (__u8 hints[2]), easier as an int */ 2042 if (get_user(opt, (int __user *)optval)) 2043 return -EFAULT; 2044 2045 /* Unregister any old registration */ 2046 if (self->skey) 2047 irlmp_unregister_service(self->skey); 2048 2049 self->skey = irlmp_register_service((__u16) opt); 2050 break; 2051 case IRLMP_HINT_MASK_SET: 2052 /* As opposed to the previous case which set the hint bits 2053 * that we advertise, this one set the filter we use when 2054 * making a discovery (nodes which don't match any hint 2055 * bit in the mask are not reported). 2056 */ 2057 if (optlen < sizeof(int)) 2058 return -EINVAL; 2059 2060 /* The input is really a (__u8 hints[2]), easier as an int */ 2061 if (get_user(opt, (int __user *)optval)) 2062 return -EFAULT; 2063 2064 /* Set the new hint mask */ 2065 self->mask.word = (__u16) opt; 2066 /* Mask out extension bits */ 2067 self->mask.word &= 0x7f7f; 2068 /* Check if no bits */ 2069 if(!self->mask.word) 2070 self->mask.word = 0xFFFF; 2071 2072 break; 2073 default: 2074 return -ENOPROTOOPT; 2075 } 2076 return 0; 2077} 2078 2079/* 2080 * Function irda_extract_ias_value(ias_opt, ias_value) 2081 * 2082 * Translate internal IAS value structure to the user space representation 2083 * 2084 * The external representation of IAS values, as we exchange them with 2085 * user space program is quite different from the internal representation, 2086 * as stored in the IAS database (because we need a flat structure for 2087 * crossing kernel boundary). 2088 * This function transform the former in the latter. We also check 2089 * that the value type is valid. 2090 */ 2091static int irda_extract_ias_value(struct irda_ias_set *ias_opt, 2092 struct ias_value *ias_value) 2093{ 2094 /* Look at the type */ 2095 switch (ias_value->type) { 2096 case IAS_INTEGER: 2097 /* Copy the integer */ 2098 ias_opt->attribute.irda_attrib_int = ias_value->t.integer; 2099 break; 2100 case IAS_OCT_SEQ: 2101 /* Set length */ 2102 ias_opt->attribute.irda_attrib_octet_seq.len = ias_value->len; 2103 /* Copy over */ 2104 memcpy(ias_opt->attribute.irda_attrib_octet_seq.octet_seq, 2105 ias_value->t.oct_seq, ias_value->len); 2106 break; 2107 case IAS_STRING: 2108 /* Set length */ 2109 ias_opt->attribute.irda_attrib_string.len = ias_value->len; 2110 ias_opt->attribute.irda_attrib_string.charset = ias_value->charset; 2111 /* Copy over */ 2112 memcpy(ias_opt->attribute.irda_attrib_string.string, 2113 ias_value->t.string, ias_value->len); 2114 /* NULL terminate the string (avoid troubles) */ 2115 ias_opt->attribute.irda_attrib_string.string[ias_value->len] = '\0'; 2116 break; 2117 case IAS_MISSING: 2118 default : 2119 return -EINVAL; 2120 } 2121 2122 /* Copy type over */ 2123 ias_opt->irda_attrib_type = ias_value->type; 2124 2125 return 0; 2126} 2127 2128/* 2129 * Function irda_getsockopt (sock, level, optname, optval, optlen) 2130 */ 2131static int irda_getsockopt(struct socket *sock, int level, int optname, 2132 char __user *optval, int __user *optlen) 2133{ 2134 struct sock *sk = sock->sk; 2135 struct irda_sock *self = irda_sk(sk); 2136 struct irda_device_list list; 2137 struct irda_device_info *discoveries; 2138 struct irda_ias_set * ias_opt; /* IAS get/query params */ 2139 struct ias_object * ias_obj; /* Object in IAS */ 2140 struct ias_attrib * ias_attr; /* Attribute in IAS object */ 2141 int daddr = DEV_ADDR_ANY; /* Dest address for IAS queries */ 2142 int val = 0; 2143 int len = 0; 2144 int err; 2145 int offset, total; 2146 2147 IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self); 2148 2149 if (level != SOL_IRLMP) 2150 return -ENOPROTOOPT; 2151 2152 if (get_user(len, optlen)) 2153 return -EFAULT; 2154 2155 if(len < 0) 2156 return -EINVAL; 2157 2158 switch (optname) { 2159 case IRLMP_ENUMDEVICES: 2160 /* Ask lmp for the current discovery log */ 2161 discoveries = irlmp_get_discoveries(&list.len, self->mask.word, 2162 self->nslots); 2163 /* Check if the we got some results */ 2164 if (discoveries == NULL) 2165 return -EAGAIN; /* Didn't find any devices */ 2166 err = 0; 2167 2168 /* Write total list length back to client */ 2169 if (copy_to_user(optval, &list, 2170 sizeof(struct irda_device_list) - 2171 sizeof(struct irda_device_info))) 2172 err = -EFAULT; 2173 2174 /* Offset to first device entry */ 2175 offset = sizeof(struct irda_device_list) - 2176 sizeof(struct irda_device_info); 2177 2178 /* Copy the list itself - watch for overflow */ 2179 if(list.len > 2048) 2180 { 2181 err = -EINVAL; 2182 goto bed; 2183 } 2184 total = offset + (list.len * sizeof(struct irda_device_info)); 2185 if (total > len) 2186 total = len; 2187 if (copy_to_user(optval+offset, discoveries, total - offset)) 2188 err = -EFAULT; 2189 2190 /* Write total number of bytes used back to client */ 2191 if (put_user(total, optlen)) 2192 err = -EFAULT; 2193bed: 2194 /* Free up our buffer */ 2195 kfree(discoveries); 2196 if (err) 2197 return err; 2198 break; 2199 case IRLMP_MAX_SDU_SIZE: 2200 val = self->max_data_size; 2201 len = sizeof(int); 2202 if (put_user(len, optlen)) 2203 return -EFAULT; 2204 2205 if (copy_to_user(optval, &val, len)) 2206 return -EFAULT; 2207 break; 2208 case IRLMP_IAS_GET: 2209 /* The user want an object from our local IAS database. 2210 * We just need to query the IAS and return the value 2211 * that we found */ 2212 2213 /* Check that the user has allocated the right space for us */ 2214 if (len != sizeof(struct irda_ias_set)) 2215 return -EINVAL; 2216 2217 ias_opt = kmalloc(sizeof(struct irda_ias_set), GFP_ATOMIC); 2218 if (ias_opt == NULL) 2219 return -ENOMEM; 2220 2221 /* Copy query to the driver. */ 2222 if (copy_from_user(ias_opt, optval, len)) { 2223 kfree(ias_opt); 2224 return -EFAULT; 2225 } 2226 2227 /* Find the object we target. 2228 * If the user gives us an empty string, we use the object 2229 * associated with this socket. This will workaround 2230 * duplicated class name - Jean II */ 2231 if(ias_opt->irda_class_name[0] == '\0') 2232 ias_obj = self->ias_obj; 2233 else 2234 ias_obj = irias_find_object(ias_opt->irda_class_name); 2235 if(ias_obj == (struct ias_object *) NULL) { 2236 kfree(ias_opt); 2237 return -EINVAL; 2238 } 2239 2240 /* Find the attribute (in the object) we target */ 2241 ias_attr = irias_find_attrib(ias_obj, 2242 ias_opt->irda_attrib_name); 2243 if(ias_attr == (struct ias_attrib *) NULL) { 2244 kfree(ias_opt); 2245 return -EINVAL; 2246 } 2247 2248 /* Translate from internal to user structure */ 2249 err = irda_extract_ias_value(ias_opt, ias_attr->value); 2250 if(err) { 2251 kfree(ias_opt); 2252 return err; 2253 } 2254 2255 /* Copy reply to the user */ 2256 if (copy_to_user(optval, ias_opt, 2257 sizeof(struct irda_ias_set))) { 2258 kfree(ias_opt); 2259 return -EFAULT; 2260 } 2261 /* Note : don't need to put optlen, we checked it */ 2262 kfree(ias_opt); 2263 break; 2264 case IRLMP_IAS_QUERY: 2265 /* The user want an object from a remote IAS database. 2266 * We need to use IAP to query the remote database and 2267 * then wait for the answer to come back. */ 2268 2269 /* Check that the user has allocated the right space for us */ 2270 if (len != sizeof(struct irda_ias_set)) 2271 return -EINVAL; 2272 2273 ias_opt = kmalloc(sizeof(struct irda_ias_set), GFP_ATOMIC); 2274 if (ias_opt == NULL) 2275 return -ENOMEM; 2276 2277 /* Copy query to the driver. */ 2278 if (copy_from_user(ias_opt, optval, len)) { 2279 kfree(ias_opt); 2280 return -EFAULT; 2281 } 2282 2283 /* At this point, there are two cases... 2284 * 1) the socket is connected - that's the easy case, we 2285 * just query the device we are connected to... 2286 * 2) the socket is not connected - the user doesn't want 2287 * to connect and/or may not have a valid service name 2288 * (so can't create a fake connection). In this case, 2289 * we assume that the user pass us a valid destination 2290 * address in the requesting structure... 2291 */ 2292 if(self->daddr != DEV_ADDR_ANY) { 2293 /* We are connected - reuse known daddr */ 2294 daddr = self->daddr; 2295 } else { 2296 /* We are not connected, we must specify a valid 2297 * destination address */ 2298 daddr = ias_opt->daddr; 2299 if((!daddr) || (daddr == DEV_ADDR_ANY)) { 2300 kfree(ias_opt); 2301 return -EINVAL; 2302 } 2303 } 2304 2305 /* Check that we can proceed with IAP */ 2306 if (self->iriap) { 2307 IRDA_WARNING("%s: busy with a previous query\n", 2308 __FUNCTION__); 2309 kfree(ias_opt); 2310 return -EBUSY; 2311 } 2312 2313 self->iriap = iriap_open(LSAP_ANY, IAS_CLIENT, self, 2314 irda_getvalue_confirm); 2315 2316 if (self->iriap == NULL) { 2317 kfree(ias_opt); 2318 return -ENOMEM; 2319 } 2320 2321 /* Treat unexpected wakeup as disconnect */ 2322 self->errno = -EHOSTUNREACH; 2323 2324 /* Query remote LM-IAS */ 2325 iriap_getvaluebyclass_request(self->iriap, 2326 self->saddr, daddr, 2327 ias_opt->irda_class_name, 2328 ias_opt->irda_attrib_name); 2329 2330 /* Wait for answer, if not yet finished (or failed) */ 2331 if (wait_event_interruptible(self->query_wait, 2332 (self->iriap == NULL))) { 2333 /* pending request uses copy of ias_opt-content 2334 * we can free it regardless! */ 2335 kfree(ias_opt); 2336 /* Treat signals as disconnect */ 2337 return -EHOSTUNREACH; 2338 } 2339 2340 /* Check what happened */ 2341 if (self->errno) 2342 { 2343 kfree(ias_opt); 2344 /* Requested object/attribute doesn't exist */ 2345 if((self->errno == IAS_CLASS_UNKNOWN) || 2346 (self->errno == IAS_ATTRIB_UNKNOWN)) 2347 return (-EADDRNOTAVAIL); 2348 else 2349 return (-EHOSTUNREACH); 2350 } 2351 2352 /* Translate from internal to user structure */ 2353 err = irda_extract_ias_value(ias_opt, self->ias_result); 2354 if (self->ias_result) 2355 irias_delete_value(self->ias_result); 2356 if (err) { 2357 kfree(ias_opt); 2358 return err; 2359 } 2360 2361 /* Copy reply to the user */ 2362 if (copy_to_user(optval, ias_opt, 2363 sizeof(struct irda_ias_set))) { 2364 kfree(ias_opt); 2365 return -EFAULT; 2366 } 2367 /* Note : don't need to put optlen, we checked it */ 2368 kfree(ias_opt); 2369 break; 2370 case IRLMP_WAITDEVICE: 2371 /* This function is just another way of seeing life ;-) 2372 * IRLMP_ENUMDEVICES assumes that you have a static network, 2373 * and that you just want to pick one of the devices present. 2374 * On the other hand, in here we assume that no device is 2375 * present and that at some point in the future a device will 2376 * come into range. When this device arrive, we just wake 2377 * up the caller, so that he has time to connect to it before 2378 * the device goes away... 2379 * Note : once the node has been discovered for more than a 2380 * few second, it won't trigger this function, unless it 2381 * goes away and come back changes its hint bits (so we 2382 * might call it IRLMP_WAITNEWDEVICE). 2383 */ 2384 2385 /* Check that the user is passing us an int */ 2386 if (len != sizeof(int)) 2387 return -EINVAL; 2388 /* Get timeout in ms (max time we block the caller) */ 2389 if (get_user(val, (int __user *)optval)) 2390 return -EFAULT; 2391 2392 /* Tell IrLMP we want to be notified */ 2393 irlmp_update_client(self->ckey, self->mask.word, 2394 irda_selective_discovery_indication, 2395 NULL, (void *) self); 2396 2397 /* Do some discovery (and also return cached results) */ 2398 irlmp_discovery_request(self->nslots); 2399 2400 /* Wait until a node is discovered */ 2401 if (!self->cachedaddr) { 2402 int ret = 0; 2403 2404 IRDA_DEBUG(1, "%s(), nothing discovered yet, going to sleep...\n", __FUNCTION__); 2405 2406 /* Set watchdog timer to expire in <val> ms. */ 2407 self->errno = 0; 2408 init_timer(&self->watchdog); 2409 self->watchdog.function = irda_discovery_timeout; 2410 self->watchdog.data = (unsigned long) self; 2411 self->watchdog.expires = jiffies + (val * HZ/1000); 2412 add_timer(&(self->watchdog)); 2413 2414 /* Wait for IR-LMP to call us back */ 2415 __wait_event_interruptible(self->query_wait, 2416 (self->cachedaddr != 0 || self->errno == -ETIME), 2417 ret); 2418 2419 /* If watchdog is still activated, kill it! */ 2420 if(timer_pending(&(self->watchdog))) 2421 del_timer(&(self->watchdog)); 2422 2423 IRDA_DEBUG(1, "%s(), ...waking up !\n", __FUNCTION__); 2424 2425 if (ret != 0) 2426 return ret; 2427 } 2428 else 2429 IRDA_DEBUG(1, "%s(), found immediately !\n", 2430 __FUNCTION__); 2431 2432 /* Tell IrLMP that we have been notified */ 2433 irlmp_update_client(self->ckey, self->mask.word, 2434 NULL, NULL, NULL); 2435 2436 /* Check if the we got some results */ 2437 if (!self->cachedaddr) 2438 return -EAGAIN; /* Didn't find any devices */ 2439 daddr = self->cachedaddr; 2440 /* Cleanup */ 2441 self->cachedaddr = 0; 2442 2443 /* We return the daddr of the device that trigger the 2444 * wakeup. As irlmp pass us only the new devices, we 2445 * are sure that it's not an old device. 2446 * If the user want more details, he should query 2447 * the whole discovery log and pick one device... 2448 */ 2449 if (put_user(daddr, (int __user *)optval)) 2450 return -EFAULT; 2451 2452 break; 2453 default: 2454 return -ENOPROTOOPT; 2455 } 2456 2457 return 0; 2458} 2459 2460static struct net_proto_family irda_family_ops = { 2461 .family = PF_IRDA, 2462 .create = irda_create, 2463 .owner = THIS_MODULE, 2464}; 2465 2466static struct proto_ops SOCKOPS_WRAPPED(irda_stream_ops) = { 2467 .family = PF_IRDA, 2468 .owner = THIS_MODULE, 2469 .release = irda_release, 2470 .bind = irda_bind, 2471 .connect = irda_connect, 2472 .socketpair = sock_no_socketpair, 2473 .accept = irda_accept, 2474 .getname = irda_getname, 2475 .poll = irda_poll, 2476 .ioctl = irda_ioctl, 2477 .listen = irda_listen, 2478 .shutdown = irda_shutdown, 2479 .setsockopt = irda_setsockopt, 2480 .getsockopt = irda_getsockopt, 2481 .sendmsg = irda_sendmsg, 2482 .recvmsg = irda_recvmsg_stream, 2483 .mmap = sock_no_mmap, 2484 .sendpage = sock_no_sendpage, 2485}; 2486 2487static struct proto_ops SOCKOPS_WRAPPED(irda_seqpacket_ops) = { 2488 .family = PF_IRDA, 2489 .owner = THIS_MODULE, 2490 .release = irda_release, 2491 .bind = irda_bind, 2492 .connect = irda_connect, 2493 .socketpair = sock_no_socketpair, 2494 .accept = irda_accept, 2495 .getname = irda_getname, 2496 .poll = datagram_poll, 2497 .ioctl = irda_ioctl, 2498 .listen = irda_listen, 2499 .shutdown = irda_shutdown, 2500 .setsockopt = irda_setsockopt, 2501 .getsockopt = irda_getsockopt, 2502 .sendmsg = irda_sendmsg, 2503 .recvmsg = irda_recvmsg_dgram, 2504 .mmap = sock_no_mmap, 2505 .sendpage = sock_no_sendpage, 2506}; 2507 2508static struct proto_ops SOCKOPS_WRAPPED(irda_dgram_ops) = { 2509 .family = PF_IRDA, 2510 .owner = THIS_MODULE, 2511 .release = irda_release, 2512 .bind = irda_bind, 2513 .connect = irda_connect, 2514 .socketpair = sock_no_socketpair, 2515 .accept = irda_accept, 2516 .getname = irda_getname, 2517 .poll = datagram_poll, 2518 .ioctl = irda_ioctl, 2519 .listen = irda_listen, 2520 .shutdown = irda_shutdown, 2521 .setsockopt = irda_setsockopt, 2522 .getsockopt = irda_getsockopt, 2523 .sendmsg = irda_sendmsg_dgram, 2524 .recvmsg = irda_recvmsg_dgram, 2525 .mmap = sock_no_mmap, 2526 .sendpage = sock_no_sendpage, 2527}; 2528 2529#ifdef CONFIG_IRDA_ULTRA 2530static struct proto_ops SOCKOPS_WRAPPED(irda_ultra_ops) = { 2531 .family = PF_IRDA, 2532 .owner = THIS_MODULE, 2533 .release = irda_release, 2534 .bind = irda_bind, 2535 .connect = sock_no_connect, 2536 .socketpair = sock_no_socketpair, 2537 .accept = sock_no_accept, 2538 .getname = irda_getname, 2539 .poll = datagram_poll, 2540 .ioctl = irda_ioctl, 2541 .listen = sock_no_listen, 2542 .shutdown = irda_shutdown, 2543 .setsockopt = irda_setsockopt, 2544 .getsockopt = irda_getsockopt, 2545 .sendmsg = irda_sendmsg_ultra, 2546 .recvmsg = irda_recvmsg_dgram, 2547 .mmap = sock_no_mmap, 2548 .sendpage = sock_no_sendpage, 2549}; 2550#endif /* CONFIG_IRDA_ULTRA */ 2551 2552#include <linux/smp_lock.h> 2553SOCKOPS_WRAP(irda_stream, PF_IRDA); 2554SOCKOPS_WRAP(irda_seqpacket, PF_IRDA); 2555SOCKOPS_WRAP(irda_dgram, PF_IRDA); 2556#ifdef CONFIG_IRDA_ULTRA 2557SOCKOPS_WRAP(irda_ultra, PF_IRDA); 2558#endif /* CONFIG_IRDA_ULTRA */ 2559 2560/* 2561 * Function irsock_init (pro) 2562 * 2563 * Initialize IrDA protocol 2564 * 2565 */ 2566int __init irsock_init(void) 2567{ 2568 int rc = proto_register(&irda_proto, 0); 2569 2570 if (rc == 0) 2571 rc = sock_register(&irda_family_ops); 2572 2573 return rc; 2574} 2575 2576/* 2577 * Function irsock_cleanup (void) 2578 * 2579 * Remove IrDA protocol 2580 * 2581 */ 2582void __exit irsock_cleanup(void) 2583{ 2584 sock_unregister(PF_IRDA); 2585 proto_unregister(&irda_proto); 2586}