more lcp auth changes
This commit is contained in:
parent
98b15d3dd0
commit
6799ee6826
3 changed files with 51 additions and 32 deletions
6
l2tpns.c
6
l2tpns.c
|
|
@ -4,7 +4,7 @@
|
||||||
// Copyright (c) 2002 FireBrick (Andrews & Arnold Ltd / Watchfront Ltd) - GPL licenced
|
// Copyright (c) 2002 FireBrick (Andrews & Arnold Ltd / Watchfront Ltd) - GPL licenced
|
||||||
// vim: sw=8 ts=8
|
// vim: sw=8 ts=8
|
||||||
|
|
||||||
char const *cvs_id_l2tpns = "$Id: l2tpns.c,v 1.98 2005/05/07 11:57:53 bodea Exp $";
|
char const *cvs_id_l2tpns = "$Id: l2tpns.c,v 1.99 2005/05/07 13:12:25 bodea Exp $";
|
||||||
|
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
@ -2186,7 +2186,7 @@ void processudp(uint8_t * buf, int len, struct sockaddr_in *addr)
|
||||||
{
|
{
|
||||||
uint16_t atype = ntohs(*(uint16_t *)b);
|
uint16_t atype = ntohs(*(uint16_t *)b);
|
||||||
LOG(4, s, t, " Proxy Auth Type %d (%s)\n", atype, auth_type(atype));
|
LOG(4, s, t, " Proxy Auth Type %d (%s)\n", atype, auth_type(atype));
|
||||||
if (atype = 2)
|
if (atype == 2)
|
||||||
authtype = AUTHCHAP;
|
authtype = AUTHCHAP;
|
||||||
else if (atype == 3)
|
else if (atype == 3)
|
||||||
authtype = AUTHPAP;
|
authtype = AUTHPAP;
|
||||||
|
|
@ -2357,7 +2357,7 @@ void processudp(uint8_t * buf, int len, struct sockaddr_in *addr)
|
||||||
controlnull(t); // ack
|
controlnull(t); // ack
|
||||||
// proxy authentication type is not supported
|
// proxy authentication type is not supported
|
||||||
if (authtype && !(config->radius_authtypes & authtype))
|
if (authtype && !(config->radius_authtypes & authtype))
|
||||||
initlcp(t, s);
|
sendlcp(t, s, config->radius_authprefer);
|
||||||
break;
|
break;
|
||||||
case 14: // CDN
|
case 14: // CDN
|
||||||
controlnull(t); // ack
|
controlnull(t); // ack
|
||||||
|
|
|
||||||
4
l2tpns.h
4
l2tpns.h
|
|
@ -1,5 +1,5 @@
|
||||||
// L2TPNS Global Stuff
|
// L2TPNS Global Stuff
|
||||||
// $Id: l2tpns.h,v 1.66 2005/05/07 11:57:53 bodea Exp $
|
// $Id: l2tpns.h,v 1.67 2005/05/07 13:12:25 bodea Exp $
|
||||||
|
|
||||||
#ifndef __L2TPNS_H__
|
#ifndef __L2TPNS_H__
|
||||||
#define __L2TPNS_H__
|
#define __L2TPNS_H__
|
||||||
|
|
@ -589,7 +589,7 @@ void processipv6in(tunnelidt t, sessionidt s, uint8_t *p, uint16_t l);
|
||||||
void processccp(tunnelidt t, sessionidt s, uint8_t *p, uint16_t l);
|
void processccp(tunnelidt t, sessionidt s, uint8_t *p, uint16_t l);
|
||||||
void sendchap(tunnelidt t, sessionidt s);
|
void sendchap(tunnelidt t, sessionidt s);
|
||||||
uint8_t *makeppp(uint8_t *b, int size, uint8_t *p, int l, tunnelidt t, sessionidt s, uint16_t mtype);
|
uint8_t *makeppp(uint8_t *b, int size, uint8_t *p, int l, tunnelidt t, sessionidt s, uint16_t mtype);
|
||||||
void initlcp(tunnelidt t, sessionidt s);
|
void sendlcp(tunnelidt t, sessionidt s, int authtype);
|
||||||
void send_ipin(sessionidt s, uint8_t *buf, int len);
|
void send_ipin(sessionidt s, uint8_t *buf, int len);
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
73
ppp.c
73
ppp.c
|
|
@ -1,6 +1,6 @@
|
||||||
// L2TPNS PPP Stuff
|
// L2TPNS PPP Stuff
|
||||||
|
|
||||||
char const *cvs_id_ppp = "$Id: ppp.c,v 1.51 2005/05/07 11:57:53 bodea Exp $";
|
char const *cvs_id_ppp = "$Id: ppp.c,v 1.52 2005/05/07 13:12:26 bodea Exp $";
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
@ -24,6 +24,7 @@ extern time_t time_now;
|
||||||
extern configt *config;
|
extern configt *config;
|
||||||
|
|
||||||
static void initccp(tunnelidt t, sessionidt s);
|
static void initccp(tunnelidt t, sessionidt s);
|
||||||
|
static uint8_t *add_lcp_auth(uint8_t *b, int size, int authtype);
|
||||||
|
|
||||||
// Process PAP messages
|
// Process PAP messages
|
||||||
void processpap(tunnelidt t, sessionidt s, uint8_t *p, uint16_t l)
|
void processpap(tunnelidt t, sessionidt s, uint8_t *p, uint16_t l)
|
||||||
|
|
@ -404,6 +405,7 @@ void processlcp(tunnelidt t, sessionidt s, uint8_t *p, uint16_t l)
|
||||||
{
|
{
|
||||||
int proto = ntohs(*(uint16_t *)(o + 2));
|
int proto = ntohs(*(uint16_t *)(o + 2));
|
||||||
char proto_name[] = "0x0000";
|
char proto_name[] = "0x0000";
|
||||||
|
uint8_t *a;
|
||||||
|
|
||||||
if (proto == PPPPAP)
|
if (proto == PPPPAP)
|
||||||
{
|
{
|
||||||
|
|
@ -436,23 +438,25 @@ void processlcp(tunnelidt t, sessionidt s, uint8_t *p, uint16_t l)
|
||||||
q += 4;
|
q += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((q - b + 5) > sizeof(b)) // 5 is the larger (CHAP+MD5) of the two NAKs
|
a = add_lcp_auth(q, sizeof(b) - (q - b), config->radius_authprefer);
|
||||||
|
if (!a)
|
||||||
{
|
{
|
||||||
LOG(2, s, t, "LCP overflow for %s ConfigNak.\n", proto_name);
|
LOG(2, s, t, "LCP overflow for %s ConfigNak.\n", proto_name);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
*q++ = type;
|
q = a;
|
||||||
if (config->radius_authprefer == AUTHCHAP)
|
|
||||||
|
if (config->radius_authtypes != config->radius_authprefer)
|
||||||
{
|
{
|
||||||
*q++ = 5;
|
a = add_lcp_auth(q, sizeof(b) - (q - b), config->radius_authtypes & ~config->radius_authprefer);
|
||||||
*(uint16_t *) q = htons(PPPCHAP); q += 2;
|
if (!a)
|
||||||
*q++ = 5; // MD5
|
{
|
||||||
}
|
LOG(2, s, t, "LCP overflow for %s ConfigNak.\n", proto_name);
|
||||||
else
|
break;
|
||||||
{
|
}
|
||||||
*q++ = 4;
|
|
||||||
*(uint16_t *) q = htons(PPPPAP); q += 2;
|
q = a;
|
||||||
}
|
}
|
||||||
|
|
||||||
*((uint16_t *) (response + 2)) = htons(q - response); // LCP header length
|
*((uint16_t *) (response + 2)) = htons(q - response); // LCP header length
|
||||||
|
|
@ -505,12 +509,13 @@ void processlcp(tunnelidt t, sessionidt s, uint8_t *p, uint16_t l)
|
||||||
tunnelsend(b, l + (q - b), t);
|
tunnelsend(b, l + (q - b), t);
|
||||||
|
|
||||||
if (!(session[s].flags & SF_LCP_ACKED))
|
if (!(session[s].flags & SF_LCP_ACKED))
|
||||||
initlcp(t, s);
|
sendlcp(t, s, config->radius_authprefer);
|
||||||
}
|
}
|
||||||
else if (*p == ConfigNak)
|
else if (*p == ConfigNak)
|
||||||
{
|
{
|
||||||
LOG(1, s, t, "Remote end sent a ConfigNak. Ignoring\n");
|
LOG(1, s, t, "Remote end sent a ConfigNak. Ignoring\n");
|
||||||
if (config->debug > 3) dumplcp(p, l);
|
if (config->debug > 3) dumplcp(p, l);
|
||||||
|
// FIXME: handle MRU, authentication type
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if (*p == TerminateReq)
|
else if (*p == TerminateReq)
|
||||||
|
|
@ -1195,8 +1200,33 @@ uint8_t *makeppp(uint8_t *b, int size, uint8_t *p, int l, tunnelidt t, sessionid
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send initial LCP ConfigReq for preferred authentication type, set magic no and MRU
|
static uint8_t *add_lcp_auth(uint8_t *b, int size, int authtype)
|
||||||
void initlcp(tunnelidt t, sessionidt s)
|
{
|
||||||
|
if ((authtype == AUTHCHAP && size < 5) || size < 4)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
*b++ = 3; // Authentication-Protocol
|
||||||
|
if (authtype == AUTHCHAP)
|
||||||
|
{
|
||||||
|
*b++ = 5; // length
|
||||||
|
*(uint16_t *) b = htons(PPPCHAP); b += 2;
|
||||||
|
*b++ = 5; // MD5
|
||||||
|
}
|
||||||
|
else if (authtype == AUTHPAP)
|
||||||
|
{
|
||||||
|
*b++ = 4; // length
|
||||||
|
*(uint16_t *) b = htons(PPPPAP); b += 2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOG(0, 0, 0, "add_lcp_auth called with unsupported auth type %d\n", authtype);
|
||||||
|
}
|
||||||
|
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send initial LCP ConfigReq for MRU, authentication type and magic no
|
||||||
|
void sendlcp(tunnelidt t, sessionidt s, int authtype)
|
||||||
{
|
{
|
||||||
char b[500], *q, *l;
|
char b[500], *q, *l;
|
||||||
|
|
||||||
|
|
@ -1216,18 +1246,7 @@ void initlcp(tunnelidt t, sessionidt s)
|
||||||
*l++ = 1; *l++ = 4; // Maximum-Receive-Unit (length 4)
|
*l++ = 1; *l++ = 4; // Maximum-Receive-Unit (length 4)
|
||||||
*(uint16_t *) l = htons(session[s].mru); l += 2;
|
*(uint16_t *) l = htons(session[s].mru); l += 2;
|
||||||
|
|
||||||
*l++ = 3; // Authentication-Protocol
|
l = add_lcp_auth(l, sizeof(b) - (l - b), authtype);
|
||||||
if (config->radius_authprefer == AUTHCHAP)
|
|
||||||
{
|
|
||||||
*l++ = 5; // length
|
|
||||||
*(uint16_t *) l = htons(PPPCHAP); l += 2;
|
|
||||||
*l++ = 5; // MD5
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
*l++ = 4; // length
|
|
||||||
*(uint16_t *) l = htons(PPPPAP); l += 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
*l++ = 5; *l++ = 6; // Magic-Number (length 6)
|
*l++ = 5; *l++ = 6; // Magic-Number (length 6)
|
||||||
*(uint32_t *) l = htonl(session[s].magic);
|
*(uint32_t *) l = htonl(session[s].magic);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue