Changeset 048cd69 in mainline for uspace/srv/net/dhcp/transport.c
- Timestamp:
- 2015-06-07T15:41:04Z (9 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 204ba47
- Parents:
- 4d11204 (diff), c3f7d37 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/dhcp/transport.c
r4d11204 r048cd69 36 36 37 37 #include <bitops.h> 38 #include <errno.h> 38 39 #include <inet/addr.h> 39 40 #include <inet/dnsr.h> … … 41 42 #include <io/log.h> 42 43 #include <loc.h> 43 #include <net/in.h>44 #include <net/inet.h>45 #include <net/socket.h>46 44 #include <stdio.h> 47 45 #include <stdlib.h> … … 67 65 } dhcp_offer_t; 68 66 69 static int dhcp_recv_fibril(void *); 67 static void dhcp_recv_msg(udp_assoc_t *, udp_rmsg_t *); 68 static void dhcp_recv_err(udp_assoc_t *, udp_rerr_t *); 69 static void dhcp_link_state(udp_assoc_t *, udp_link_state_t); 70 71 static udp_cb_t dhcp_transport_cb = { 72 .recv_msg = dhcp_recv_msg, 73 .recv_err = dhcp_recv_err, 74 .link_state = dhcp_link_state 75 }; 70 76 71 77 int dhcp_send(dhcp_transport_t *dt, void *msg, size_t size) 72 78 { 73 struct sockaddr_in addr;79 inet_ep_t ep; 74 80 int rc; 75 81 76 addr.sin_family = AF_INET;77 addr.sin_port = htons(dhcp_server_port);78 addr.sin_addr.s_addr = htonl(addr32_broadcast_all_hosts);82 inet_ep_init(&ep); 83 ep.port = dhcp_server_port; 84 inet_addr_set(addr32_broadcast_all_hosts, &ep.addr); 79 85 80 rc = sendto(dt->fd, msg, size, 0, 81 (struct sockaddr *)&addr, sizeof(addr)); 86 rc = udp_assoc_send_msg(dt->assoc, &ep, msg, size); 82 87 if (rc != EOK) { 83 log_msg(LOG_DEFAULT, LVL_ERROR, " Sending failed");88 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed sending message"); 84 89 return rc; 85 90 } … … 88 93 } 89 94 90 static int dhcp_recv_msg(dhcp_transport_t *dt, void **rmsg, size_t *rsize)95 static void dhcp_recv_msg(udp_assoc_t *assoc, udp_rmsg_t *rmsg) 91 96 { 92 struct sockaddr_in src_addr; 93 socklen_t src_addr_size; 94 size_t recv_size; 97 dhcp_transport_t *dt; 98 size_t s; 95 99 int rc; 96 100 97 if (dt->fd < 0) { 98 /* Terminated */ 99 return EIO; 101 log_msg(LOG_DEFAULT, LVL_NOTE, "dhcp_recv_msg()"); 102 103 dt = (dhcp_transport_t *)udp_assoc_userptr(assoc); 104 s = udp_rmsg_size(rmsg); 105 if (s > MAX_MSG_SIZE) 106 s = MAX_MSG_SIZE; /* XXX */ 107 108 rc = udp_rmsg_read(rmsg, 0, msgbuf, s); 109 if (rc != EOK) { 110 log_msg(LOG_DEFAULT, LVL_ERROR, "Error receiving message."); 111 return; 100 112 } 101 113 102 src_addr_size = sizeof(src_addr); 103 rc = recvfrom(dt->fd, msgbuf, MAX_MSG_SIZE, 0, 104 (struct sockaddr *)&src_addr, &src_addr_size); 105 if (rc < 0) { 106 log_msg(LOG_DEFAULT, LVL_ERROR, "recvfrom failed (%d)", rc); 107 return rc; 108 } 114 log_msg(LOG_DEFAULT, LVL_NOTE, "dhcp_recv_msg() - call recv_cb"); 115 dt->recv_cb(dt->cb_arg, msgbuf, s); 116 } 109 117 110 recv_size = (size_t)rc; 111 *rmsg = msgbuf; 112 *rsize = recv_size; 118 static void dhcp_recv_err(udp_assoc_t *assoc, udp_rerr_t *rerr) 119 { 120 log_msg(LOG_DEFAULT, LVL_WARN, "Ignoring ICMP error"); 121 } 113 122 114 return EOK; 123 static void dhcp_link_state(udp_assoc_t *assoc, udp_link_state_t ls) 124 { 125 log_msg(LOG_DEFAULT, LVL_NOTE, "Link state change"); 115 126 } 116 127 … … 118 129 dhcp_recv_cb_t recv_cb, void *arg) 119 130 { 120 int fd;121 struct sockaddr_in laddr;122 in t fid;131 udp_t *udp = NULL; 132 udp_assoc_t *assoc = NULL; 133 inet_ep2_t epp; 123 134 int rc; 124 135 125 log_msg(LOG_DEFAULT, LVL_DEBUG, "dhcp transport_init()");136 log_msg(LOG_DEFAULT, LVL_DEBUG, "dhcp_transport_init()"); 126 137 127 laddr.sin_family = AF_INET; 128 laddr.sin_port = htons(dhcp_client_port); 129 laddr.sin_addr.s_addr = INADDR_ANY; 138 inet_ep2_init(&epp); 139 epp.local.addr.version = ip_v4; 140 epp.local.port = dhcp_client_port; 141 epp.local_link = link_id; 130 142 131 fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); 132 if (fd < 0) { 133 rc = EIO; 134 goto error; 135 } 136 137 log_msg(LOG_DEFAULT, LVL_DEBUG, "Bind socket."); 138 rc = bind(fd, (struct sockaddr *)&laddr, sizeof(laddr)); 143 rc = udp_create(&udp); 139 144 if (rc != EOK) { 140 145 rc = EIO; … … 142 147 } 143 148 144 log_msg(LOG_DEFAULT, LVL_DEBUG, "Set socket options"); 145 rc = setsockopt(fd, SOL_SOCKET, SO_IPLINK, &link_id, sizeof(link_id)); 149 rc = udp_assoc_create(udp, &epp, &dhcp_transport_cb, dt, &assoc); 146 150 if (rc != EOK) { 147 151 rc = EIO; … … 149 153 } 150 154 151 dt->fd = fd; 155 dt->udp = udp; 156 dt->assoc = assoc; 152 157 dt->recv_cb = recv_cb; 153 158 dt->cb_arg = arg; 154 159 155 fid = fibril_create(dhcp_recv_fibril, dt);156 if (fid == 0) {157 rc = ENOMEM;158 goto error;159 }160 161 dt->recv_fid = fid;162 fibril_add_ready(fid);163 164 160 return EOK; 165 161 error: 166 closesocket(fd); 162 udp_assoc_destroy(assoc); 163 udp_destroy(udp); 167 164 return rc; 168 165 } … … 170 167 void dhcp_transport_fini(dhcp_transport_t *dt) 171 168 { 172 closesocket(dt->fd); 173 dt->fd = -1; 174 } 175 176 static int dhcp_recv_fibril(void *arg) 177 { 178 dhcp_transport_t *dt = (dhcp_transport_t *)arg; 179 void *msg; 180 size_t size = (size_t) -1; 181 int rc; 182 183 while (true) { 184 rc = dhcp_recv_msg(dt, &msg, &size); 185 if (rc != EOK) 186 break; 187 188 assert(size != (size_t) -1); 189 190 dt->recv_cb(dt->cb_arg, msg, size); 191 } 192 193 return EOK; 169 udp_assoc_destroy(dt->assoc); 170 udp_destroy(dt->udp); 194 171 } 195 172
Note:
See TracChangeset
for help on using the changeset viewer.